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;
486 if (RHS.
isInvalid() && Tok.isNot(tok::semi)) {
502 if (ThisPrec < NextTokPrec ||
503 (ThisPrec == NextTokPrec && isRightAssoc)) {
505 Diag(Tok, diag::err_init_list_bin_op)
506 << 0 << PP.getSpelling(Tok) << Actions.getExprRange(RHS.
get());
514 RHS = ParseRHSOfBinaryExpression(RHS,
515 static_cast<prec::Level>(ThisPrec + !isRightAssoc));
516 RHSIsInitList =
false;
518 if (RHS.
isInvalid() && Tok.isNot(tok::semi)) {
528 Diag(OpToken, diag::warn_cxx98_compat_generalized_initializer_lists)
529 << Actions.getExprRange(RHS.
get());
530 }
else if (ColonLoc.
isValid()) {
531 Diag(ColonLoc, diag::err_init_list_bin_op)
533 << Actions.getExprRange(RHS.
get());
536 Diag(OpToken, diag::err_init_list_bin_op)
537 << 1 << PP.getSpelling(OpToken)
538 << Actions.getExprRange(RHS.
get());
549 }
else if (TernaryMiddle.isInvalid()) {
553 if (!GreaterThanIsOperator && OpToken.
is(tok::greatergreater))
555 diag::warn_cxx11_right_shift_in_template_arg,
556 SourceRange(Actions.getExprRange(LHS.
get()).getBegin(),
557 Actions.getExprRange(RHS.
get()).getEnd()));
565 {LHS.get(), RHS.get()});
569 ExprResult CondOp = Actions.ActOnConditionalOp(
573 std::vector<clang::Expr *> Args;
575 if (TernaryMiddle.get())
576 Args = {LHS.
get(), TernaryMiddle.get(), RHS.
get()};
578 Args = {LHS.
get(), RHS.
get()};
590Parser::ParseCastExpression(
CastParseKind ParseKind,
bool isAddressOfOperand,
592 bool isVectorLiteral,
bool *NotPrimaryExpression) {
594 ExprResult Res = ParseCastExpression(ParseKind, isAddressOfOperand,
595 NotCastExpr, CorrectionBehavior,
596 isVectorLiteral, NotPrimaryExpression);
598 Diag(Tok, diag::err_expected_expression);
605 CastExpressionIdValidator(Token
Next,
608 WantTypeSpecifiers = WantFunctionLikeCasts =
609 (CorrectionBehavior != TypoCorrectionTypeBehavior::AllowNonTypes);
611 (CorrectionBehavior != TypoCorrectionTypeBehavior::AllowTypes);
614 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
620 return WantTypeSpecifiers;
625 if (!NextToken.isOneOf(tok::equal, tok::arrow, tok::period))
628 for (
auto *
C : candidate) {
636 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
637 return std::make_unique<CastExpressionIdValidator>(*
this);
648 if (RevertibleTypeTraits.empty()) {
652#define RTT_JOIN(X, Y) X##Y
653#define REVERTIBLE_TYPE_TRAIT(Name) \
654 RevertibleTypeTraits[PP.getIdentifierInfo(#Name)] = RTT_JOIN(tok::kw_, Name)
711#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) \
712 REVERTIBLE_TYPE_TRAIT(RTT_JOIN(__, Trait));
713#include "clang/Basic/TransformTypeTraits.def"
714#undef REVERTIBLE_TYPE_TRAIT
717 llvm::SmallDenseMap<IdentifierInfo *, tok::TokenKind>::iterator Known =
718 RevertibleTypeTraits.find(II);
719 if (Known != RevertibleTypeTraits.end()) {
721 *
Kind = Known->second;
727ExprResult Parser::ParseBuiltinPtrauthTypeDiscriminator() {
731 if (T.expectAndConsume())
740 SourceLocation EndLoc = Tok.getLocation();
742 return Actions.ActOnUnaryExprOrTypeTraitExpr(
743 Loc, UETT_PtrAuthTypeDiscriminator,
748Parser::ParseCastExpression(
CastParseKind ParseKind,
bool isAddressOfOperand,
751 bool isVectorLiteral,
bool *NotPrimaryExpression) {
754 auto SavedType = PreferredType;
760 bool AllowSuffix =
true;
789 SourceLocation RParenLoc;
790 Res = ParseParenExpression(ParenExprType,
false,
800 switch (ParenExprType) {
823 case tok::numeric_constant:
824 case tok::binary_data:
828 Res = Actions.ActOnNumericConstant(Tok,
getCurScope());
834 Res = ParseCXXBoolLiteral();
837 case tok::kw___objc_yes:
838 case tok::kw___objc_no:
839 Res = ParseObjCBoolLiteral();
842 case tok::kw_nullptr:
844 Diag(Tok, diag::warn_cxx98_compat_nullptr);
847 : diag::ext_c_nullptr) << Tok.getName();
852 case tok::annot_primary_expr:
853 case tok::annot_overload_set:
854 Res = getExprAnnotation(Tok);
855 if (!Res.
isInvalid() && Tok.getKind() == tok::annot_overload_set)
856 Res = Actions.ActOnNameClassifiedAsOverloadSet(
getCurScope(), Res.
get());
857 ConsumeAnnotationToken();
858 if (!Res.
isInvalid() && Tok.is(tok::less))
859 checkPotentialAngleBracket(Res);
862 case tok::annot_non_type:
863 case tok::annot_non_type_dependent:
864 case tok::annot_non_type_undeclared: {
866 Res = tryParseCXXIdExpression(SS, isAddressOfOperand);
868 "should not perform typo correction on annotation token");
872 case tok::annot_embed: {
874 return ParseCastExpression(ParseKind, isAddressOfOperand,
875 CorrectionBehavior, isVectorLiteral,
876 NotPrimaryExpression);
879 case tok::kw___super:
880 case tok::kw_decltype:
884 assert(Tok.isNot(tok::kw_decltype) && Tok.isNot(tok::kw___super));
885 return ParseCastExpression(ParseKind, isAddressOfOperand,
886 CorrectionBehavior, isVectorLiteral,
887 NotPrimaryExpression);
889 case tok::identifier:
900 if (
Next.is(tok::ellipsis) && Tok.is(tok::identifier) &&
906 Tok.isOneOf(tok::annot_pack_indexing_type, tok::annot_cxxscope))
907 return ParseCastExpression(ParseKind, isAddressOfOperand,
908 CorrectionBehavior, isVectorLiteral,
909 NotPrimaryExpression);
915 else if (
Next.is(tok::l_paren) && Tok.is(tok::identifier) &&
916 Tok.getIdentifierInfo()->hasRevertedTokenIDToIdentifier()) {
917 IdentifierInfo *II = Tok.getIdentifierInfo();
919 if (isRevertibleTypeTrait(II, &Kind)) {
921 return ParseCastExpression(ParseKind, isAddressOfOperand, NotCastExpr,
922 CorrectionBehavior, isVectorLiteral,
923 NotPrimaryExpression);
927 else if ((!ColonIsSacred &&
Next.is(tok::colon)) ||
928 Next.isOneOf(tok::coloncolon, tok::less, tok::l_paren,
933 if (!Tok.is(tok::identifier))
934 return ParseCastExpression(ParseKind, isAddressOfOperand, NotCastExpr,
935 CorrectionBehavior, isVectorLiteral,
936 NotPrimaryExpression);
942 IdentifierInfo &II = *Tok.getIdentifierInfo();
949 (&II == Ident_super &&
getCurScope()->isInObjcMethodScope()))) {
952 if (Tok.is(tok::code_completion) && &II != Ident_super) {
954 Actions.CodeCompletion().CodeCompleteObjCClassPropertyRefExpr(
955 getCurScope(), II, ILoc, ExprStatementTokLoc == ILoc);
959 if (Tok.isNot(tok::identifier) &&
961 Diag(Tok, diag::err_expected_property_name);
964 IdentifierInfo &PropertyName = *Tok.getIdentifierInfo();
967 Res = Actions.ObjC().ActOnClassPropertyRefExpr(II, PropertyName, ILoc,
976 if (
getLangOpts().
ObjC && &II == Ident_super && !InMessageExpression &&
978 ((Tok.is(tok::identifier) &&
980 Tok.is(tok::code_completion))) {
981 Res = ParseObjCMessageExpressionBody(SourceLocation(), ILoc,
nullptr,
992 ((Tok.is(tok::identifier) && !InMessageExpression) ||
993 Tok.is(tok::code_completion))) {
995 if (Tok.is(tok::code_completion) ||
996 Next.is(tok::colon) ||
Next.is(tok::r_square))
998 if (Typ.get()->isObjCObjectOrInterfaceType()) {
1000 DeclSpec DS(AttrFactory);
1001 DS.SetRangeStart(ILoc);
1002 DS.SetRangeEnd(ILoc);
1003 const char *PrevSpec =
nullptr;
1005 DS.SetTypeSpecType(
TST_typename, ILoc, PrevSpec, DiagID, Typ,
1006 Actions.getASTContext().getPrintingPolicy());
1010 TypeResult Ty = Actions.ActOnTypeName(DeclaratorInfo);
1014 Res = ParseObjCMessageExpressionBody(SourceLocation(),
1022 if (isAddressOfOperand && isPostfixExpressionSuffixStart())
1023 isAddressOfOperand =
false;
1029 CXXScopeSpec ScopeSpec;
1030 SourceLocation TemplateKWLoc;
1031 CastExpressionIdValidator Validator(Tok, CorrectionBehavior);
1032 Validator.IsAddressOfOperand = isAddressOfOperand;
1033 if (Tok.isOneOf(tok::periodstar, tok::arrowstar)) {
1034 Validator.WantExpressionKeywords =
false;
1035 Validator.WantRemainingKeywords =
false;
1037 Validator.WantRemainingKeywords = Tok.isNot(tok::r_paren);
1040 Res = Actions.ActOnIdExpression(
getCurScope(), ScopeSpec, TemplateKWLoc,
1041 Name, Tok.is(tok::l_paren),
1042 isAddressOfOperand, &Validator,
1044 Res = tryParseCXXPackIndexingExpression(Res);
1045 if (!Res.
isInvalid() && Tok.is(tok::less))
1046 checkPotentialAngleBracket(Res);
1049 case tok::char_constant:
1050 case tok::wide_char_constant:
1051 case tok::utf8_char_constant:
1052 case tok::utf16_char_constant:
1053 case tok::utf32_char_constant:
1054 Res = Actions.ActOnCharacterConstant(Tok,
getCurScope());
1057 case tok::kw___func__:
1058 case tok::kw___FUNCTION__:
1059 case tok::kw___FUNCDNAME__:
1060 case tok::kw___FUNCSIG__:
1061 case tok::kw_L__FUNCTION__:
1062 case tok::kw_L__FUNCSIG__:
1063 case tok::kw___PRETTY_FUNCTION__:
1070 Res = Actions.ActOnPredefinedExpr(Tok.getLocation(), SavedKind);
1075 case tok::string_literal:
1076 case tok::wide_string_literal:
1077 case tok::utf8_string_literal:
1078 case tok::utf16_string_literal:
1079 case tok::utf32_string_literal:
1082 case tok::kw__Generic:
1083 Res = ParseGenericSelectionExpression();
1085 case tok::kw___builtin_available:
1086 Res = ParseAvailabilityCheckExpr(Tok.getLocation());
1088 case tok::kw___builtin_va_arg:
1089 case tok::kw___builtin_offsetof:
1090 case tok::kw___builtin_choose_expr:
1091 case tok::kw___builtin_astype:
1092 case tok::kw___builtin_convertvector:
1093 case tok::kw___builtin_COLUMN:
1094 case tok::kw___builtin_FILE:
1095 case tok::kw___builtin_FILE_NAME:
1096 case tok::kw___builtin_FUNCTION:
1097 case tok::kw___builtin_FUNCSIG:
1098 case tok::kw___builtin_LINE:
1099 case tok::kw___builtin_source_location:
1100 if (NotPrimaryExpression)
1101 *NotPrimaryExpression =
true;
1103 return ParseBuiltinPrimaryExpression();
1104 case tok::kw___null:
1109 case tok::minusminus: {
1110 if (NotPrimaryExpression)
1111 *NotPrimaryExpression =
true;
1116 Token SavedTok = Tok;
1119 PreferredType.enterUnary(Actions, Tok.getLocation(), SavedTok.
getKind(),
1133 UnconsumeToken(SavedTok);
1137 Expr *Arg = Res.
get();
1141 Res = Actions.CreateRecoveryExpr(SavedTok.
getLocation(),
1147 if (NotPrimaryExpression)
1148 *NotPrimaryExpression =
true;
1151 PreferredType.enterUnary(Actions, Tok.getLocation(), tok::amp, SavedLoc);
1156 Expr *Arg = Res.
get();
1157 Res = Actions.ActOnUnaryOp(
getCurScope(), SavedLoc, SavedKind, Arg);
1159 Res = Actions.CreateRecoveryExpr(Tok.getLocation(), Arg->
getEndLoc(),
1170 case tok::kw___real:
1171 case tok::kw___imag: {
1172 if (NotPrimaryExpression)
1173 *NotPrimaryExpression =
true;
1175 PreferredType.enterUnary(Actions, Tok.getLocation(), SavedKind, SavedLoc);
1178 Expr *Arg = Res.
get();
1179 Res = Actions.ActOnUnaryOp(
getCurScope(), SavedLoc, SavedKind, Arg,
1180 isAddressOfOperand);
1182 Res = Actions.CreateRecoveryExpr(SavedLoc, Arg->
getEndLoc(), Arg);
1187 case tok::kw_co_await: {
1188 if (NotPrimaryExpression)
1189 *NotPrimaryExpression =
true;
1193 Res = Actions.ActOnCoawaitExpr(
getCurScope(), CoawaitLoc, Res.
get());
1197 case tok::kw___extension__:{
1199 if (NotPrimaryExpression)
1200 *NotPrimaryExpression =
true;
1201 ExtensionRAIIObject O(Diags);
1205 Res = Actions.ActOnUnaryOp(
getCurScope(), SavedLoc, SavedKind, Res.
get());
1208 case tok::kw__Alignof:
1209 diagnoseUseOfC11Keyword(Tok);
1211 case tok::kw_alignof:
1212 case tok::kw___alignof:
1214 case tok::kw_sizeof:
1218 case tok::kw___datasizeof:
1219 case tok::kw_vec_step:
1221 case tok::kw___builtin_omp_required_simd_align:
1222 case tok::kw___builtin_vectorelements:
1223 case tok::kw__Countof:
1224 if (NotPrimaryExpression)
1225 *NotPrimaryExpression =
true;
1226 AllowSuffix =
false;
1227 Res = ParseUnaryExprOrTypeTraitExpression();
1229 case tok::caretcaret: {
1235 if (NotPrimaryExpression)
1236 *NotPrimaryExpression =
true;
1237 AllowSuffix =
false;
1238 Res = ParseCXXReflectExpression();
1242 if (NotPrimaryExpression)
1243 *NotPrimaryExpression =
true;
1245 if (Tok.isNot(tok::identifier))
1246 return ExprError(
Diag(Tok, diag::err_expected) << tok::identifier);
1249 return ExprError(
Diag(Tok, diag::err_address_of_label_outside_fn));
1251 Diag(AmpAmpLoc, diag::ext_gnu_address_of_label);
1252 LabelDecl *LD = Actions.LookupOrCreateLabel(Tok.getIdentifierInfo(),
1254 Res = Actions.ActOnAddrLabel(AmpAmpLoc, Tok.getLocation(), LD);
1256 AllowSuffix =
false;
1259 case tok::kw_const_cast:
1260 case tok::kw_dynamic_cast:
1261 case tok::kw_reinterpret_cast:
1262 case tok::kw_static_cast:
1263 case tok::kw_addrspace_cast:
1264 if (NotPrimaryExpression)
1265 *NotPrimaryExpression =
true;
1266 Res = ParseCXXCasts();
1268 case tok::kw___builtin_bit_cast:
1269 if (NotPrimaryExpression)
1270 *NotPrimaryExpression =
true;
1271 Res = ParseBuiltinBitCast();
1273 case tok::kw_typeid:
1274 if (NotPrimaryExpression)
1275 *NotPrimaryExpression =
true;
1276 Res = ParseCXXTypeid();
1278 case tok::kw___uuidof:
1279 if (NotPrimaryExpression)
1280 *NotPrimaryExpression =
true;
1281 Res = ParseCXXUuidof();
1284 Res = ParseCXXThis();
1286 case tok::kw___builtin_sycl_unique_stable_name:
1287 Res = ParseSYCLUniqueStableNameExpression();
1290 case tok::annot_typename:
1291 if (isStartOfObjCClassMessageMissingOpenBracket()) {
1295 DeclSpec DS(AttrFactory);
1296 DS.SetRangeStart(Tok.getLocation());
1297 DS.SetRangeEnd(Tok.getLastLoc());
1299 const char *PrevSpec =
nullptr;
1301 DS.SetTypeSpecType(
TST_typename, Tok.getAnnotationEndLoc(),
1302 PrevSpec, DiagID,
Type,
1303 Actions.getASTContext().getPrintingPolicy());
1307 TypeResult Ty = Actions.ActOnTypeName(DeclaratorInfo);
1311 ConsumeAnnotationToken();
1312 Res = ParseObjCMessageExpressionBody(SourceLocation(), SourceLocation(),
1318 case tok::annot_decltype:
1319 case tok::annot_pack_indexing_type:
1321 case tok::kw_wchar_t:
1322 case tok::kw_char8_t:
1323 case tok::kw_char16_t:
1324 case tok::kw_char32_t:
1329 case tok::kw___int64:
1330 case tok::kw___int128:
1331 case tok::kw__ExtInt:
1332 case tok::kw__BitInt:
1333 case tok::kw_signed:
1334 case tok::kw_unsigned:
1337 case tok::kw_double:
1338 case tok::kw___bf16:
1339 case tok::kw__Float16:
1340 case tok::kw___float128:
1341 case tok::kw___ibm128:
1344 case tok::kw_typename:
1345 case tok::kw_typeof:
1346 case tok::kw___vector:
1347 case tok::kw__Accum:
1348 case tok::kw__Fract:
1350#define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t:
1351#include "clang/Basic/OpenCLImageTypes.def"
1352#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case tok::kw_##Name:
1353#include "clang/Basic/HLSLIntangibleTypes.def"
1356 Diag(Tok, diag::err_expected_expression);
1361 if (NotPrimaryExpression)
1362 *NotPrimaryExpression =
true;
1364 if (SavedKind == tok::kw_typename) {
1379 DeclSpec DS(AttrFactory);
1381 ParseCXXSimpleTypeSpecifier(DS);
1382 if (Tok.isNot(tok::l_paren) &&
1384 return ExprError(
Diag(Tok, diag::err_expected_lparen_after_type)
1385 << DS.getSourceRange());
1387 if (Tok.is(tok::l_brace))
1388 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
1390 Res = ParseCXXTypeConstructExpression(DS);
1394 case tok::annot_cxxscope: {
1399 if (!Tok.is(tok::annot_cxxscope))
1400 return ParseCastExpression(ParseKind, isAddressOfOperand, NotCastExpr,
1401 CorrectionBehavior, isVectorLiteral,
1402 NotPrimaryExpression);
1405 if (
Next.is(tok::annot_template_id)) {
1406 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(
Next);
1412 ParseOptionalCXXScopeSpecifier(SS,
nullptr,
1416 return ParseCastExpression(ParseKind, isAddressOfOperand, NotCastExpr,
1417 CorrectionBehavior, isVectorLiteral,
1418 NotPrimaryExpression);
1423 Res = ParseCXXIdExpression(isAddressOfOperand);
1427 case tok::annot_template_id: {
1428 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
1435 return ParseCastExpression(ParseKind, isAddressOfOperand, NotCastExpr,
1436 CorrectionBehavior, isVectorLiteral,
1437 NotPrimaryExpression);
1444 case tok::kw_operator:
1445 Res = ParseCXXIdExpression(isAddressOfOperand);
1448 case tok::coloncolon: {
1453 if (!Tok.is(tok::coloncolon))
1454 return ParseCastExpression(ParseKind, isAddressOfOperand,
1455 CorrectionBehavior, isVectorLiteral,
1456 NotPrimaryExpression);
1461 if (Tok.is(tok::kw_new)) {
1462 if (NotPrimaryExpression)
1463 *NotPrimaryExpression =
true;
1464 Res = ParseCXXNewExpression(
true, CCLoc);
1465 AllowSuffix =
false;
1468 if (Tok.is(tok::kw_delete)) {
1469 if (NotPrimaryExpression)
1470 *NotPrimaryExpression =
true;
1471 Res = ParseCXXDeleteExpression(
true, CCLoc);
1472 AllowSuffix =
false;
1477 Diag(CCLoc, diag::err_expected_expression);
1482 if (NotPrimaryExpression)
1483 *NotPrimaryExpression =
true;
1484 Res = ParseCXXNewExpression(
false, Tok.getLocation());
1485 AllowSuffix =
false;
1488 case tok::kw_delete:
1489 if (NotPrimaryExpression)
1490 *NotPrimaryExpression =
true;
1491 Res = ParseCXXDeleteExpression(
false, Tok.getLocation());
1492 AllowSuffix =
false;
1495 case tok::kw_requires:
1496 Res = ParseRequiresExpression();
1497 AllowSuffix =
false;
1500 case tok::kw_noexcept: {
1501 if (NotPrimaryExpression)
1502 *NotPrimaryExpression =
true;
1503 Diag(Tok, diag::warn_cxx98_compat_noexcept_expr);
1507 if (T.expectAndConsume(diag::err_expected_lparen_after,
"noexcept"))
1519 Res = Actions.ActOnNoexceptExpr(KeyLoc, T.getOpenLocation(), Res.
get(),
1520 T.getCloseLocation());
1521 AllowSuffix =
false;
1525#define TYPE_TRAIT(N,Spelling,K) \
1526 case tok::kw_##Spelling:
1527#include "clang/Basic/TokenKinds.def"
1528 Res = ParseTypeTrait();
1531 case tok::kw___array_rank:
1532 case tok::kw___array_extent:
1533 if (NotPrimaryExpression)
1534 *NotPrimaryExpression =
true;
1535 Res = ParseArrayTypeTrait();
1538 case tok::kw___builtin_ptrauth_type_discriminator:
1539 return ParseBuiltinPtrauthTypeDiscriminator();
1541 case tok::kw___is_lvalue_expr:
1542 case tok::kw___is_rvalue_expr:
1543 if (NotPrimaryExpression)
1544 *NotPrimaryExpression =
true;
1545 Res = ParseExpressionTrait();
1549 if (NotPrimaryExpression)
1550 *NotPrimaryExpression =
true;
1552 return ParseObjCAtExpression(AtLoc);
1555 Res = ParseBlockLiteralExpression();
1557 case tok::code_completion: {
1559 Actions.CodeCompletion().CodeCompleteExpression(
1560 getCurScope(), PreferredType.get(Tok.getLocation()),
1561 false, isAddressOfOperand);
1564#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
1565#include "clang/Basic/TransformTypeTraits.def"
1569 Tok.setKind(tok::identifier);
1570 Diag(Tok, diag::ext_keyword_as_ident)
1571 << Tok.getIdentifierInfo()->getName() << 0;
1572 goto ParseIdentifier;
1574 goto ExpectedExpression;
1583 Res = TryParseLambdaExpression();
1587 if (NotPrimaryExpression)
1588 *NotPrimaryExpression =
true;
1589 Res = ParseObjCMessageExpression();
1593 Res = ParseLambdaExpression();
1597 Res = ParseObjCMessageExpression();
1622 switch (Tok.getKind()) {
1626 case tok::minusminus:
1629 if (Tok.isAtStartOfLine())
1644 Diag(Tok.getLocation(), diag::err_postfix_after_unary_requires_parens)
1652 PreferredType = SavedType;
1653 Res = ParsePostfixExpressionSuffix(Res);
1655 !
getActions().getOpenCLOptions().isAvailableOption(
1657 if (Expr *PostfixExpr = Res.
get()) {
1658 QualType Ty = PostfixExpr->getType();
1660 Diag(PostfixExpr->getExprLoc(),
1661 diag::err_opencl_taking_function_address_parser);
1670Parser::ParsePostfixExpressionSuffix(
ExprResult LHS) {
1674 auto SavedType = PreferredType;
1677 PreferredType = SavedType;
1678 switch (Tok.getKind()) {
1679 case tok::code_completion:
1680 if (InMessageExpression)
1684 Actions.CodeCompletion().CodeCompletePostfixExpression(
1685 getCurScope(), LHS, PreferredType.get(Tok.getLocation()));
1688 case tok::identifier:
1694 LHS = ParseObjCMessageExpressionBody(SourceLocation(), SourceLocation(),
1695 nullptr, LHS.
get());
1703 case tok::l_square: {
1711 isSimpleObjCMessageExpression())
1716 if (CheckProhibitedCXX11Attribute()) {
1721 Loc = T.getOpenLocation();
1723 SourceLocation ColonLocFirst, ColonLocSecond;
1724 ExprVector ArgExprs;
1725 bool HasError =
false;
1726 PreferredType.enterSubscript(Actions, Tok.getLocation(), LHS.
get());
1732 if ((!
getLangOpts().OpenMP && !AllowOpenACCArraySections) ||
1733 Tok.isNot(tok::colon)) {
1737 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
1738 Idx = ParseBraceInitializer();
1745 ArgExprs.push_back(Idx.
get());
1747 }
else if (Tok.isNot(tok::r_square)) {
1748 if (ParseExpressionList(ArgExprs)) {
1758 if (ArgExprs.size() <= 1 && AllowOpenACCArraySections) {
1760 if (Tok.is(tok::colon)) {
1763 if (Tok.isNot(tok::r_square))
1766 }
else if (ArgExprs.size() <= 1 &&
getLangOpts().OpenMP) {
1768 if (Tok.is(tok::colon)) {
1771 if (Tok.isNot(tok::r_square) &&
1773 ((Tok.isNot(tok::colon) &&
getLangOpts().OpenMP >= 50)))) {
1778 (OMPClauseKind == llvm::omp::Clause::OMPC_to ||
1779 OMPClauseKind == llvm::omp::Clause::OMPC_from) &&
1780 Tok.is(tok::colon)) {
1783 if (Tok.isNot(tok::r_square)) {
1789 SourceLocation RLoc = Tok.getLocation();
1790 if (!LHS.
isInvalid() && !HasError && !Length.isInvalid() &&
1791 !Stride.
isInvalid() && Tok.is(tok::r_square)) {
1797 if (AllowOpenACCArraySections) {
1799 "Stride/second colon not allowed for OpenACC");
1800 LHS = Actions.OpenACC().ActOnArraySectionExpr(
1801 LHS.
get(), Loc, ArgExprs.empty() ?
nullptr : ArgExprs[0],
1802 ColonLocFirst, Length.get(), RLoc);
1804 LHS = Actions.OpenMP().ActOnOMPArraySectionExpr(
1805 LHS.
get(), Loc, ArgExprs.empty() ?
nullptr : ArgExprs[0],
1806 ColonLocFirst, ColonLocSecond, Length.get(), Stride.
get(),
1810 LHS = Actions.ActOnArraySubscriptExpr(
getCurScope(), LHS.
get(), Loc,
1823 case tok::lesslessless: {
1828 Expr *ExecConfig =
nullptr;
1832 if (OpKind == tok::lesslessless) {
1833 ExprVector ExecConfigExprs;
1836 if (ParseSimpleExpressionList(ExecConfigExprs)) {
1840 SourceLocation CloseLoc;
1846 Diag(Tok, diag::err_expected) << tok::greatergreatergreater;
1847 Diag(OpenLoc, diag::note_matching) << tok::lesslessless;
1853 if (ExpectAndConsume(tok::l_paren))
1856 Loc = PrevTokLocation;
1860 ExprResult ECResult = Actions.CUDA().ActOnExecConfigExpr(
1861 getCurScope(), OpenLoc, ExecConfigExprs, CloseLoc);
1865 ExecConfig = ECResult.
get();
1869 Loc = PT.getOpenLocation();
1872 ExprVector ArgExprs;
1873 auto RunSignatureHelp = [&]() -> QualType {
1874 QualType PreferredType =
1875 Actions.CodeCompletion().ProduceCallSignatureHelp(
1876 LHS.
get(), ArgExprs, PT.getOpenLocation());
1877 CalledSignatureHelp =
true;
1878 return PreferredType;
1880 bool ExpressionListIsInvalid =
false;
1881 if (OpKind == tok::l_paren || !LHS.
isInvalid()) {
1882 if (Tok.isNot(tok::r_paren)) {
1883 if ((ExpressionListIsInvalid = ParseExpressionList(ArgExprs, [&] {
1884 PreferredType.enterFunctionArgument(Tok.getLocation(),
1891 if (PP.isCodeCompletionReached() && !CalledSignatureHelp)
1900 }
else if (ExpressionListIsInvalid) {
1901 Expr *
Fn = LHS.
get();
1902 ArgExprs.insert(ArgExprs.begin(), Fn);
1903 LHS = Actions.CreateRecoveryExpr(
Fn->getBeginLoc(), Tok.getLocation(),
1906 }
else if (Tok.isNot(tok::r_paren)) {
1907 bool HadErrors =
false;
1910 for (
auto &E : ArgExprs)
1911 if (E->containsErrors())
1922 Expr *
Fn = LHS.
get();
1923 SourceLocation RParLoc = Tok.getLocation();
1924 LHS = Actions.ActOnCallExpr(
getCurScope(), Fn, Loc, ArgExprs, RParLoc,
1927 ArgExprs.insert(ArgExprs.begin(), Fn);
1929 Actions.CreateRecoveryExpr(
Fn->getBeginLoc(), RParLoc, ArgExprs);
1945 bool MayBePseudoDestructor =
false;
1946 Expr* OrigLHS = !LHS.
isInvalid() ? LHS.
get() :
nullptr;
1948 PreferredType.enterMemAccess(Actions, Tok.getLocation(), OrigLHS);
1951 Expr *
Base = OrigLHS;
1952 const Type* BaseType =
Base->getType().getTypePtrOrNull();
1953 if (BaseType && Tok.is(tok::l_paren) &&
1956 Diag(OpLoc, diag::err_function_is_not_record)
1957 << OpKind <<
Base->getSourceRange()
1959 return ParsePostfixExpressionSuffix(Base);
1962 LHS = Actions.ActOnStartCXXMemberReference(
getCurScope(), Base, OpLoc,
1964 MayBePseudoDestructor);
1969 if (Tok.is(tok::code_completion)) {
1975 ParseOptionalCXXScopeSpecifier(
1977 false, &MayBePseudoDestructor);
1979 ObjectType =
nullptr;
1982 if (Tok.is(tok::code_completion)) {
1984 OpKind == tok::arrow ? tok::period : tok::arrow;
1989 Sema::TentativeAnalysisScope Trap(Actions);
1990 CorrectedLHS = Actions.ActOnStartCXXMemberReference(
1991 getCurScope(), OrigLHS, OpLoc, CorrectedOpKind, ObjectType,
1992 MayBePseudoDestructor);
1996 Expr *CorrectedBase = CorrectedLHS.get();
1998 CorrectedBase =
Base;
2002 Actions.CodeCompletion().CodeCompleteMemberReferenceExpr(
2003 getCurScope(), Base, CorrectedBase, OpLoc, OpKind == tok::arrow,
2004 Base && ExprStatementTokLoc ==
Base->getBeginLoc(),
2005 PreferredType.get(Tok.getLocation()));
2010 if (MayBePseudoDestructor && !LHS.
isInvalid()) {
2011 LHS = ParseCXXPseudoDestructor(LHS.
get(), OpLoc, OpKind, SS,
2023 SourceLocation TemplateKWLoc;
2026 Tok.is(tok::kw_class)) {
2034 IdentifierInfo *Id = Tok.getIdentifierInfo();
2043 false, &TemplateKWLoc, Name)) {
2048 LHS = Actions.ActOnMemberAccessExpr(
getCurScope(), LHS.
get(), OpLoc,
2049 OpKind, SS, TemplateKWLoc, Name,
2050 CurParsedObjCImpl ? CurParsedObjCImpl->Dcl
2053 if (Tok.is(tok::less))
2054 checkPotentialAngleBracket(LHS);
2055 }
else if (OrigLHS && Name.
isValid()) {
2057 LHS = Actions.CreateRecoveryExpr(OrigLHS->
getBeginLoc(),
2063 case tok::minusminus:
2065 Expr *Arg = LHS.
get();
2066 LHS = Actions.ActOnPostfixUnaryOp(
getCurScope(), Tok.getLocation(),
2067 Tok.getKind(), Arg);
2069 LHS = Actions.CreateRecoveryExpr(Arg->
getBeginLoc(),
2070 Tok.getLocation(), Arg);
2079Parser::ParseExprAfterUnaryExprOrTypeTrait(
const Token &OpTok,
2084 assert(OpTok.
isOneOf(tok::kw_typeof, tok::kw_typeof_unqual, tok::kw_sizeof,
2085 tok::kw___datasizeof, tok::kw___alignof, tok::kw_alignof,
2086 tok::kw__Alignof, tok::kw_vec_step,
2087 tok::kw___builtin_omp_required_simd_align,
2088 tok::kw___builtin_vectorelements, tok::kw__Countof) &&
2089 "Not a typeof/sizeof/alignof/vec_step expression!");
2094 if (Tok.isNot(tok::l_paren)) {
2097 if (OpTok.
isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2098 tok::kw_alignof, tok::kw__Alignof)) {
2099 if (isTypeIdUnambiguously()) {
2100 DeclSpec DS(AttrFactory);
2101 ParseSpecifierQualifierList(DS);
2104 ParseDeclarator(DeclaratorInfo);
2106 SourceLocation LParenLoc = PP.getLocForEndOfToken(OpTok.
getLocation());
2107 SourceLocation RParenLoc = PP.getLocForEndOfToken(PrevTokLocation);
2110 diag::err_expected_parentheses_around_typename)
2113 Diag(LParenLoc, diag::err_expected_parentheses_around_typename)
2123 if (OpTok.
isOneOf(tok::kw_typeof, tok::kw_typeof_unqual) &&
2134 if (OpTok.
isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2135 tok::kw_alignof, tok::kw__Alignof, tok::kw__Countof) &&
2136 Tok.isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2137 tok::kw_alignof, tok::kw__Alignof, tok::kw__Countof))
2138 Actions.runWithSufficientStackSpace(Tok.getLocation(), [&] {
2139 Operand = ParseCastExpression(CastParseKind::UnaryExprOnly);
2158 bool ParenKnownToBeNonCast =
2159 OpTok.
isOneOf(tok::kw_typeof, tok::kw_typeof_unqual);
2161 SourceLocation LParenLoc = Tok.getLocation(), RParenLoc;
2163 Operand = ParseParenExpression(
2168 CastRange = SourceRange(LParenLoc, RParenLoc);
2178 !OpTok.
isOneOf(tok::kw_typeof, tok::kw_typeof_unqual)) {
2193ExprResult Parser::ParseSYCLUniqueStableNameExpression() {
2194 assert(Tok.is(tok::kw___builtin_sycl_unique_stable_name) &&
2195 "Not __builtin_sycl_unique_stable_name");
2201 if (T.expectAndConsume(diag::err_expected_lparen_after,
2202 "__builtin_sycl_unique_stable_name"))
2212 if (T.consumeClose())
2215 return Actions.SYCL().ActOnUniqueStableNameExpr(
2216 OpLoc, T.getOpenLocation(), T.getCloseLocation(), Ty.
get());
2219ExprResult Parser::ParseUnaryExprOrTypeTraitExpression() {
2220 assert(Tok.isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2221 tok::kw_alignof, tok::kw__Alignof, tok::kw_vec_step,
2222 tok::kw___builtin_omp_required_simd_align,
2223 tok::kw___builtin_vectorelements, tok::kw__Countof) &&
2224 "Not a sizeof/alignof/vec_step expression!");
2229 if (Tok.is(tok::ellipsis) && OpTok.
is(tok::kw_sizeof)) {
2231 SourceLocation LParenLoc, RParenLoc;
2232 IdentifierInfo *Name =
nullptr;
2233 SourceLocation NameLoc;
2234 if (Tok.is(tok::l_paren)) {
2237 LParenLoc = T.getOpenLocation();
2238 if (Tok.is(tok::identifier)) {
2239 Name = Tok.getIdentifierInfo();
2242 RParenLoc = T.getCloseLocation();
2244 RParenLoc = PP.getLocForEndOfToken(NameLoc);
2246 Diag(Tok, diag::err_expected_parameter_pack);
2249 }
else if (Tok.is(tok::identifier)) {
2250 Name = Tok.getIdentifierInfo();
2252 LParenLoc = PP.getLocForEndOfToken(EllipsisLoc);
2253 RParenLoc = PP.getLocForEndOfToken(NameLoc);
2254 Diag(LParenLoc, diag::err_paren_sizeof_parameter_pack)
2259 Diag(Tok, diag::err_sizeof_parameter_pack);
2269 return Actions.ActOnSizeofParameterPackExpr(
getCurScope(),
2276 OpTok.
isOneOf(tok::kw_alignof, tok::kw__Alignof))
2277 Diag(OpTok, diag::warn_cxx98_compat_alignof);
2279 Diag(OpTok, diag::warn_c23_compat_keyword) << OpTok.
getName();
2281 Diag(OpTok, diag::warn_c2y_compat_keyword) << OpTok.
getName();
2289 SourceRange CastRange;
2297 case tok::kw_alignof:
2298 case tok::kw__Alignof:
2299 ExprKind = UETT_AlignOf;
2301 case tok::kw___alignof:
2302 ExprKind = UETT_PreferredAlignOf;
2304 case tok::kw_vec_step:
2305 ExprKind = UETT_VecStep;
2307 case tok::kw___builtin_omp_required_simd_align:
2308 ExprKind = UETT_OpenMPRequiredSimdAlign;
2310 case tok::kw___datasizeof:
2311 ExprKind = UETT_DataSizeOf;
2313 case tok::kw___builtin_vectorelements:
2314 ExprKind = UETT_VectorElements;
2316 case tok::kw__Countof:
2317 ExprKind = UETT_CountOf;
2320 Diag(OpTok, diag::ext_c2y_feature) << OpTok.
getName();
2327 return Actions.ActOnUnaryExprOrTypeTraitExpr(OpTok.
getLocation(),
2333 if (OpTok.
isOneOf(tok::kw_alignof, tok::kw__Alignof))
2346ExprResult Parser::ParseBuiltinPrimaryExpression() {
2348 const IdentifierInfo *BuiltinII = Tok.getIdentifierInfo();
2354 if (Tok.isNot(tok::l_paren))
2355 return ExprError(
Diag(Tok, diag::err_expected_after) << BuiltinII
2364 default: llvm_unreachable(
"Not a builtin primary expression!");
2365 case tok::kw___builtin_va_arg: {
2368 if (ExpectAndConsume(tok::comma)) {
2375 if (Tok.isNot(tok::r_paren)) {
2376 Diag(Tok, diag::err_expected) << tok::r_paren;
2383 Res = Actions.ActOnVAArg(StartLoc, Expr.get(), Ty.
get(), ConsumeParen());
2386 case tok::kw___builtin_offsetof: {
2387 SourceLocation TypeLoc = Tok.getLocation();
2389 if (Tok.getLocation().isMacroID()) {
2391 Tok.getLocation(), PP.getSourceManager(),
getLangOpts());
2392 if (MacroName ==
"offsetof")
2405 if (ExpectAndConsume(tok::comma)) {
2410 auto TriggerCompletion = [&](
const Designation &D) {
2412 Actions.CodeCompletion().CodeCompleteOffsetOfDesignator(
2413 Actions.GetTypeFromParser(Ty.
get()), D);
2418 if (Tok.is(tok::code_completion)) {
2419 TriggerCompletion(D);
2422 if (Tok.isNot(tok::identifier)) {
2423 Diag(Tok, diag::err_expected) << tok::identifier;
2432 SmallVector<Sema::OffsetOfComponent, 4> Comps;
2434 Comps.push_back(Sema::OffsetOfComponent());
2435 Comps.back().isBrackets =
false;
2436 Comps.back().U.IdentInfo = Tok.getIdentifierInfo();
2437 Comps.back().LocStart = Comps.back().LocEnd = Tok.getLocation();
2439 Tok.getIdentifierInfo(), SourceLocation(), Tok.getLocation()));
2444 if (Tok.is(tok::period)) {
2446 Comps.push_back(Sema::OffsetOfComponent());
2447 Comps.back().isBrackets =
false;
2450 if (Tok.is(tok::code_completion)) {
2451 TriggerCompletion(D);
2454 if (Tok.isNot(tok::identifier)) {
2455 Diag(Tok, diag::err_expected) << tok::identifier;
2459 Comps.back().U.IdentInfo = Tok.getIdentifierInfo();
2460 Comps.back().LocEnd = Tok.getLocation();
2462 Tok.getIdentifierInfo(), Comps.back().LocStart, Tok.getLocation()));
2464 }
else if (Tok.is(tok::l_square)) {
2465 if (CheckProhibitedCXX11Attribute())
2469 Comps.push_back(Sema::OffsetOfComponent());
2470 Comps.back().isBrackets =
true;
2473 Comps.back().LocStart = ST.getOpenLocation();
2479 Comps.back().U.E = Res.
get();
2482 Comps.back().LocEnd = ST.getCloseLocation();
2492 if (Tok.is(tok::code_completion)) {
2496 if (Tok.isNot(tok::r_paren)) {
2503 Res = Actions.ActOnBuiltinOffsetOf(
getCurScope(), StartLoc, TypeLoc,
2505 PT.getCloseLocation());
2512 case tok::kw___builtin_choose_expr: {
2514 if (
Cond.isInvalid()) {
2518 if (ExpectAndConsume(tok::comma)) {
2524 if (Expr1.isInvalid()) {
2528 if (ExpectAndConsume(tok::comma)) {
2534 if (Expr2.isInvalid()) {
2538 if (Tok.isNot(tok::r_paren)) {
2539 Diag(Tok, diag::err_expected) << tok::r_paren;
2542 Res = Actions.ActOnChooseExpr(StartLoc,
Cond.get(), Expr1.get(),
2543 Expr2.get(), ConsumeParen());
2546 case tok::kw___builtin_astype: {
2549 if (Expr.isInvalid()) {
2554 if (ExpectAndConsume(tok::comma)) {
2565 if (Tok.isNot(tok::r_paren)) {
2566 Diag(Tok, diag::err_expected) << tok::r_paren;
2571 Res = Actions.ActOnAsTypeExpr(Expr.get(), DestTy.
get(), StartLoc,
2575 case tok::kw___builtin_convertvector: {
2578 if (Expr.isInvalid()) {
2583 if (ExpectAndConsume(tok::comma)) {
2594 if (Tok.isNot(tok::r_paren)) {
2595 Diag(Tok, diag::err_expected) << tok::r_paren;
2600 Res = Actions.ActOnConvertVectorExpr(Expr.get(), DestTy.
get(), StartLoc,
2604 case tok::kw___builtin_COLUMN:
2605 case tok::kw___builtin_FILE:
2606 case tok::kw___builtin_FILE_NAME:
2607 case tok::kw___builtin_FUNCTION:
2608 case tok::kw___builtin_FUNCSIG:
2609 case tok::kw___builtin_LINE:
2610 case tok::kw___builtin_source_location: {
2612 if (Tok.isNot(tok::r_paren)) {
2613 Diag(Tok, diag::err_expected) << tok::r_paren;
2619 case tok::kw___builtin_FILE:
2621 case tok::kw___builtin_FILE_NAME:
2623 case tok::kw___builtin_FUNCTION:
2625 case tok::kw___builtin_FUNCSIG:
2627 case tok::kw___builtin_LINE:
2629 case tok::kw___builtin_COLUMN:
2631 case tok::kw___builtin_source_location:
2634 llvm_unreachable(
"invalid keyword");
2637 Res = Actions.ActOnSourceLocExpr(Kind, StartLoc, ConsumeParen());
2647 return ParsePostfixExpressionSuffix(Res.
get());
2650bool Parser::tryParseOpenMPArrayShapingCastPart() {
2651 assert(Tok.is(tok::l_square) &&
"Expected open bracket");
2652 bool ErrorFound =
true;
2653 TentativeParsingAction TPA(*
this);
2655 if (Tok.isNot(tok::l_square))
2660 while (!
SkipUntil(tok::r_square, tok::annot_pragma_openmp_end,
2663 if (Tok.isNot(tok::r_square))
2668 if (Tok.is(tok::r_paren)) {
2672 }
while (Tok.isNot(tok::annot_pragma_openmp_end));
2678Parser::ParseParenExpression(
ParenParseOption &ExprType,
bool StopIfCastExpr,
2682 assert(Tok.is(tok::l_paren) &&
"Not a paren expr!");
2685 if (T.consumeOpen())
2687 SourceLocation OpenLoc = T.getOpenLocation();
2689 PreferredType.enterParenExpr(Tok.getLocation(), OpenLoc);
2692 bool isAmbiguousTypeId;
2695 if (Tok.is(tok::code_completion)) {
2697 Actions.CodeCompletion().CodeCompleteExpression(
2698 getCurScope(), PreferredType.get(Tok.getLocation()),
2705 Tok.isOneOf(tok::kw___bridge,
2706 tok::kw___bridge_transfer,
2707 tok::kw___bridge_retained,
2708 tok::kw___bridge_retain));
2709 if (BridgeCast && !
getLangOpts().ObjCAutoRefCount) {
2711 StringRef BridgeCastName = Tok.getName();
2713 if (!PP.getSourceManager().isInSystemHeader(BridgeKeywordLoc))
2714 Diag(BridgeKeywordLoc, diag::warn_arc_bridge_cast_nonarc)
2724 Diag(Tok, OpenLoc.
isMacroID() ? diag::ext_gnu_statement_expr_macro
2725 : diag::ext_gnu_statement_expr);
2727 checkCompoundToken(OpenLoc, tok::l_paren, CompoundToken::StmtExprBegin);
2735 DeclContext *CodeDC = Actions.CurContext;
2739 "statement expr not in code context");
2741 Sema::ContextRAII SavedContext(Actions, CodeDC,
false);
2743 Actions.ActOnStartStmtExpr();
2745 StmtResult Stmt(ParseCompoundStatement(
true));
2749 if (!Stmt.isInvalid()) {
2753 Actions.ActOnStmtExprError();
2762 if (tokenKind == tok::kw___bridge)
2764 else if (tokenKind == tok::kw___bridge_transfer)
2766 else if (tokenKind == tok::kw___bridge_retained)
2771 assert(tokenKind == tok::kw___bridge_retain);
2773 if (!PP.getSourceManager().isInSystemHeader(BridgeKeywordLoc))
2774 Diag(BridgeKeywordLoc, diag::err_arc_bridge_retain)
2776 "__bridge_retained");
2781 ColonProtection.restore();
2782 RParenLoc = T.getCloseLocation();
2784 PreferredType.enterTypeCast(Tok.getLocation(), Ty.
get().
get());
2790 return Actions.ObjC().ActOnObjCBridgedCast(
getCurScope(), OpenLoc, Kind,
2791 BridgeKeywordLoc, Ty.
get(),
2792 RParenLoc, SubExpr.
get());
2794 isTypeIdInParens(isAmbiguousTypeId)) {
2803 if (isAmbiguousTypeId && !StopIfCastExpr) {
2804 ExprResult res = ParseCXXAmbiguousParenExpression(ExprType, CastTy, T,
2806 RParenLoc = T.getCloseLocation();
2811 DeclSpec DS(AttrFactory);
2812 ParseSpecifierQualifierList(DS);
2815 ParseDeclarator(DeclaratorInfo);
2820 if (!DeclaratorInfo.isInvalidType() && Tok.is(tok::identifier) &&
2826 Ty = Actions.ActOnTypeName(DeclaratorInfo);
2828 Result = ParseObjCMessageExpressionBody(SourceLocation(),
2834 ColonProtection.restore();
2835 RParenLoc = T.getCloseLocation();
2841 Ty = Actions.ActOnTypeName(DeclaratorInfo);
2843 return ParseCompoundLiteralExpression(Ty.
get(), OpenLoc, RParenLoc);
2853 Ty = Actions.ActOnTypeName(DeclaratorInfo);
2867 Result = ParseCastExpression(
2873 if (!
Result.isInvalid()) {
2875 DeclaratorInfo, CastTy,
2876 RParenLoc,
Result.get());
2880 if (!
Result.isInvalid()) {
2892 if (DeclaratorInfo.isInvalidType())
2897 if (StopIfCastExpr) {
2901 Ty = Actions.ActOnTypeName(DeclaratorInfo);
2909 Tok.getIdentifierInfo() == Ident_super &&
2912 Diag(Tok.getLocation(), diag::err_illegal_super_cast)
2913 << SourceRange(OpenLoc, RParenLoc);
2917 PreferredType.enterTypeCast(Tok.getLocation(), CastTy.
get());
2920 Result = ParseCastExpression(
2924 if (!
Result.isInvalid()) {
2926 DeclaratorInfo, CastTy,
2927 RParenLoc,
Result.get());
2932 Diag(Tok, diag::err_expected_lbrace_in_compound_literal);
2943 ExprVector ArgExprs;
2945 if (!ParseSimpleExpressionList(ArgExprs)) {
2949 isFoldOperator(Tok.getKind()) &&
NextToken().
is(tok::ellipsis)) {
2951 return ParseFoldExpression(ArgExprs[0], T);
2955 Result = Actions.ActOnParenListExpr(OpenLoc, Tok.getLocation(),
2958 }
else if (
getLangOpts().OpenMP >= 50 && OpenMPDirectiveParsing &&
2960 tryParseOpenMPArrayShapingCastPart()) {
2961 bool ErrorFound =
false;
2962 SmallVector<Expr *, 4> OMPDimensions;
2963 SmallVector<SourceRange, 4> OMPBracketsRanges;
2970 while (!
SkipUntil(tok::r_square, tok::r_paren,
2975 OMPDimensions.push_back(NumElements.
get());
2976 OMPBracketsRanges.push_back(TS.getRange());
2977 }
while (Tok.isNot(tok::r_paren));
2980 RParenLoc = T.getCloseLocation();
2984 }
else if (!
Result.isInvalid()) {
2985 Result = Actions.OpenMP().ActOnOMPArrayShapingExpr(
2986 Result.get(), OpenLoc, RParenLoc, OMPDimensions, OMPBracketsRanges);
2994 isFoldOperator(Tok.getKind()) &&
NextToken().
is(tok::ellipsis)) {
2996 return ParseFoldExpression(
Result, T);
3001 if (!
Result.isInvalid() && Tok.is(tok::r_paren))
3003 Actions.ActOnParenExpr(OpenLoc, Tok.getLocation(),
Result.get());
3007 if (
Result.isInvalid()) {
3013 RParenLoc = T.getCloseLocation();
3018Parser::ParseCompoundLiteralExpression(
ParsedType Ty,
3021 assert(Tok.is(tok::l_brace) &&
"Not a compound literal!");
3023 Diag(LParenLoc, diag::ext_c99_compound_literal);
3024 PreferredType.enterTypeCast(Tok.getLocation(), Ty.
get());
3026 if (!
Result.isInvalid() && Ty)
3027 return Actions.ActOnCompoundLiteral(LParenLoc, Ty, RParenLoc,
Result.get());
3044 "Not a string-literal-like token!");
3052 StringToks.push_back(
Tok);
3057 assert(!AllowUserDefinedLiteral &&
"UDL are always evaluated");
3062 return Actions.ActOnStringLiteral(StringToks,
3067ExprResult Parser::ParseGenericSelectionExpression() {
3068 assert(Tok.is(tok::kw__Generic) &&
"_Generic keyword expected");
3070 diagnoseUseOfC11Keyword(Tok);
3074 if (T.expectAndConsume())
3081 if (isTypeIdForGenericSelection()) {
3088 SourceLocation Loc = LIT->getTypeSourceInfo()->getTypeLoc().getBeginLoc();
3090 : diag::ext_c2y_generic_with_type_arg);
3103 if (ExpectAndConsume(tok::comma)) {
3108 SourceLocation DefaultLoc;
3109 SmallVector<ParsedType, 12> Types;
3113 if (Tok.is(tok::kw_default)) {
3117 Diag(Tok, diag::err_duplicate_default_assoc);
3118 Diag(DefaultLoc, diag::note_previous_default_assoc);
3133 Types.push_back(Ty);
3135 if (ExpectAndConsume(tok::colon)) {
3147 Exprs.push_back(ER.
get());
3151 if (T.getCloseLocation().isInvalid())
3154 void *ExprOrTy = ControllingExpr.
isUsable()
3155 ? ControllingExpr.
get()
3158 return Actions.ActOnGenericSelectionExpr(
3159 KeyLoc, DefaultLoc, T.getCloseLocation(), ControllingExpr.
isUsable(),
3160 ExprOrTy, Types, Exprs);
3171 SourceLocation FirstOpLoc;
3173 Kind = Tok.getKind();
3174 assert(isFoldOperator(Kind) &&
"missing fold-operator");
3178 assert(Tok.is(tok::ellipsis) &&
"not a fold-expression");
3182 if (Tok.isNot(tok::r_paren)) {
3183 if (!isFoldOperator(Tok.getKind()))
3184 return Diag(Tok.getLocation(), diag::err_expected_fold_operator);
3186 if (Kind != tok::unknown && Tok.getKind() != Kind)
3187 Diag(Tok.getLocation(), diag::err_fold_operator_mismatch)
3188 << SourceRange(FirstOpLoc);
3189 Kind = Tok.getKind();
3200 ? diag::warn_cxx14_compat_fold_expression
3201 : diag::ext_fold_expression);
3205 Kind, EllipsisLoc, RHS.
get(),
3209void Parser::injectEmbedTokens() {
3210 EmbedAnnotationData *
Data =
3211 reinterpret_cast<EmbedAnnotationData *
>(Tok.getAnnotationValue());
3212 MutableArrayRef<Token> Toks(PP.getPreprocessorAllocator().Allocate<Token>(
3213 Data->BinaryData.size() * 2 - 1),
3214 Data->BinaryData.size() * 2 - 1);
3216 for (
auto &Byte :
Data->BinaryData) {
3217 Toks[I].startToken();
3218 Toks[I].setKind(tok::binary_data);
3219 Toks[I].setLocation(Tok.getLocation());
3220 Toks[I].setLength(1);
3221 Toks[I].setLiteralData(&Byte);
3222 if (I != ((
Data->BinaryData.size() - 1) * 2)) {
3223 Toks[I + 1].startToken();
3224 Toks[I + 1].setKind(tok::comma);
3225 Toks[I + 1].setLocation(Tok.getLocation());
3229 PP.EnterTokenStream(std::move(Toks),
true,
3235 llvm::function_ref<
void()> ExpressionStarts,
3236 bool FailImmediatelyOnInvalidExpr) {
3237 bool SawError =
false;
3239 if (ExpressionStarts)
3244 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
3245 Expr = ParseBraceInitializer();
3249 if (Tok.is(tok::ellipsis))
3251 else if (Tok.is(tok::code_completion)) {
3263 if (FailImmediatelyOnInvalidExpr)
3267 Exprs.push_back(Expr.
get());
3270 if (Tok.isNot(tok::comma))
3275 checkPotentialAngleBracketDelimiter(Comma);
3286 Exprs.push_back(Expr.
get());
3290 if (Tok.isNot(tok::comma) ||
NextToken().
is(tok::ellipsis))
3296 checkPotentialAngleBracketDelimiter(Comma);
3301 if (Tok.is(tok::code_completion)) {
3303 Actions.CodeCompletion().CodeCompleteOrdinaryName(
3309 DeclSpec DS(AttrFactory);
3310 ParseSpecifierQualifierList(DS);
3316 ParseDeclarator(DeclaratorInfo);
3318 MaybeParseGNUAttributes(DeclaratorInfo);
3321 Actions.ActOnBlockArguments(CaretLoc, DeclaratorInfo,
getCurScope());
3324ExprResult Parser::ParseBlockLiteralExpression() {
3325 assert(Tok.is(tok::caret) &&
"block literal starts with ^");
3328 PrettyStackTraceLoc CrashInfo(PP.getSourceManager(), CaretLoc,
3329 "block literal parsing");
3342 DeclSpec DS(AttrFactory);
3348 ParamInfo.SetSourceRange(SourceRange(Tok.getLocation(), Tok.getLocation()));
3352 if (Tok.is(tok::l_paren)) {
3353 ParseParenDeclarator(ParamInfo);
3357 SourceLocation Tmp = ParamInfo.getSourceRange().getEnd();
3358 ParamInfo.SetIdentifier(
nullptr, CaretLoc);
3359 ParamInfo.SetRangeEnd(Tmp);
3360 if (ParamInfo.isInvalidType()) {
3368 MaybeParseGNUAttributes(ParamInfo);
3371 Actions.ActOnBlockArguments(CaretLoc, ParamInfo,
getCurScope());
3372 }
else if (!Tok.is(tok::l_brace)) {
3373 ParseBlockId(CaretLoc);
3376 SourceLocation NoLoc;
3377 ParamInfo.AddTypeInfo(
3395 CaretLoc, ParamInfo),
3398 MaybeParseGNUAttributes(ParamInfo);
3401 Actions.ActOnBlockArguments(CaretLoc, ParamInfo,
getCurScope());
3406 if (!Tok.is(tok::l_brace)) {
3408 Diag(Tok, diag::err_expected_expression);
3412 EnterExpressionEvaluationContextForFunction PotentiallyEvaluated(
3414 StmtResult Stmt(ParseCompoundStatementBody());
3416 if (!Stmt.isInvalid())
3425 return Actions.ObjC().ActOnObjCBoolLiteral(
ConsumeToken(), Kind);
3432 llvm::SmallSet<StringRef, 4> Platforms;
3433 bool HasOtherPlatformSpec =
false;
3435 for (
const auto &Spec : AvailSpecs) {
3436 if (Spec.isOtherPlatformSpec()) {
3437 if (HasOtherPlatformSpec) {
3438 P.
Diag(Spec.getBeginLoc(), diag::err_availability_query_repeated_star);
3442 HasOtherPlatformSpec =
true;
3446 bool Inserted = Platforms.insert(Spec.getPlatform()).second;
3451 StringRef Platform = Spec.getPlatform();
3452 P.
Diag(Spec.getBeginLoc(), diag::err_availability_query_repeated_platform)
3453 << Spec.getEndLoc() << Platform;
3458 if (!HasOtherPlatformSpec) {
3459 SourceLocation InsertWildcardLoc = AvailSpecs.back().getEndLoc();
3460 P.
Diag(InsertWildcardLoc, diag::err_availability_query_wildcard_required)
3468std::optional<AvailabilitySpec> Parser::ParseAvailabilitySpec() {
3469 if (Tok.is(tok::star)) {
3473 if (Tok.is(tok::code_completion)) {
3475 Actions.CodeCompletion().CodeCompleteAvailabilityPlatformName();
3476 return std::nullopt;
3478 if (Tok.isNot(tok::identifier)) {
3479 Diag(Tok, diag::err_avail_query_expected_platform_name);
3480 return std::nullopt;
3483 IdentifierLoc *PlatformIdentifier = ParseIdentifierLoc();
3484 SourceRange VersionRange;
3485 VersionTuple Version = ParseVersionTuple(VersionRange);
3487 if (Version.empty())
3488 return std::nullopt;
3490 StringRef GivenPlatform =
3492 StringRef Platform =
3493 AvailabilityAttr::canonicalizePlatformName(GivenPlatform);
3495 if (AvailabilityAttr::getPrettyPlatformName(Platform).empty() ||
3496 (GivenPlatform.contains(
"xros") || GivenPlatform.contains(
"xrOS"))) {
3498 diag::err_avail_query_unrecognized_platform_name)
3500 return std::nullopt;
3504 if (Platform ==
"anyappleos" &&
3507 diag::err_avail_query_anyappleos_min_version)
3508 << Version.getAsString();
3509 return std::nullopt;
3512 return AvailabilitySpec(Version, Platform, PlatformIdentifier->
getLoc(),
3518 assert(Tok.is(tok::kw___builtin_available) ||
3519 Tok.isObjCAtKeyword(tok::objc_available));
3525 if (
Parens.expectAndConsume())
3528 SmallVector<AvailabilitySpec, 4> AvailSpecs;
3529 bool HasError =
false;
3531 std::optional<AvailabilitySpec> Spec = ParseAvailabilitySpec();
3535 AvailSpecs.push_back(*Spec);
3548 if (
Parens.consumeClose())
3551 return Actions.ObjC().ActOnObjCAvailabilityCheckExpr(
3552 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
void AddDesignator(Designator D)
AddDesignator - Add a designator to the end of this list.
static Designator CreateArrayDesignator(Expr *Index, SourceLocation LBracketLoc)
Creates an array designator.
void setRBracketLoc(SourceLocation RBracketLoc) const
static Designator CreateFieldDesignator(const IdentifierInfo *FieldName, SourceLocation DotLoc, SourceLocation FieldLoc)
Creates a field designator.
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.