42#include "llvm/ADT/SmallVector.h"
49 return ParseRHSOfBinaryExpression(LHS,
prec::Comma);
55 return ParseRHSOfBinaryExpression(LHS,
prec::Comma);
59Parser::ParseExpressionWithLeadingExtension(
SourceLocation ExtLoc) {
69 LHS = Actions.ActOnUnaryOp(
getCurScope(), ExtLoc, tok::kw___extension__,
72 return ParseRHSOfBinaryExpression(LHS,
prec::Comma);
77 if (Tok.is(tok::code_completion)) {
79 Actions.CodeCompletion().CodeCompleteExpression(
80 getCurScope(), PreferredType.get(Tok.getLocation()));
84 if (Tok.is(tok::kw_throw))
85 return ParseThrowExpression();
86 if (Tok.is(tok::kw_co_yield))
87 return ParseCoyieldExpression();
91 false, CorrectionBehavior);
96 if (Tok.is(tok::code_completion)) {
98 Actions.CodeCompletion().CodeCompleteExpression(
99 getCurScope(), PreferredType.get(Tok.getLocation()));
110Parser::ParseAssignmentExprWithObjCMessageExprStart(
SourceLocation LBracLoc,
113 Expr *ReceiverExpr) {
115 = ParseObjCMessageExpressionBody(LBracLoc, SuperLoc,
116 ReceiverType, ReceiverExpr);
117 R = ParsePostfixExpressionSuffix(R);
123 assert(Actions.ExprEvalContexts.back().Context ==
125 "Call this function only if your ExpressionEvaluationContext is "
126 "already ConstantEvaluated");
128 CorrectionBehavior));
130 return Actions.ActOnConstantExpression(Res);
149 Actions.ExprEvalContexts.back().InConditionallyConstantEvaluateContext =
true;
163 for (
auto Iter = Actions.ExprEvalContexts.rbegin() + 1;
164 Iter != Actions.ExprEvalContexts.rend(); ++Iter) {
165 if (!Iter->isUnevaluated())
167 Iter->InConditionallyConstantEvaluateContext =
true;
176 Actions.currentEvaluationContext().IsCaseExpr =
true;
182 return Actions.ActOnCaseExpr(CaseLoc, Res);
190 if (Res.
isUsable() && !Actions.CheckConstraintExpression(Res.
get())) {
200 bool NotPrimaryExpression =
false;
201 auto ParsePrimary = [&]() {
205 false, &NotPrimaryExpression);
209 E = ParsePostfixExpressionSuffix(E);
216 ? diag::note_unparenthesized_non_primary_expr_in_requires_clause
217 : diag::err_unparenthesized_non_primary_expr_in_requires_clause)
225 if (NotPrimaryExpression ||
232 Tok.isOneOf(tok::period, tok::plusplus, tok::minusminus) ||
233 (Tok.is(tok::l_square) && !
NextToken().
is(tok::l_square))) {
234 E = RecoverFromNonPrimary(E,
false);
237 NotPrimaryExpression =
false;
239 bool PossibleNonPrimary;
240 bool IsConstraintExpr =
241 Actions.CheckConstraintExpression(E.
get(), Tok, &PossibleNonPrimary,
242 IsTrailingRequiresClause);
243 if (!IsConstraintExpr || PossibleNonPrimary) {
248 if (PossibleNonPrimary)
249 E = RecoverFromNonPrimary(E, !IsConstraintExpr);
257 while (Tok.is(tok::ampamp)) {
264 tok::ampamp, LHS.
get(), RHS.
get());
278 while (Tok.is(tok::pipepipe)) {
286 tok::pipepipe, LHS.
get(), RHS.
get());
295bool Parser::isNotExpressionStart() {
297 if (K == tok::l_brace || K == tok::r_brace ||
298 K == tok::kw_for || K == tok::kw_while ||
299 K == tok::kw_if || K == tok::kw_else ||
300 K == tok::kw_goto || K == tok::kw_try)
303 return isKnownToBeDeclarationSpecifier();
306bool Parser::isFoldOperator(
prec::Level Level)
const {
318 GreaterThanIsOperator,
320 SourceLocation ColonLoc;
322 auto SavedType = PreferredType;
325 PreferredType = SavedType;
329 if (NextTokPrec < MinPrec)
340 if (OpToken.
is(tok::caretcaret)) {
351 UnconsumeToken(OpToken);
352 PP.EnterToken(Caret,
true);
353 return ParseRHSOfBinaryExpression(LHS, MinPrec);
359 if (OpToken.
isOneOf(tok::comma, tok::greater, tok::greatergreater,
360 tok::greatergreatergreater) &&
361 checkPotentialAngleBracketDelimiter(OpToken))
369 if (OpToken.
is(tok::comma) && isNotExpressionStart()) {
370 PP.EnterToken(Tok,
true);
377 if (isFoldOperator(NextTokPrec) && Tok.is(tok::ellipsis)) {
380 PP.EnterToken(Tok,
true);
391 Tok.isOneOf(tok::colon, tok::r_square) &&
393 PP.EnterToken(Tok,
true);
403 SourceLocation BraceLoc = Tok.getLocation();
404 TernaryMiddle = ParseBraceInitializer();
405 if (!TernaryMiddle.isInvalid()) {
406 Diag(BraceLoc, diag::err_init_list_bin_op)
407 << 1 << PP.getSpelling(OpToken)
408 << Actions.getExprRange(TernaryMiddle.get());
411 }
else if (Tok.isNot(tok::colon)) {
423 TernaryMiddle =
nullptr;
424 Diag(Tok, diag::ext_gnu_conditional_expr);
427 if (TernaryMiddle.isInvalid()) {
429 TernaryMiddle =
nullptr;
437 SourceLocation FILoc = Tok.getLocation();
438 const char *FIText =
": ";
439 const SourceManager &
SM = PP.getSourceManager();
440 if (FILoc.
isFileID() || PP.isAtStartOfMacroExpansion(FILoc, &FILoc)) {
442 bool IsInvalid =
false;
443 const char *SourcePtr =
445 if (!IsInvalid && *SourcePtr ==
' ') {
448 if (!IsInvalid && *SourcePtr ==
' ') {
455 Diag(Tok, diag::err_expected)
457 Diag(OpToken, diag::note_matching) << tok::question;
458 ColonLoc = Tok.getLocation();
462 PreferredType.enterBinary(Actions, Tok.getLocation(), LHS.
get(),
475 bool RHSIsInitList =
false;
477 RHS = ParseBraceInitializer();
478 RHSIsInitList =
true;
500 if (ThisPrec < NextTokPrec ||
501 (ThisPrec == NextTokPrec && isRightAssoc)) {
503 Diag(Tok, diag::err_init_list_bin_op)
504 << 0 << PP.getSpelling(Tok) << Actions.getExprRange(RHS.
get());
512 RHS = ParseRHSOfBinaryExpression(RHS,
513 static_cast<prec::Level>(ThisPrec + !isRightAssoc));
514 RHSIsInitList =
false;
526 Diag(OpToken, diag::warn_cxx98_compat_generalized_initializer_lists)
527 << Actions.getExprRange(RHS.
get());
528 }
else if (ColonLoc.
isValid()) {
529 Diag(ColonLoc, diag::err_init_list_bin_op)
531 << Actions.getExprRange(RHS.
get());
534 Diag(OpToken, diag::err_init_list_bin_op)
535 << 1 << PP.getSpelling(OpToken)
536 << Actions.getExprRange(RHS.
get());
543 if (TernaryMiddle.isInvalid()) {
547 if (!GreaterThanIsOperator && OpToken.
is(tok::greatergreater))
549 diag::warn_cxx11_right_shift_in_template_arg,
550 SourceRange(Actions.getExprRange(LHS.
get()).getBegin(),
551 Actions.getExprRange(RHS.
get()).getEnd()));
559 {LHS.get(), RHS.get()});
563 ExprResult CondOp = Actions.ActOnConditionalOp(
567 std::vector<clang::Expr *> Args;
569 if (TernaryMiddle.get())
570 Args = {LHS.
get(), TernaryMiddle.get(), RHS.
get()};
572 Args = {LHS.
get(), RHS.
get()};
584Parser::ParseCastExpression(
CastParseKind ParseKind,
bool isAddressOfOperand,
586 bool isVectorLiteral,
bool *NotPrimaryExpression) {
588 ExprResult Res = ParseCastExpression(ParseKind, isAddressOfOperand,
589 NotCastExpr, CorrectionBehavior,
590 isVectorLiteral, NotPrimaryExpression);
592 Diag(Tok, diag::err_expected_expression);
599 CastExpressionIdValidator(Token
Next,
602 WantTypeSpecifiers = WantFunctionLikeCasts =
603 (CorrectionBehavior != TypoCorrectionTypeBehavior::AllowNonTypes);
605 (CorrectionBehavior != TypoCorrectionTypeBehavior::AllowTypes);
608 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
614 return WantTypeSpecifiers;
619 if (!NextToken.isOneOf(tok::equal, tok::arrow, tok::period))
622 for (
auto *
C : candidate) {
630 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
631 return std::make_unique<CastExpressionIdValidator>(*
this);
642 if (RevertibleTypeTraits.empty()) {
646#define RTT_JOIN(X, Y) X##Y
647#define REVERTIBLE_TYPE_TRAIT(Name) \
648 RevertibleTypeTraits[PP.getIdentifierInfo(#Name)] = RTT_JOIN(tok::kw_, Name)
705#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) \
706 REVERTIBLE_TYPE_TRAIT(RTT_JOIN(__, Trait));
707#include "clang/Basic/TransformTypeTraits.def"
708#undef REVERTIBLE_TYPE_TRAIT
711 llvm::SmallDenseMap<IdentifierInfo *, tok::TokenKind>::iterator Known =
712 RevertibleTypeTraits.find(II);
713 if (Known != RevertibleTypeTraits.end()) {
715 *
Kind = Known->second;
721ExprResult Parser::ParseBuiltinPtrauthTypeDiscriminator() {
725 if (T.expectAndConsume())
734 SourceLocation EndLoc = Tok.getLocation();
736 return Actions.ActOnUnaryExprOrTypeTraitExpr(
737 Loc, UETT_PtrAuthTypeDiscriminator,
742Parser::ParseCastExpression(
CastParseKind ParseKind,
bool isAddressOfOperand,
745 bool isVectorLiteral,
bool *NotPrimaryExpression) {
748 auto SavedType = PreferredType;
754 bool AllowSuffix =
true;
783 SourceLocation RParenLoc;
784 Res = ParseParenExpression(ParenExprType,
false,
794 switch (ParenExprType) {
817 case tok::numeric_constant:
818 case tok::binary_data:
822 Res = Actions.ActOnNumericConstant(Tok,
getCurScope());
828 Res = ParseCXXBoolLiteral();
831 case tok::kw___objc_yes:
832 case tok::kw___objc_no:
833 Res = ParseObjCBoolLiteral();
836 case tok::kw_nullptr:
838 Diag(Tok, diag::warn_cxx98_compat_nullptr);
841 : diag::ext_c_nullptr) << Tok.getName();
846 case tok::annot_primary_expr:
847 case tok::annot_overload_set:
848 Res = getExprAnnotation(Tok);
849 if (!Res.
isInvalid() && Tok.getKind() == tok::annot_overload_set)
850 Res = Actions.ActOnNameClassifiedAsOverloadSet(
getCurScope(), Res.
get());
851 ConsumeAnnotationToken();
852 if (!Res.
isInvalid() && Tok.is(tok::less))
853 checkPotentialAngleBracket(Res);
856 case tok::annot_non_type:
857 case tok::annot_non_type_dependent:
858 case tok::annot_non_type_undeclared: {
861 Res = tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement);
863 "should not perform typo correction on annotation token");
867 case tok::annot_embed: {
869 return ParseCastExpression(ParseKind, isAddressOfOperand,
870 CorrectionBehavior, isVectorLiteral,
871 NotPrimaryExpression);
874 case tok::kw___super:
875 case tok::kw_decltype:
879 assert(Tok.isNot(tok::kw_decltype) && Tok.isNot(tok::kw___super));
880 return ParseCastExpression(ParseKind, isAddressOfOperand,
881 CorrectionBehavior, isVectorLiteral,
882 NotPrimaryExpression);
884 case tok::identifier:
895 if (
Next.is(tok::ellipsis) && Tok.is(tok::identifier) &&
901 Tok.isOneOf(tok::annot_pack_indexing_type, tok::annot_cxxscope))
902 return ParseCastExpression(ParseKind, isAddressOfOperand,
903 CorrectionBehavior, isVectorLiteral,
904 NotPrimaryExpression);
910 else if (
Next.is(tok::l_paren) && Tok.is(tok::identifier) &&
911 Tok.getIdentifierInfo()->hasRevertedTokenIDToIdentifier()) {
912 IdentifierInfo *II = Tok.getIdentifierInfo();
914 if (isRevertibleTypeTrait(II, &Kind)) {
916 return ParseCastExpression(ParseKind, isAddressOfOperand, NotCastExpr,
917 CorrectionBehavior, isVectorLiteral,
918 NotPrimaryExpression);
922 else if ((!ColonIsSacred &&
Next.is(tok::colon)) ||
923 Next.isOneOf(tok::coloncolon, tok::less, tok::l_paren,
928 if (!Tok.is(tok::identifier))
929 return ParseCastExpression(ParseKind, isAddressOfOperand, NotCastExpr,
930 CorrectionBehavior, isVectorLiteral,
931 NotPrimaryExpression);
937 IdentifierInfo &II = *Tok.getIdentifierInfo();
944 (&II == Ident_super &&
getCurScope()->isInObjcMethodScope()))) {
947 if (Tok.is(tok::code_completion) && &II != Ident_super) {
949 Actions.CodeCompletion().CodeCompleteObjCClassPropertyRefExpr(
950 getCurScope(), II, ILoc, ExprStatementTokLoc == ILoc);
954 if (Tok.isNot(tok::identifier) &&
956 Diag(Tok, diag::err_expected_property_name);
959 IdentifierInfo &PropertyName = *Tok.getIdentifierInfo();
962 Res = Actions.ObjC().ActOnClassPropertyRefExpr(II, PropertyName, ILoc,
971 if (
getLangOpts().
ObjC && &II == Ident_super && !InMessageExpression &&
973 ((Tok.is(tok::identifier) &&
975 Tok.is(tok::code_completion))) {
976 Res = ParseObjCMessageExpressionBody(SourceLocation(), ILoc,
nullptr,
987 ((Tok.is(tok::identifier) && !InMessageExpression) ||
988 Tok.is(tok::code_completion))) {
990 if (Tok.is(tok::code_completion) ||
991 Next.is(tok::colon) ||
Next.is(tok::r_square))
993 if (Typ.get()->isObjCObjectOrInterfaceType()) {
995 DeclSpec DS(AttrFactory);
996 DS.SetRangeStart(ILoc);
997 DS.SetRangeEnd(ILoc);
998 const char *PrevSpec =
nullptr;
1000 DS.SetTypeSpecType(
TST_typename, ILoc, PrevSpec, DiagID, Typ,
1001 Actions.getASTContext().getPrintingPolicy());
1005 TypeResult Ty = Actions.ActOnTypeName(DeclaratorInfo);
1009 Res = ParseObjCMessageExpressionBody(SourceLocation(),
1017 if (isAddressOfOperand && isPostfixExpressionSuffixStart())
1018 isAddressOfOperand =
false;
1024 CXXScopeSpec ScopeSpec;
1025 SourceLocation TemplateKWLoc;
1027 CastExpressionIdValidator Validator(Tok, CorrectionBehavior);
1028 Validator.IsAddressOfOperand = isAddressOfOperand;
1029 if (Tok.isOneOf(tok::periodstar, tok::arrowstar)) {
1030 Validator.WantExpressionKeywords =
false;
1031 Validator.WantRemainingKeywords =
false;
1033 Validator.WantRemainingKeywords = Tok.isNot(tok::r_paren);
1036 Res = Actions.ActOnIdExpression(
1037 getCurScope(), ScopeSpec, TemplateKWLoc, Name, Tok.is(tok::l_paren),
1038 isAddressOfOperand, &Validator,
1040 Tok.is(tok::r_paren) ?
nullptr : &Replacement);
1042 UnconsumeToken(Replacement);
1043 return ParseCastExpression(
1044 ParseKind, isAddressOfOperand, NotCastExpr, CorrectionBehavior,
1045 false, NotPrimaryExpression);
1047 Res = tryParseCXXPackIndexingExpression(Res);
1048 if (!Res.
isInvalid() && Tok.is(tok::less))
1049 checkPotentialAngleBracket(Res);
1052 case tok::char_constant:
1053 case tok::wide_char_constant:
1054 case tok::utf8_char_constant:
1055 case tok::utf16_char_constant:
1056 case tok::utf32_char_constant:
1057 Res = Actions.ActOnCharacterConstant(Tok,
getCurScope());
1060 case tok::kw___func__:
1061 case tok::kw___FUNCTION__:
1062 case tok::kw___FUNCDNAME__:
1063 case tok::kw___FUNCSIG__:
1064 case tok::kw_L__FUNCTION__:
1065 case tok::kw_L__FUNCSIG__:
1066 case tok::kw___PRETTY_FUNCTION__:
1073 Res = Actions.ActOnPredefinedExpr(Tok.getLocation(), SavedKind);
1078 case tok::string_literal:
1079 case tok::wide_string_literal:
1080 case tok::utf8_string_literal:
1081 case tok::utf16_string_literal:
1082 case tok::utf32_string_literal:
1085 case tok::kw__Generic:
1086 Res = ParseGenericSelectionExpression();
1088 case tok::kw___builtin_available:
1089 Res = ParseAvailabilityCheckExpr(Tok.getLocation());
1091 case tok::kw___builtin_va_arg:
1092 case tok::kw___builtin_offsetof:
1093 case tok::kw___builtin_choose_expr:
1094 case tok::kw___builtin_astype:
1095 case tok::kw___builtin_convertvector:
1096 case tok::kw___builtin_COLUMN:
1097 case tok::kw___builtin_FILE:
1098 case tok::kw___builtin_FILE_NAME:
1099 case tok::kw___builtin_FUNCTION:
1100 case tok::kw___builtin_FUNCSIG:
1101 case tok::kw___builtin_LINE:
1102 case tok::kw___builtin_source_location:
1103 if (NotPrimaryExpression)
1104 *NotPrimaryExpression =
true;
1106 return ParseBuiltinPrimaryExpression();
1107 case tok::kw___null:
1112 case tok::minusminus: {
1113 if (NotPrimaryExpression)
1114 *NotPrimaryExpression =
true;
1119 Token SavedTok = Tok;
1122 PreferredType.enterUnary(Actions, Tok.getLocation(), SavedTok.
getKind(),
1136 UnconsumeToken(SavedTok);
1140 Expr *Arg = Res.
get();
1144 Res = Actions.CreateRecoveryExpr(SavedTok.
getLocation(),
1150 if (NotPrimaryExpression)
1151 *NotPrimaryExpression =
true;
1154 PreferredType.enterUnary(Actions, Tok.getLocation(), tok::amp, SavedLoc);
1159 Expr *Arg = Res.
get();
1160 Res = Actions.ActOnUnaryOp(
getCurScope(), SavedLoc, SavedKind, Arg);
1162 Res = Actions.CreateRecoveryExpr(Tok.getLocation(), Arg->
getEndLoc(),
1173 case tok::kw___real:
1174 case tok::kw___imag: {
1175 if (NotPrimaryExpression)
1176 *NotPrimaryExpression =
true;
1178 PreferredType.enterUnary(Actions, Tok.getLocation(), SavedKind, SavedLoc);
1181 Expr *Arg = Res.
get();
1182 Res = Actions.ActOnUnaryOp(
getCurScope(), SavedLoc, SavedKind, Arg,
1183 isAddressOfOperand);
1185 Res = Actions.CreateRecoveryExpr(SavedLoc, Arg->
getEndLoc(), Arg);
1190 case tok::kw_co_await: {
1191 if (NotPrimaryExpression)
1192 *NotPrimaryExpression =
true;
1196 Res = Actions.ActOnCoawaitExpr(
getCurScope(), CoawaitLoc, Res.
get());
1200 case tok::kw___extension__:{
1202 if (NotPrimaryExpression)
1203 *NotPrimaryExpression =
true;
1204 ExtensionRAIIObject O(Diags);
1208 Res = Actions.ActOnUnaryOp(
getCurScope(), SavedLoc, SavedKind, Res.
get());
1211 case tok::kw__Alignof:
1212 diagnoseUseOfC11Keyword(Tok);
1214 case tok::kw_alignof:
1215 case tok::kw___alignof:
1217 case tok::kw_sizeof:
1221 case tok::kw___datasizeof:
1222 case tok::kw_vec_step:
1224 case tok::kw___builtin_omp_required_simd_align:
1225 case tok::kw___builtin_vectorelements:
1226 case tok::kw__Countof:
1227 if (NotPrimaryExpression)
1228 *NotPrimaryExpression =
true;
1229 AllowSuffix =
false;
1230 Res = ParseUnaryExprOrTypeTraitExpression();
1232 case tok::caretcaret: {
1238 if (NotPrimaryExpression)
1239 *NotPrimaryExpression =
true;
1240 AllowSuffix =
false;
1241 Res = ParseCXXReflectExpression();
1245 if (NotPrimaryExpression)
1246 *NotPrimaryExpression =
true;
1248 if (Tok.isNot(tok::identifier))
1249 return ExprError(
Diag(Tok, diag::err_expected) << tok::identifier);
1252 return ExprError(
Diag(Tok, diag::err_address_of_label_outside_fn));
1254 Diag(AmpAmpLoc, diag::ext_gnu_address_of_label);
1255 LabelDecl *LD = Actions.LookupOrCreateLabel(Tok.getIdentifierInfo(),
1257 Res = Actions.ActOnAddrLabel(AmpAmpLoc, Tok.getLocation(), LD);
1259 AllowSuffix =
false;
1262 case tok::kw_const_cast:
1263 case tok::kw_dynamic_cast:
1264 case tok::kw_reinterpret_cast:
1265 case tok::kw_static_cast:
1266 case tok::kw_addrspace_cast:
1267 if (NotPrimaryExpression)
1268 *NotPrimaryExpression =
true;
1269 Res = ParseCXXCasts();
1271 case tok::kw___builtin_bit_cast:
1272 if (NotPrimaryExpression)
1273 *NotPrimaryExpression =
true;
1274 Res = ParseBuiltinBitCast();
1276 case tok::kw_typeid:
1277 if (NotPrimaryExpression)
1278 *NotPrimaryExpression =
true;
1279 Res = ParseCXXTypeid();
1281 case tok::kw___uuidof:
1282 if (NotPrimaryExpression)
1283 *NotPrimaryExpression =
true;
1284 Res = ParseCXXUuidof();
1287 Res = ParseCXXThis();
1289 case tok::kw___builtin_sycl_unique_stable_name:
1290 Res = ParseSYCLUniqueStableNameExpression();
1293 case tok::annot_typename:
1294 if (isStartOfObjCClassMessageMissingOpenBracket()) {
1298 DeclSpec DS(AttrFactory);
1299 DS.SetRangeStart(Tok.getLocation());
1300 DS.SetRangeEnd(Tok.getLastLoc());
1302 const char *PrevSpec =
nullptr;
1304 DS.SetTypeSpecType(
TST_typename, Tok.getAnnotationEndLoc(),
1305 PrevSpec, DiagID,
Type,
1306 Actions.getASTContext().getPrintingPolicy());
1310 TypeResult Ty = Actions.ActOnTypeName(DeclaratorInfo);
1314 ConsumeAnnotationToken();
1315 Res = ParseObjCMessageExpressionBody(SourceLocation(), SourceLocation(),
1321 case tok::annot_decltype:
1322 case tok::annot_pack_indexing_type:
1324 case tok::kw_wchar_t:
1325 case tok::kw_char8_t:
1326 case tok::kw_char16_t:
1327 case tok::kw_char32_t:
1332 case tok::kw___int64:
1333 case tok::kw___int128:
1334 case tok::kw__ExtInt:
1335 case tok::kw__BitInt:
1336 case tok::kw_signed:
1337 case tok::kw_unsigned:
1340 case tok::kw_double:
1341 case tok::kw___bf16:
1342 case tok::kw__Float16:
1343 case tok::kw___float128:
1344 case tok::kw___ibm128:
1347 case tok::kw_typename:
1348 case tok::kw_typeof:
1349 case tok::kw___vector:
1350 case tok::kw__Accum:
1351 case tok::kw__Fract:
1353#define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t:
1354#include "clang/Basic/OpenCLImageTypes.def"
1355#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case tok::kw_##Name:
1356#include "clang/Basic/HLSLIntangibleTypes.def"
1359 Diag(Tok, diag::err_expected_expression);
1364 if (NotPrimaryExpression)
1365 *NotPrimaryExpression =
true;
1367 if (SavedKind == tok::kw_typename) {
1382 DeclSpec DS(AttrFactory);
1384 ParseCXXSimpleTypeSpecifier(DS);
1385 if (Tok.isNot(tok::l_paren) &&
1387 return ExprError(
Diag(Tok, diag::err_expected_lparen_after_type)
1388 << DS.getSourceRange());
1390 if (Tok.is(tok::l_brace))
1391 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
1393 Res = ParseCXXTypeConstructExpression(DS);
1397 case tok::annot_cxxscope: {
1402 if (!Tok.is(tok::annot_cxxscope))
1403 return ParseCastExpression(ParseKind, isAddressOfOperand, NotCastExpr,
1404 CorrectionBehavior, isVectorLiteral,
1405 NotPrimaryExpression);
1408 if (
Next.is(tok::annot_template_id)) {
1409 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(
Next);
1415 ParseOptionalCXXScopeSpecifier(SS,
nullptr,
1419 return ParseCastExpression(ParseKind, isAddressOfOperand, NotCastExpr,
1420 CorrectionBehavior, isVectorLiteral,
1421 NotPrimaryExpression);
1426 Res = ParseCXXIdExpression(isAddressOfOperand);
1430 case tok::annot_template_id: {
1431 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
1438 return ParseCastExpression(ParseKind, isAddressOfOperand, NotCastExpr,
1439 CorrectionBehavior, isVectorLiteral,
1440 NotPrimaryExpression);
1447 case tok::kw_operator:
1448 Res = ParseCXXIdExpression(isAddressOfOperand);
1451 case tok::coloncolon: {
1456 if (!Tok.is(tok::coloncolon))
1457 return ParseCastExpression(ParseKind, isAddressOfOperand,
1458 CorrectionBehavior, isVectorLiteral,
1459 NotPrimaryExpression);
1464 if (Tok.is(tok::kw_new)) {
1465 if (NotPrimaryExpression)
1466 *NotPrimaryExpression =
true;
1467 Res = ParseCXXNewExpression(
true, CCLoc);
1468 AllowSuffix =
false;
1471 if (Tok.is(tok::kw_delete)) {
1472 if (NotPrimaryExpression)
1473 *NotPrimaryExpression =
true;
1474 Res = ParseCXXDeleteExpression(
true, CCLoc);
1475 AllowSuffix =
false;
1480 Diag(CCLoc, diag::err_expected_expression);
1485 if (NotPrimaryExpression)
1486 *NotPrimaryExpression =
true;
1487 Res = ParseCXXNewExpression(
false, Tok.getLocation());
1488 AllowSuffix =
false;
1491 case tok::kw_delete:
1492 if (NotPrimaryExpression)
1493 *NotPrimaryExpression =
true;
1494 Res = ParseCXXDeleteExpression(
false, Tok.getLocation());
1495 AllowSuffix =
false;
1498 case tok::kw_requires:
1499 Res = ParseRequiresExpression();
1500 AllowSuffix =
false;
1503 case tok::kw_noexcept: {
1504 if (NotPrimaryExpression)
1505 *NotPrimaryExpression =
true;
1506 Diag(Tok, diag::warn_cxx98_compat_noexcept_expr);
1510 if (T.expectAndConsume(diag::err_expected_lparen_after,
"noexcept"))
1522 Res = Actions.ActOnNoexceptExpr(KeyLoc, T.getOpenLocation(), Res.
get(),
1523 T.getCloseLocation());
1524 AllowSuffix =
false;
1528#define TYPE_TRAIT(N,Spelling,K) \
1529 case tok::kw_##Spelling:
1530#include "clang/Basic/TokenKinds.def"
1531 Res = ParseTypeTrait();
1534 case tok::kw___array_rank:
1535 case tok::kw___array_extent:
1536 if (NotPrimaryExpression)
1537 *NotPrimaryExpression =
true;
1538 Res = ParseArrayTypeTrait();
1541 case tok::kw___builtin_ptrauth_type_discriminator:
1542 return ParseBuiltinPtrauthTypeDiscriminator();
1544 case tok::kw___is_lvalue_expr:
1545 case tok::kw___is_rvalue_expr:
1546 if (NotPrimaryExpression)
1547 *NotPrimaryExpression =
true;
1548 Res = ParseExpressionTrait();
1552 if (NotPrimaryExpression)
1553 *NotPrimaryExpression =
true;
1555 return ParseObjCAtExpression(AtLoc);
1558 Res = ParseBlockLiteralExpression();
1560 case tok::code_completion: {
1562 Actions.CodeCompletion().CodeCompleteExpression(
1563 getCurScope(), PreferredType.get(Tok.getLocation()),
1564 false, isAddressOfOperand);
1567#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
1568#include "clang/Basic/TransformTypeTraits.def"
1572 Tok.setKind(tok::identifier);
1573 Diag(Tok, diag::ext_keyword_as_ident)
1574 << Tok.getIdentifierInfo()->getName() << 0;
1575 goto ParseIdentifier;
1577 goto ExpectedExpression;
1586 Res = TryParseLambdaExpression();
1590 if (NotPrimaryExpression)
1591 *NotPrimaryExpression =
true;
1592 Res = ParseObjCMessageExpression();
1596 Res = ParseLambdaExpression();
1600 Res = ParseObjCMessageExpression();
1625 switch (Tok.getKind()) {
1629 case tok::minusminus:
1632 if (Tok.isAtStartOfLine())
1647 Diag(Tok.getLocation(), diag::err_postfix_after_unary_requires_parens)
1655 PreferredType = SavedType;
1656 Res = ParsePostfixExpressionSuffix(Res);
1658 !
getActions().getOpenCLOptions().isAvailableOption(
1660 if (Expr *PostfixExpr = Res.
get()) {
1661 QualType Ty = PostfixExpr->getType();
1663 Diag(PostfixExpr->getExprLoc(),
1664 diag::err_opencl_taking_function_address_parser);
1673Parser::ParsePostfixExpressionSuffix(
ExprResult LHS) {
1677 auto SavedType = PreferredType;
1680 PreferredType = SavedType;
1681 switch (Tok.getKind()) {
1682 case tok::code_completion:
1683 if (InMessageExpression)
1687 Actions.CodeCompletion().CodeCompletePostfixExpression(
1688 getCurScope(), LHS, PreferredType.get(Tok.getLocation()));
1691 case tok::identifier:
1697 LHS = ParseObjCMessageExpressionBody(SourceLocation(), SourceLocation(),
1698 nullptr, LHS.
get());
1706 case tok::l_square: {
1714 isSimpleObjCMessageExpression())
1719 if (CheckProhibitedCXX11Attribute()) {
1724 Loc = T.getOpenLocation();
1726 SourceLocation ColonLocFirst, ColonLocSecond;
1727 ExprVector ArgExprs;
1728 bool HasError =
false;
1729 PreferredType.enterSubscript(Actions, Tok.getLocation(), LHS.
get());
1735 if ((!
getLangOpts().OpenMP && !AllowOpenACCArraySections) ||
1736 Tok.isNot(tok::colon)) {
1740 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
1741 Idx = ParseBraceInitializer();
1748 ArgExprs.push_back(Idx.
get());
1750 }
else if (Tok.isNot(tok::r_square)) {
1751 if (ParseExpressionList(ArgExprs)) {
1761 if (ArgExprs.size() <= 1 && AllowOpenACCArraySections) {
1763 if (Tok.is(tok::colon)) {
1766 if (Tok.isNot(tok::r_square))
1769 }
else if (ArgExprs.size() <= 1 &&
getLangOpts().OpenMP) {
1771 if (Tok.is(tok::colon)) {
1774 if (Tok.isNot(tok::r_square) &&
1776 ((Tok.isNot(tok::colon) &&
getLangOpts().OpenMP >= 50)))) {
1781 (OMPClauseKind == llvm::omp::Clause::OMPC_to ||
1782 OMPClauseKind == llvm::omp::Clause::OMPC_from) &&
1783 Tok.is(tok::colon)) {
1786 if (Tok.isNot(tok::r_square)) {
1792 SourceLocation RLoc = Tok.getLocation();
1793 if (!LHS.
isInvalid() && !HasError && !Length.isInvalid() &&
1794 !Stride.
isInvalid() && Tok.is(tok::r_square)) {
1800 if (AllowOpenACCArraySections) {
1802 "Stride/second colon not allowed for OpenACC");
1803 LHS = Actions.OpenACC().ActOnArraySectionExpr(
1804 LHS.
get(), Loc, ArgExprs.empty() ?
nullptr : ArgExprs[0],
1805 ColonLocFirst, Length.get(), RLoc);
1807 LHS = Actions.OpenMP().ActOnOMPArraySectionExpr(
1808 LHS.
get(), Loc, ArgExprs.empty() ?
nullptr : ArgExprs[0],
1809 ColonLocFirst, ColonLocSecond, Length.get(), Stride.
get(),
1813 LHS = Actions.ActOnArraySubscriptExpr(
getCurScope(), LHS.
get(), Loc,
1826 case tok::lesslessless: {
1831 Expr *ExecConfig =
nullptr;
1835 if (OpKind == tok::lesslessless) {
1836 ExprVector ExecConfigExprs;
1839 if (ParseSimpleExpressionList(ExecConfigExprs)) {
1843 SourceLocation CloseLoc;
1849 Diag(Tok, diag::err_expected) << tok::greatergreatergreater;
1850 Diag(OpenLoc, diag::note_matching) << tok::lesslessless;
1856 if (ExpectAndConsume(tok::l_paren))
1859 Loc = PrevTokLocation;
1863 ExprResult ECResult = Actions.CUDA().ActOnExecConfigExpr(
1864 getCurScope(), OpenLoc, ExecConfigExprs, CloseLoc);
1868 ExecConfig = ECResult.
get();
1872 Loc = PT.getOpenLocation();
1875 ExprVector ArgExprs;
1876 auto RunSignatureHelp = [&]() -> QualType {
1877 QualType PreferredType =
1878 Actions.CodeCompletion().ProduceCallSignatureHelp(
1879 LHS.
get(), ArgExprs, PT.getOpenLocation());
1880 CalledSignatureHelp =
true;
1881 return PreferredType;
1883 bool ExpressionListIsInvalid =
false;
1884 if (OpKind == tok::l_paren || !LHS.
isInvalid()) {
1885 if (Tok.isNot(tok::r_paren)) {
1886 if ((ExpressionListIsInvalid = ParseExpressionList(ArgExprs, [&] {
1887 PreferredType.enterFunctionArgument(Tok.getLocation(),
1894 if (PP.isCodeCompletionReached() && !CalledSignatureHelp)
1903 }
else if (ExpressionListIsInvalid) {
1904 Expr *
Fn = LHS.
get();
1905 ArgExprs.insert(ArgExprs.begin(), Fn);
1906 LHS = Actions.CreateRecoveryExpr(
Fn->getBeginLoc(), Tok.getLocation(),
1909 }
else if (Tok.isNot(tok::r_paren)) {
1910 bool HadErrors =
false;
1913 for (
auto &E : ArgExprs)
1914 if (E->containsErrors())
1925 Expr *
Fn = LHS.
get();
1926 SourceLocation RParLoc = Tok.getLocation();
1927 LHS = Actions.ActOnCallExpr(
getCurScope(), Fn, Loc, ArgExprs, RParLoc,
1930 ArgExprs.insert(ArgExprs.begin(), Fn);
1932 Actions.CreateRecoveryExpr(
Fn->getBeginLoc(), RParLoc, ArgExprs);
1948 bool MayBePseudoDestructor =
false;
1949 Expr* OrigLHS = !LHS.
isInvalid() ? LHS.
get() :
nullptr;
1951 PreferredType.enterMemAccess(Actions, Tok.getLocation(), OrigLHS);
1954 Expr *
Base = OrigLHS;
1955 const Type* BaseType =
Base->getType().getTypePtrOrNull();
1956 if (BaseType && Tok.is(tok::l_paren) &&
1959 Diag(OpLoc, diag::err_function_is_not_record)
1960 << OpKind <<
Base->getSourceRange()
1962 return ParsePostfixExpressionSuffix(Base);
1965 LHS = Actions.ActOnStartCXXMemberReference(
getCurScope(), Base, OpLoc,
1967 MayBePseudoDestructor);
1972 if (Tok.is(tok::code_completion)) {
1978 ParseOptionalCXXScopeSpecifier(
1980 false, &MayBePseudoDestructor);
1982 ObjectType =
nullptr;
1985 if (Tok.is(tok::code_completion)) {
1987 OpKind == tok::arrow ? tok::period : tok::arrow;
1992 Sema::TentativeAnalysisScope Trap(Actions);
1993 CorrectedLHS = Actions.ActOnStartCXXMemberReference(
1994 getCurScope(), OrigLHS, OpLoc, CorrectedOpKind, ObjectType,
1995 MayBePseudoDestructor);
1999 Expr *CorrectedBase = CorrectedLHS.get();
2001 CorrectedBase =
Base;
2005 Actions.CodeCompletion().CodeCompleteMemberReferenceExpr(
2006 getCurScope(), Base, CorrectedBase, OpLoc, OpKind == tok::arrow,
2007 Base && ExprStatementTokLoc ==
Base->getBeginLoc(),
2008 PreferredType.get(Tok.getLocation()));
2013 if (MayBePseudoDestructor && !LHS.
isInvalid()) {
2014 LHS = ParseCXXPseudoDestructor(LHS.
get(), OpLoc, OpKind, SS,
2026 SourceLocation TemplateKWLoc;
2029 Tok.is(tok::kw_class)) {
2037 IdentifierInfo *Id = Tok.getIdentifierInfo();
2046 false, &TemplateKWLoc, Name)) {
2051 LHS = Actions.ActOnMemberAccessExpr(
getCurScope(), LHS.
get(), OpLoc,
2052 OpKind, SS, TemplateKWLoc, Name,
2053 CurParsedObjCImpl ? CurParsedObjCImpl->Dcl
2056 if (Tok.is(tok::less))
2057 checkPotentialAngleBracket(LHS);
2058 }
else if (OrigLHS && Name.
isValid()) {
2060 LHS = Actions.CreateRecoveryExpr(OrigLHS->
getBeginLoc(),
2066 case tok::minusminus:
2068 Expr *Arg = LHS.
get();
2069 LHS = Actions.ActOnPostfixUnaryOp(
getCurScope(), Tok.getLocation(),
2070 Tok.getKind(), Arg);
2072 LHS = Actions.CreateRecoveryExpr(Arg->
getBeginLoc(),
2073 Tok.getLocation(), Arg);
2082Parser::ParseExprAfterUnaryExprOrTypeTrait(
const Token &OpTok,
2087 assert(OpTok.
isOneOf(tok::kw_typeof, tok::kw_typeof_unqual, tok::kw_sizeof,
2088 tok::kw___datasizeof, tok::kw___alignof, tok::kw_alignof,
2089 tok::kw__Alignof, tok::kw_vec_step,
2090 tok::kw___builtin_omp_required_simd_align,
2091 tok::kw___builtin_vectorelements, tok::kw__Countof) &&
2092 "Not a typeof/sizeof/alignof/vec_step expression!");
2097 if (Tok.isNot(tok::l_paren)) {
2100 if (OpTok.
isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2101 tok::kw_alignof, tok::kw__Alignof)) {
2102 if (isTypeIdUnambiguously()) {
2103 DeclSpec DS(AttrFactory);
2104 ParseSpecifierQualifierList(DS);
2107 ParseDeclarator(DeclaratorInfo);
2109 SourceLocation LParenLoc = PP.getLocForEndOfToken(OpTok.
getLocation());
2110 SourceLocation RParenLoc = PP.getLocForEndOfToken(PrevTokLocation);
2113 diag::err_expected_parentheses_around_typename)
2116 Diag(LParenLoc, diag::err_expected_parentheses_around_typename)
2126 if (OpTok.
isOneOf(tok::kw_typeof, tok::kw_typeof_unqual) &&
2137 if (OpTok.
isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2138 tok::kw_alignof, tok::kw__Alignof, tok::kw__Countof) &&
2139 Tok.isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2140 tok::kw_alignof, tok::kw__Alignof, tok::kw__Countof))
2141 Actions.runWithSufficientStackSpace(Tok.getLocation(), [&] {
2142 Operand = ParseCastExpression(CastParseKind::UnaryExprOnly);
2161 bool ParenKnownToBeNonCast =
2162 OpTok.
isOneOf(tok::kw_typeof, tok::kw_typeof_unqual);
2164 SourceLocation LParenLoc = Tok.getLocation(), RParenLoc;
2166 Operand = ParseParenExpression(
2171 CastRange = SourceRange(LParenLoc, RParenLoc);
2181 !OpTok.
isOneOf(tok::kw_typeof, tok::kw_typeof_unqual)) {
2196ExprResult Parser::ParseSYCLUniqueStableNameExpression() {
2197 assert(Tok.is(tok::kw___builtin_sycl_unique_stable_name) &&
2198 "Not __builtin_sycl_unique_stable_name");
2204 if (T.expectAndConsume(diag::err_expected_lparen_after,
2205 "__builtin_sycl_unique_stable_name"))
2215 if (T.consumeClose())
2218 return Actions.SYCL().ActOnUniqueStableNameExpr(
2219 OpLoc, T.getOpenLocation(), T.getCloseLocation(), Ty.
get());
2222ExprResult Parser::ParseUnaryExprOrTypeTraitExpression() {
2223 assert(Tok.isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2224 tok::kw_alignof, tok::kw__Alignof, tok::kw_vec_step,
2225 tok::kw___builtin_omp_required_simd_align,
2226 tok::kw___builtin_vectorelements, tok::kw__Countof) &&
2227 "Not a sizeof/alignof/vec_step expression!");
2232 if (Tok.is(tok::ellipsis) && OpTok.
is(tok::kw_sizeof)) {
2234 SourceLocation LParenLoc, RParenLoc;
2235 IdentifierInfo *Name =
nullptr;
2236 SourceLocation NameLoc;
2237 if (Tok.is(tok::l_paren)) {
2240 LParenLoc = T.getOpenLocation();
2241 if (Tok.is(tok::identifier)) {
2242 Name = Tok.getIdentifierInfo();
2245 RParenLoc = T.getCloseLocation();
2247 RParenLoc = PP.getLocForEndOfToken(NameLoc);
2249 Diag(Tok, diag::err_expected_parameter_pack);
2252 }
else if (Tok.is(tok::identifier)) {
2253 Name = Tok.getIdentifierInfo();
2255 LParenLoc = PP.getLocForEndOfToken(EllipsisLoc);
2256 RParenLoc = PP.getLocForEndOfToken(NameLoc);
2257 Diag(LParenLoc, diag::err_paren_sizeof_parameter_pack)
2262 Diag(Tok, diag::err_sizeof_parameter_pack);
2272 return Actions.ActOnSizeofParameterPackExpr(
getCurScope(),
2279 OpTok.
isOneOf(tok::kw_alignof, tok::kw__Alignof))
2280 Diag(OpTok, diag::warn_cxx98_compat_alignof);
2282 Diag(OpTok, diag::warn_c23_compat_keyword) << OpTok.
getName();
2284 Diag(OpTok, diag::warn_c2y_compat_keyword) << OpTok.
getName();
2292 SourceRange CastRange;
2300 case tok::kw_alignof:
2301 case tok::kw__Alignof:
2302 ExprKind = UETT_AlignOf;
2304 case tok::kw___alignof:
2305 ExprKind = UETT_PreferredAlignOf;
2307 case tok::kw_vec_step:
2308 ExprKind = UETT_VecStep;
2310 case tok::kw___builtin_omp_required_simd_align:
2311 ExprKind = UETT_OpenMPRequiredSimdAlign;
2313 case tok::kw___datasizeof:
2314 ExprKind = UETT_DataSizeOf;
2316 case tok::kw___builtin_vectorelements:
2317 ExprKind = UETT_VectorElements;
2319 case tok::kw__Countof:
2320 ExprKind = UETT_CountOf;
2323 Diag(OpTok, diag::ext_c2y_feature) << OpTok.
getName();
2330 return Actions.ActOnUnaryExprOrTypeTraitExpr(OpTok.
getLocation(),
2336 if (OpTok.
isOneOf(tok::kw_alignof, tok::kw__Alignof))
2349ExprResult Parser::ParseBuiltinPrimaryExpression() {
2351 const IdentifierInfo *BuiltinII = Tok.getIdentifierInfo();
2357 if (Tok.isNot(tok::l_paren))
2358 return ExprError(
Diag(Tok, diag::err_expected_after) << BuiltinII
2367 default: llvm_unreachable(
"Not a builtin primary expression!");
2368 case tok::kw___builtin_va_arg: {
2371 if (ExpectAndConsume(tok::comma)) {
2378 if (Tok.isNot(tok::r_paren)) {
2379 Diag(Tok, diag::err_expected) << tok::r_paren;
2386 Res = Actions.ActOnVAArg(StartLoc, Expr.get(), Ty.
get(), ConsumeParen());
2389 case tok::kw___builtin_offsetof: {
2390 SourceLocation TypeLoc = Tok.getLocation();
2392 if (Tok.getLocation().isMacroID()) {
2394 Tok.getLocation(), PP.getSourceManager(),
getLangOpts());
2395 if (MacroName ==
"offsetof")
2408 if (ExpectAndConsume(tok::comma)) {
2414 if (Tok.isNot(tok::identifier)) {
2415 Diag(Tok, diag::err_expected) << tok::identifier;
2421 SmallVector<Sema::OffsetOfComponent, 4> Comps;
2423 Comps.push_back(Sema::OffsetOfComponent());
2424 Comps.back().isBrackets =
false;
2425 Comps.back().U.IdentInfo = Tok.getIdentifierInfo();
2426 Comps.back().LocStart = Comps.back().LocEnd =
ConsumeToken();
2430 if (Tok.is(tok::period)) {
2432 Comps.push_back(Sema::OffsetOfComponent());
2433 Comps.back().isBrackets =
false;
2436 if (Tok.isNot(tok::identifier)) {
2437 Diag(Tok, diag::err_expected) << tok::identifier;
2441 Comps.back().U.IdentInfo = Tok.getIdentifierInfo();
2443 }
else if (Tok.is(tok::l_square)) {
2444 if (CheckProhibitedCXX11Attribute())
2448 Comps.push_back(Sema::OffsetOfComponent());
2449 Comps.back().isBrackets =
true;
2452 Comps.back().LocStart = ST.getOpenLocation();
2458 Comps.back().U.E = Res.
get();
2461 Comps.back().LocEnd = ST.getCloseLocation();
2463 if (Tok.isNot(tok::r_paren)) {
2470 Res = Actions.ActOnBuiltinOffsetOf(
getCurScope(), StartLoc, TypeLoc,
2472 PT.getCloseLocation());
2479 case tok::kw___builtin_choose_expr: {
2481 if (
Cond.isInvalid()) {
2485 if (ExpectAndConsume(tok::comma)) {
2491 if (Expr1.isInvalid()) {
2495 if (ExpectAndConsume(tok::comma)) {
2501 if (Expr2.isInvalid()) {
2505 if (Tok.isNot(tok::r_paren)) {
2506 Diag(Tok, diag::err_expected) << tok::r_paren;
2509 Res = Actions.ActOnChooseExpr(StartLoc,
Cond.get(), Expr1.get(),
2510 Expr2.get(), ConsumeParen());
2513 case tok::kw___builtin_astype: {
2516 if (Expr.isInvalid()) {
2521 if (ExpectAndConsume(tok::comma)) {
2532 if (Tok.isNot(tok::r_paren)) {
2533 Diag(Tok, diag::err_expected) << tok::r_paren;
2538 Res = Actions.ActOnAsTypeExpr(Expr.get(), DestTy.
get(), StartLoc,
2542 case tok::kw___builtin_convertvector: {
2545 if (Expr.isInvalid()) {
2550 if (ExpectAndConsume(tok::comma)) {
2561 if (Tok.isNot(tok::r_paren)) {
2562 Diag(Tok, diag::err_expected) << tok::r_paren;
2567 Res = Actions.ActOnConvertVectorExpr(Expr.get(), DestTy.
get(), StartLoc,
2571 case tok::kw___builtin_COLUMN:
2572 case tok::kw___builtin_FILE:
2573 case tok::kw___builtin_FILE_NAME:
2574 case tok::kw___builtin_FUNCTION:
2575 case tok::kw___builtin_FUNCSIG:
2576 case tok::kw___builtin_LINE:
2577 case tok::kw___builtin_source_location: {
2579 if (Tok.isNot(tok::r_paren)) {
2580 Diag(Tok, diag::err_expected) << tok::r_paren;
2586 case tok::kw___builtin_FILE:
2588 case tok::kw___builtin_FILE_NAME:
2590 case tok::kw___builtin_FUNCTION:
2592 case tok::kw___builtin_FUNCSIG:
2594 case tok::kw___builtin_LINE:
2596 case tok::kw___builtin_COLUMN:
2598 case tok::kw___builtin_source_location:
2601 llvm_unreachable(
"invalid keyword");
2604 Res = Actions.ActOnSourceLocExpr(Kind, StartLoc, ConsumeParen());
2614 return ParsePostfixExpressionSuffix(Res.
get());
2617bool Parser::tryParseOpenMPArrayShapingCastPart() {
2618 assert(Tok.is(tok::l_square) &&
"Expected open bracket");
2619 bool ErrorFound =
true;
2620 TentativeParsingAction TPA(*
this);
2622 if (Tok.isNot(tok::l_square))
2627 while (!
SkipUntil(tok::r_square, tok::annot_pragma_openmp_end,
2630 if (Tok.isNot(tok::r_square))
2635 if (Tok.is(tok::r_paren)) {
2639 }
while (Tok.isNot(tok::annot_pragma_openmp_end));
2645Parser::ParseParenExpression(
ParenParseOption &ExprType,
bool StopIfCastExpr,
2649 assert(Tok.is(tok::l_paren) &&
"Not a paren expr!");
2652 if (T.consumeOpen())
2654 SourceLocation OpenLoc = T.getOpenLocation();
2656 PreferredType.enterParenExpr(Tok.getLocation(), OpenLoc);
2659 bool isAmbiguousTypeId;
2662 if (Tok.is(tok::code_completion)) {
2664 Actions.CodeCompletion().CodeCompleteExpression(
2665 getCurScope(), PreferredType.get(Tok.getLocation()),
2672 Tok.isOneOf(tok::kw___bridge,
2673 tok::kw___bridge_transfer,
2674 tok::kw___bridge_retained,
2675 tok::kw___bridge_retain));
2676 if (BridgeCast && !
getLangOpts().ObjCAutoRefCount) {
2678 StringRef BridgeCastName = Tok.getName();
2680 if (!PP.getSourceManager().isInSystemHeader(BridgeKeywordLoc))
2681 Diag(BridgeKeywordLoc, diag::warn_arc_bridge_cast_nonarc)
2691 Diag(Tok, OpenLoc.
isMacroID() ? diag::ext_gnu_statement_expr_macro
2692 : diag::ext_gnu_statement_expr);
2694 checkCompoundToken(OpenLoc, tok::l_paren, CompoundToken::StmtExprBegin);
2702 DeclContext *CodeDC = Actions.CurContext;
2706 "statement expr not in code context");
2708 Sema::ContextRAII SavedContext(Actions, CodeDC,
false);
2710 Actions.ActOnStartStmtExpr();
2712 StmtResult Stmt(ParseCompoundStatement(
true));
2716 if (!Stmt.isInvalid()) {
2720 Actions.ActOnStmtExprError();
2729 if (tokenKind == tok::kw___bridge)
2731 else if (tokenKind == tok::kw___bridge_transfer)
2733 else if (tokenKind == tok::kw___bridge_retained)
2738 assert(tokenKind == tok::kw___bridge_retain);
2740 if (!PP.getSourceManager().isInSystemHeader(BridgeKeywordLoc))
2741 Diag(BridgeKeywordLoc, diag::err_arc_bridge_retain)
2743 "__bridge_retained");
2748 ColonProtection.restore();
2749 RParenLoc = T.getCloseLocation();
2751 PreferredType.enterTypeCast(Tok.getLocation(), Ty.
get().
get());
2757 return Actions.ObjC().ActOnObjCBridgedCast(
getCurScope(), OpenLoc, Kind,
2758 BridgeKeywordLoc, Ty.
get(),
2759 RParenLoc, SubExpr.
get());
2761 isTypeIdInParens(isAmbiguousTypeId)) {
2770 if (isAmbiguousTypeId && !StopIfCastExpr) {
2771 ExprResult res = ParseCXXAmbiguousParenExpression(ExprType, CastTy, T,
2773 RParenLoc = T.getCloseLocation();
2778 DeclSpec DS(AttrFactory);
2779 ParseSpecifierQualifierList(DS);
2782 ParseDeclarator(DeclaratorInfo);
2787 if (!DeclaratorInfo.isInvalidType() && Tok.is(tok::identifier) &&
2793 Ty = Actions.ActOnTypeName(DeclaratorInfo);
2795 Result = ParseObjCMessageExpressionBody(SourceLocation(),
2801 ColonProtection.restore();
2802 RParenLoc = T.getCloseLocation();
2808 Ty = Actions.ActOnTypeName(DeclaratorInfo);
2810 return ParseCompoundLiteralExpression(Ty.
get(), OpenLoc, RParenLoc);
2820 Ty = Actions.ActOnTypeName(DeclaratorInfo);
2834 Result = ParseCastExpression(
2840 if (!
Result.isInvalid()) {
2842 DeclaratorInfo, CastTy,
2843 RParenLoc,
Result.get());
2847 if (!
Result.isInvalid()) {
2859 if (DeclaratorInfo.isInvalidType())
2864 if (StopIfCastExpr) {
2868 Ty = Actions.ActOnTypeName(DeclaratorInfo);
2876 Tok.getIdentifierInfo() == Ident_super &&
2879 Diag(Tok.getLocation(), diag::err_illegal_super_cast)
2880 << SourceRange(OpenLoc, RParenLoc);
2884 PreferredType.enterTypeCast(Tok.getLocation(), CastTy.
get());
2887 Result = ParseCastExpression(
2891 if (!
Result.isInvalid()) {
2893 DeclaratorInfo, CastTy,
2894 RParenLoc,
Result.get());
2899 Diag(Tok, diag::err_expected_lbrace_in_compound_literal);
2910 ExprVector ArgExprs;
2912 if (!ParseSimpleExpressionList(ArgExprs)) {
2916 isFoldOperator(Tok.getKind()) &&
NextToken().
is(tok::ellipsis)) {
2918 return ParseFoldExpression(ArgExprs[0], T);
2922 Result = Actions.ActOnParenListExpr(OpenLoc, Tok.getLocation(),
2925 }
else if (
getLangOpts().OpenMP >= 50 && OpenMPDirectiveParsing &&
2927 tryParseOpenMPArrayShapingCastPart()) {
2928 bool ErrorFound =
false;
2929 SmallVector<Expr *, 4> OMPDimensions;
2930 SmallVector<SourceRange, 4> OMPBracketsRanges;
2937 while (!
SkipUntil(tok::r_square, tok::r_paren,
2942 OMPDimensions.push_back(NumElements.
get());
2943 OMPBracketsRanges.push_back(TS.getRange());
2944 }
while (Tok.isNot(tok::r_paren));
2947 RParenLoc = T.getCloseLocation();
2951 }
else if (!
Result.isInvalid()) {
2952 Result = Actions.OpenMP().ActOnOMPArrayShapingExpr(
2953 Result.get(), OpenLoc, RParenLoc, OMPDimensions, OMPBracketsRanges);
2961 isFoldOperator(Tok.getKind()) &&
NextToken().
is(tok::ellipsis)) {
2963 return ParseFoldExpression(
Result, T);
2968 if (!
Result.isInvalid() && Tok.is(tok::r_paren))
2970 Actions.ActOnParenExpr(OpenLoc, Tok.getLocation(),
Result.get());
2974 if (
Result.isInvalid()) {
2980 RParenLoc = T.getCloseLocation();
2985Parser::ParseCompoundLiteralExpression(
ParsedType Ty,
2988 assert(Tok.is(tok::l_brace) &&
"Not a compound literal!");
2990 Diag(LParenLoc, diag::ext_c99_compound_literal);
2991 PreferredType.enterTypeCast(Tok.getLocation(), Ty.
get());
2993 if (!
Result.isInvalid() && Ty)
2994 return Actions.ActOnCompoundLiteral(LParenLoc, Ty, RParenLoc,
Result.get());
3011 "Not a string-literal-like token!");
3019 StringToks.push_back(
Tok);
3024 assert(!AllowUserDefinedLiteral &&
"UDL are always evaluated");
3029 return Actions.ActOnStringLiteral(StringToks,
3034ExprResult Parser::ParseGenericSelectionExpression() {
3035 assert(Tok.is(tok::kw__Generic) &&
"_Generic keyword expected");
3037 diagnoseUseOfC11Keyword(Tok);
3041 if (T.expectAndConsume())
3048 if (isTypeIdForGenericSelection()) {
3055 SourceLocation Loc = LIT->getTypeSourceInfo()->getTypeLoc().getBeginLoc();
3057 : diag::ext_c2y_generic_with_type_arg);
3070 if (ExpectAndConsume(tok::comma)) {
3075 SourceLocation DefaultLoc;
3076 SmallVector<ParsedType, 12> Types;
3080 if (Tok.is(tok::kw_default)) {
3084 Diag(Tok, diag::err_duplicate_default_assoc);
3085 Diag(DefaultLoc, diag::note_previous_default_assoc);
3100 Types.push_back(Ty);
3102 if (ExpectAndConsume(tok::colon)) {
3114 Exprs.push_back(ER.
get());
3118 if (T.getCloseLocation().isInvalid())
3121 void *ExprOrTy = ControllingExpr.
isUsable()
3122 ? ControllingExpr.
get()
3125 return Actions.ActOnGenericSelectionExpr(
3126 KeyLoc, DefaultLoc, T.getCloseLocation(), ControllingExpr.
isUsable(),
3127 ExprOrTy, Types, Exprs);
3138 SourceLocation FirstOpLoc;
3140 Kind = Tok.getKind();
3141 assert(isFoldOperator(Kind) &&
"missing fold-operator");
3145 assert(Tok.is(tok::ellipsis) &&
"not a fold-expression");
3149 if (Tok.isNot(tok::r_paren)) {
3150 if (!isFoldOperator(Tok.getKind()))
3151 return Diag(Tok.getLocation(), diag::err_expected_fold_operator);
3153 if (Kind != tok::unknown && Tok.getKind() != Kind)
3154 Diag(Tok.getLocation(), diag::err_fold_operator_mismatch)
3155 << SourceRange(FirstOpLoc);
3156 Kind = Tok.getKind();
3167 ? diag::warn_cxx14_compat_fold_expression
3168 : diag::ext_fold_expression);
3172 Kind, EllipsisLoc, RHS.
get(),
3176void Parser::injectEmbedTokens() {
3177 EmbedAnnotationData *
Data =
3178 reinterpret_cast<EmbedAnnotationData *
>(Tok.getAnnotationValue());
3179 MutableArrayRef<Token> Toks(PP.getPreprocessorAllocator().Allocate<Token>(
3180 Data->BinaryData.size() * 2 - 1),
3181 Data->BinaryData.size() * 2 - 1);
3183 for (
auto &Byte :
Data->BinaryData) {
3184 Toks[I].startToken();
3185 Toks[I].setKind(tok::binary_data);
3186 Toks[I].setLocation(Tok.getLocation());
3187 Toks[I].setLength(1);
3188 Toks[I].setLiteralData(&Byte);
3189 if (I != ((
Data->BinaryData.size() - 1) * 2)) {
3190 Toks[I + 1].startToken();
3191 Toks[I + 1].setKind(tok::comma);
3192 Toks[I + 1].setLocation(Tok.getLocation());
3196 PP.EnterTokenStream(std::move(Toks),
true,
3202 llvm::function_ref<
void()> ExpressionStarts,
3203 bool FailImmediatelyOnInvalidExpr) {
3204 bool SawError =
false;
3206 if (ExpressionStarts)
3211 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
3212 Expr = ParseBraceInitializer();
3216 if (Tok.is(tok::ellipsis))
3218 else if (Tok.is(tok::code_completion)) {
3230 if (FailImmediatelyOnInvalidExpr)
3234 Exprs.push_back(Expr.
get());
3237 if (Tok.isNot(tok::comma))
3242 checkPotentialAngleBracketDelimiter(Comma);
3253 Exprs.push_back(Expr.
get());
3257 if (Tok.isNot(tok::comma) ||
NextToken().
is(tok::ellipsis))
3263 checkPotentialAngleBracketDelimiter(Comma);
3268 if (Tok.is(tok::code_completion)) {
3270 Actions.CodeCompletion().CodeCompleteOrdinaryName(
3276 DeclSpec DS(AttrFactory);
3277 ParseSpecifierQualifierList(DS);
3283 ParseDeclarator(DeclaratorInfo);
3285 MaybeParseGNUAttributes(DeclaratorInfo);
3288 Actions.ActOnBlockArguments(CaretLoc, DeclaratorInfo,
getCurScope());
3291ExprResult Parser::ParseBlockLiteralExpression() {
3292 assert(Tok.is(tok::caret) &&
"block literal starts with ^");
3295 PrettyStackTraceLoc CrashInfo(PP.getSourceManager(), CaretLoc,
3296 "block literal parsing");
3309 DeclSpec DS(AttrFactory);
3315 ParamInfo.SetSourceRange(SourceRange(Tok.getLocation(), Tok.getLocation()));
3319 if (Tok.is(tok::l_paren)) {
3320 ParseParenDeclarator(ParamInfo);
3324 SourceLocation Tmp = ParamInfo.getSourceRange().getEnd();
3325 ParamInfo.SetIdentifier(
nullptr, CaretLoc);
3326 ParamInfo.SetRangeEnd(Tmp);
3327 if (ParamInfo.isInvalidType()) {
3335 MaybeParseGNUAttributes(ParamInfo);
3338 Actions.ActOnBlockArguments(CaretLoc, ParamInfo,
getCurScope());
3339 }
else if (!Tok.is(tok::l_brace)) {
3340 ParseBlockId(CaretLoc);
3343 SourceLocation NoLoc;
3344 ParamInfo.AddTypeInfo(
3362 CaretLoc, ParamInfo),
3365 MaybeParseGNUAttributes(ParamInfo);
3368 Actions.ActOnBlockArguments(CaretLoc, ParamInfo,
getCurScope());
3373 if (!Tok.is(tok::l_brace)) {
3375 Diag(Tok, diag::err_expected_expression);
3379 EnterExpressionEvaluationContextForFunction PotentiallyEvaluated(
3381 StmtResult Stmt(ParseCompoundStatementBody());
3383 if (!Stmt.isInvalid())
3392 return Actions.ObjC().ActOnObjCBoolLiteral(
ConsumeToken(), Kind);
3399 llvm::SmallSet<StringRef, 4> Platforms;
3400 bool HasOtherPlatformSpec =
false;
3402 for (
const auto &Spec : AvailSpecs) {
3403 if (Spec.isOtherPlatformSpec()) {
3404 if (HasOtherPlatformSpec) {
3405 P.
Diag(Spec.getBeginLoc(), diag::err_availability_query_repeated_star);
3409 HasOtherPlatformSpec =
true;
3413 bool Inserted = Platforms.insert(Spec.getPlatform()).second;
3418 StringRef Platform = Spec.getPlatform();
3419 P.
Diag(Spec.getBeginLoc(), diag::err_availability_query_repeated_platform)
3420 << Spec.getEndLoc() << Platform;
3425 if (!HasOtherPlatformSpec) {
3426 SourceLocation InsertWildcardLoc = AvailSpecs.back().getEndLoc();
3427 P.
Diag(InsertWildcardLoc, diag::err_availability_query_wildcard_required)
3435std::optional<AvailabilitySpec> Parser::ParseAvailabilitySpec() {
3436 if (Tok.is(tok::star)) {
3440 if (Tok.is(tok::code_completion)) {
3442 Actions.CodeCompletion().CodeCompleteAvailabilityPlatformName();
3443 return std::nullopt;
3445 if (Tok.isNot(tok::identifier)) {
3446 Diag(Tok, diag::err_avail_query_expected_platform_name);
3447 return std::nullopt;
3450 IdentifierLoc *PlatformIdentifier = ParseIdentifierLoc();
3451 SourceRange VersionRange;
3452 VersionTuple Version = ParseVersionTuple(VersionRange);
3454 if (Version.empty())
3455 return std::nullopt;
3457 StringRef GivenPlatform =
3459 StringRef Platform =
3460 AvailabilityAttr::canonicalizePlatformName(GivenPlatform);
3462 if (AvailabilityAttr::getPrettyPlatformName(Platform).empty() ||
3463 (GivenPlatform.contains(
"xros") || GivenPlatform.contains(
"xrOS"))) {
3465 diag::err_avail_query_unrecognized_platform_name)
3467 return std::nullopt;
3471 if (Platform ==
"anyappleos" &&
3474 diag::err_avail_query_anyappleos_min_version)
3475 << Version.getAsString();
3476 return std::nullopt;
3479 return AvailabilitySpec(Version, Platform, PlatformIdentifier->
getLoc(),
3485 assert(Tok.is(tok::kw___builtin_available) ||
3486 Tok.isObjCAtKeyword(tok::objc_available));
3492 if (
Parens.expectAndConsume())
3495 SmallVector<AvailabilitySpec, 4> AvailSpecs;
3496 bool HasError =
false;
3498 std::optional<AvailabilitySpec> Spec = ParseAvailabilitySpec();
3502 AvailSpecs.push_back(*Spec);
3515 if (
Parens.consumeClose())
3518 return Actions.ObjC().ActOnObjCAvailabilityCheckExpr(
3519 AvailSpecs, BeginLoc,
Parens.getCloseLocation());
Defines the clang::ASTContext interface.
static Decl::Kind getKind(const Decl *D)
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the clang::Expr interface and subclasses for C++ expressions.
static bool CheckAvailabilitySpecList(Parser &P, ArrayRef< AvailabilitySpec > AvailSpecs)
Validate availability spec list, emitting diagnostics if necessary.
#define REVERTIBLE_TYPE_TRAIT(Name)
Defines the PrettyStackTraceEntry class, which is used to make crashes give more contextual informati...
This file declares semantic analysis for CUDA constructs.
This file declares facilities that support code completion.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenACC constructs and clauses.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis for SYCL constructs.
static bool validateAnyAppleOSVersion(const llvm::VersionTuple &Version)
Returns true if the anyAppleOS version is valid (empty or >= 26.0).
RAII class that helps handle the parsing of an open/close delimiter pair, such as braces { ....
SourceLocation getOpenLocation() const
SourceLocation getCloseLocation() const
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
virtual bool ValidateCandidate(const TypoCorrection &candidate)
Simple predicate used by the default RankCandidate to determine whether to return an edit distance of...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isFileContext() const
RAII object that enters a new expression evaluation context.
This represents one expression.
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
ExtensionRAIIObject - This saves the state of extension warnings when constructed and disables them.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
SourceLocation getLoc() const
IdentifierInfo * getIdentifierInfo() const
static StringRef getImmediateMacroNameForDiagnostics(SourceLocation Loc, const SourceManager &SM, const LangOptions &LangOpts)
Retrieve the name of the immediate macro expansion.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
void * getAsOpaquePtr() const
static const ParsedAttributesView & none()
ParseScope - Introduces a new scope for parsing.
Parser - This implements a parser for the C family of languages.
TypeResult ParseTypeName(SourceRange *Range=nullptr, DeclaratorContext Context=DeclaratorContext::TypeName, AccessSpecifier AS=AS_none, Decl **OwnedType=nullptr, ParsedAttributes *Attrs=nullptr)
ParseTypeName.
bool TryAnnotateTypeOrScopeToken(ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No, bool IsAddressOfOperand=false)
TryAnnotateTypeOrScopeToken - If the current token position is on a typename (possibly qualified in C...
DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
ExprResult ParseStringLiteralExpression(bool AllowUserDefinedLiteral=false)
ParseStringLiteralExpression - This handles the various token types that form string literals,...
SourceLocation ConsumeToken()
ConsumeToken - Consume the current 'peek token' and lex the next one.
Sema & getActions() const
static TypeResult getTypeAnnotation(const Token &Tok)
getTypeAnnotation - Read a parsed type out of an annotation token.
ExprResult ParseCaseExpression(SourceLocation CaseLoc)
ExprResult ParseConstraintLogicalOrExpression(bool IsTrailingRequiresClause)
Parse a constraint-logical-or-expression.
ExprResult ParseConstantExpressionInExprEvalContext(TypoCorrectionTypeBehavior CorrectionBehavior=TypoCorrectionTypeBehavior::AllowNonTypes)
bool ParseUnqualifiedId(CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHadErrors, bool EnteringContext, bool AllowDestructorName, bool AllowConstructorName, bool AllowDeductionGuide, SourceLocation *TemplateKWLoc, UnqualifiedId &Result)
Parse a C++ unqualified-id (or a C identifier), which describes the name of an entity.
friend class ColonProtectionRAIIObject
SourceLocation ConsumeAnyToken(bool ConsumeCodeCompletionTok=false)
ConsumeAnyToken - Dispatch to the right Consume* method based on the current token type.
const Token & GetLookAheadToken(unsigned N)
GetLookAheadToken - This peeks ahead N tokens and returns that token without consuming any tokens.
ExprResult ParseConstantExpression()
ExprResult ParseConditionalExpression()
bool TryConsumeToken(tok::TokenKind Expected)
Scope * getCurScope() const
ExprResult ParseArrayBoundExpression()
friend class InMessageExpressionRAIIObject
ExprResult ParseConstraintLogicalAndExpression(bool IsTrailingRequiresClause)
Parse a constraint-logical-and-expression.
bool SkipUntil(tok::TokenKind T, SkipUntilFlags Flags=static_cast< SkipUntilFlags >(0))
SkipUntil - Read tokens until we get to the specified token, then consume it (unless StopBeforeMatch ...
friend class OffsetOfStateRAIIObject
const LangOptions & getLangOpts() const
ExprResult ParseExpression(TypoCorrectionTypeBehavior CorrectionBehavior=TypoCorrectionTypeBehavior::AllowNonTypes)
Simple precedence-based parser for binary/ternary operators.
@ StopBeforeMatch
Stop skipping at specified token, but don't skip the token itself.
@ StopAtSemi
Stop skipping at semicolon.
ExprResult ParseUnevaluatedStringLiteralExpression()
const Token & NextToken()
NextToken - This peeks ahead one token and returns it without consuming it.
ExprResult ParseAssignmentExpression(TypoCorrectionTypeBehavior CorrectionBehavior=TypoCorrectionTypeBehavior::AllowNonTypes)
Parse an expr that doesn't include (top-level) commas.
friend class BalancedDelimiterTracker
ExprResult ParseConstraintExpression()
Parse a constraint-expression.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
QualType getCanonicalType() const
@ BlockScope
This is a scope that corresponds to a block/closure object.
@ CompoundStmtScope
This is a compound statement scope.
@ FnScope
This indicates that the scope corresponds to a function, which means that labels are set here.
@ DeclScope
This is a scope that can contain a declaration.
@ PCC_Type
Code completion occurs where only a type is permitted.
ExprResult ActOnUnevaluatedStringLiteral(ArrayRef< Token > StringToks)
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
SourceLocation getEndLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
Token - This structure provides full information about a lexed token.
IdentifierInfo * getIdentifierInfo() const
SourceLocation getLocation() const
Return a source location identifier for the specified offset in the current file.
const char * getName() const
void setLength(unsigned Len)
void setKind(tok::TokenKind K)
bool is(tok::TokenKind K) const
is/isNot - Predicates to check if this token is a specific kind, as in "if (Tok.is(tok::l_brace)) {....
tok::TokenKind getKind() const
bool isOneOf(Ts... Ks) const
void setLocation(SourceLocation L)
void startToken()
Reset all flags to cleared.
bool isSpecificPlaceholderType(unsigned K) const
Test for a specific placeholder type.
bool isFunctionType() const
bool isVectorType() const
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Specify that this unqualified-id was parsed as an identifier.
bool isValid() const
Determine whether this unqualified-id refers to a valid name.
SourceLocation getEndLoc() const LLVM_READONLY
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
TypoCorrectionTypeBehavior
If a typo should be encountered, should typo correction suggest type names, non type names,...
bool tokenIsLikeStringLiteral(const Token &Tok, const LangOptions &LO)
Return true if the token is a string literal, or a function local predefined macro,...
UnaryExprOrTypeTrait
Names for the "expression or type" traits.
@ Result
The result type of a method or function.
ActionResult< ParsedType > TypeResult
ObjCBridgeCastKind
The kind of bridging performed by the Objective-C bridge cast.
@ OBC_Bridge
Bridging via __bridge, which does nothing but reinterpret the bits.
@ OBC_BridgeTransfer
Bridging via __bridge_transfer, which transfers ownership of an Objective-C pointer into ARC.
@ OBC_BridgeRetained
Bridging via __bridge_retain, which makes an ARC object available as a +1 C pointer.
@ Type
The name was classified as a type.
prec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator, bool CPlusPlus11)
Return the precedence of the specified binary operator token.
@ TNK_Type_template
The name refers to a template whose specialization produces a type.
ParenExprKind
In a call to ParseParenExpression, are the initial parentheses part of an operator that requires the ...
U cast(CodeGen::Address addr)
CastParseKind
Control what ParseCastExpression will parse.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
ParenParseOption
ParenParseOption - Control what ParseParenExpression will parse.
ActionResult< Expr * > ExprResult
@ Parens
New-expression has a C++98 paren-delimited initializer.
@ EST_None
no exception specification
ActionResult< Stmt * > StmtResult
static DeclaratorChunk getFunction(bool HasProto, bool IsAmbiguous, SourceLocation LParenLoc, ParamInfo *Params, unsigned NumParams, SourceLocation EllipsisLoc, SourceLocation RParenLoc, bool RefQualifierIsLvalueRef, SourceLocation RefQualifierLoc, SourceLocation MutableLoc, ExceptionSpecificationType ESpecType, SourceRange ESpecRange, ParsedType *Exceptions, SourceRange *ExceptionRanges, unsigned NumExceptions, Expr *NoexceptExpr, CachedTokens *ExceptionSpecTokens, ArrayRef< NamedDecl * > DeclsInPrototype, SourceLocation LocalRangeBegin, SourceLocation LocalRangeEnd, Declarator &TheDeclarator, TypeResult TrailingReturnType=TypeResult(), SourceLocation TrailingReturnTypeLoc=SourceLocation(), DeclSpec *MethodQualifiers=nullptr)
DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
TemplateNameKind Kind
The kind of template that Template refers to.