42#include "llvm/ADT/SmallVector.h"
136 return ParseRHSOfBinaryExpression(LHS,
prec::Comma);
147 return ParseRHSOfBinaryExpression(LHS,
prec::Comma);
154Parser::ParseExpressionWithLeadingExtension(
SourceLocation ExtLoc) {
160 LHS = ParseCastExpression(AnyCastExpr);
163 if (!LHS.isInvalid())
167 return ParseRHSOfBinaryExpression(LHS,
prec::Comma);
172 if (Tok.
is(tok::code_completion)) {
179 if (Tok.
is(tok::kw_throw))
180 return ParseThrowExpression();
181 if (Tok.
is(tok::kw_co_yield))
182 return ParseCoyieldExpression();
184 ExprResult LHS = ParseCastExpression(AnyCastExpr,
191 if (Tok.
is(tok::code_completion)) {
213Parser::ParseAssignmentExprWithObjCMessageExprStart(
SourceLocation LBracLoc,
216 Expr *ReceiverExpr) {
218 = ParseObjCMessageExpressionBody(LBracLoc, SuperLoc,
219 ReceiverType, ReceiverExpr);
220 R = ParsePostfixExpressionSuffix(R);
228 "Call this function only if your ExpressionEvaluationContext is "
229 "already ConstantEvaluated");
230 ExprResult LHS(ParseCastExpression(AnyCastExpr,
false, isTypeCast));
250 Actions.
ExprEvalContexts.back().InConditionallyConstantEvaluateContext =
true;
266 if (!
Iter->isUnevaluated())
268 Iter->InConditionallyConstantEvaluateContext =
true;
290 ExprResult LHS(ParseCastExpression(AnyCastExpr));
312 bool NotPrimaryExpression =
false;
313 auto ParsePrimary = [&] () {
314 ExprResult E = ParseCastExpression(PrimaryExprOnly,
318 &NotPrimaryExpression);
322 E = ParsePostfixExpressionSuffix(
E);
329 ? diag::note_unparenthesized_non_primary_expr_in_requires_clause
330 : diag::err_unparenthesized_non_primary_expr_in_requires_clause)
338 if (NotPrimaryExpression ||
345 Tok.
isOneOf(tok::period, tok::plusplus, tok::minusminus) ||
346 (Tok.
is(tok::l_square) && !
NextToken().is(tok::l_square))) {
347 E = RecoverFromNonPrimary(
E,
false);
350 NotPrimaryExpression =
false;
352 bool PossibleNonPrimary;
353 bool IsConstraintExpr =
355 IsTrailingRequiresClause);
356 if (!IsConstraintExpr || PossibleNonPrimary) {
361 if (PossibleNonPrimary)
362 E = RecoverFromNonPrimary(
E, !IsConstraintExpr);
371 while (Tok.
is(tok::ampamp)) {
379 tok::ampamp, LHS.
get(), RHS.
get());
405 while (Tok.
is(tok::pipepipe)) {
414 tok::pipepipe, LHS.
get(), RHS.
get());
425bool Parser::isNotExpressionStart() {
427 if (K == tok::l_brace || K == tok::r_brace ||
428 K == tok::kw_for || K == tok::kw_while ||
429 K == tok::kw_if || K == tok::kw_else ||
430 K == tok::kw_goto || K == tok::kw_try)
433 return isKnownToBeDeclarationSpecifier();
436bool Parser::isFoldOperator(
prec::Level Level)
const {
450 GreaterThanIsOperator,
454 auto SavedType = PreferredType;
457 PreferredType = SavedType;
461 if (NextTokPrec < MinPrec)
470 if (OpToken.
isOneOf(tok::comma, tok::greater, tok::greatergreater,
471 tok::greatergreatergreater) &&
472 checkPotentialAngleBracketDelimiter(OpToken))
480 if (OpToken.
is(tok::comma) && isNotExpressionStart()) {
488 if (isFoldOperator(NextTokPrec) && Tok.
is(tok::ellipsis)) {
502 Tok.
isOneOf(tok::colon, tok::r_square) &&
515 TernaryMiddle = ParseBraceInitializer();
516 if (!TernaryMiddle.isInvalid()) {
517 Diag(BraceLoc, diag::err_init_list_bin_op)
522 }
else if (Tok.
isNot(tok::colon)) {
534 TernaryMiddle =
nullptr;
535 Diag(Tok, diag::ext_gnu_conditional_expr);
538 if (TernaryMiddle.isInvalid()) {
541 TernaryMiddle =
nullptr;
550 const char *FIText =
": ";
554 bool IsInvalid =
false;
555 const char *SourcePtr =
557 if (!IsInvalid && *SourcePtr ==
' ') {
560 if (!IsInvalid && *SourcePtr ==
' ') {
567 Diag(Tok, diag::err_expected)
569 Diag(OpToken, diag::note_matching) << tok::question;
587 bool RHSIsInitList =
false;
589 RHS = ParseBraceInitializer();
590 RHSIsInitList =
true;
594 RHS = ParseCastExpression(AnyCastExpr);
600 if (TernaryMiddle.isUsable())
617 if (ThisPrec < NextTokPrec ||
618 (ThisPrec == NextTokPrec && isRightAssoc)) {
620 Diag(Tok, diag::err_init_list_bin_op)
629 RHS = ParseRHSOfBinaryExpression(RHS,
630 static_cast<prec::Level>(ThisPrec + !isRightAssoc));
631 RHSIsInitList =
false;
637 if (TernaryMiddle.isUsable())
648 Diag(OpToken, diag::warn_cxx98_compat_generalized_initializer_lists)
650 }
else if (ColonLoc.
isValid()) {
651 Diag(ColonLoc, diag::err_init_list_bin_op)
656 Diag(OpToken, diag::err_init_list_bin_op)
666 if (TernaryMiddle.isInvalid()) {
670 if (!GreaterThanIsOperator && OpToken.
is(tok::greatergreater))
672 diag::warn_cxx11_right_shift_in_template_arg,
682 {LHS.get(), RHS.get()});
690 std::vector<clang::Expr *> Args;
692 if (TernaryMiddle.get())
693 Args = {LHS.
get(), TernaryMiddle.get(), RHS.
get()};
695 Args = {LHS.
get(), RHS.
get()};
723ExprResult Parser::ParseCastExpression(CastParseKind ParseKind,
724 bool isAddressOfOperand,
725 TypeCastState isTypeCast,
726 bool isVectorLiteral,
727 bool *NotPrimaryExpression) {
729 ExprResult Res = ParseCastExpression(ParseKind,
734 NotPrimaryExpression);
736 Diag(Tok, diag::err_expected_expression);
743 CastExpressionIdValidator(
Token Next,
bool AllowTypes,
bool AllowNonTypes)
744 : NextToken(Next), AllowNonTypes(AllowNonTypes) {
745 WantTypeSpecifiers = WantFunctionLikeCasts = AllowTypes;
748 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
753 if (isa<TypeDecl>(ND))
754 return WantTypeSpecifiers;
759 if (!NextToken.isOneOf(tok::equal, tok::arrow, tok::period))
762 for (
auto *
C : candidate) {
764 if (isa<ValueDecl>(ND) && !isa<FunctionDecl>(ND))
770 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
771 return std::make_unique<CastExpressionIdValidator>(*
this);
782 if (RevertibleTypeTraits.empty()) {
786#define RTT_JOIN(X, Y) X##Y
787#define REVERTIBLE_TYPE_TRAIT(Name) \
788 RevertibleTypeTraits[PP.getIdentifierInfo(#Name)] = RTT_JOIN(tok::kw_, Name)
846#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) \
847 REVERTIBLE_TYPE_TRAIT(RTT_JOIN(__, Trait));
848#include "clang/Basic/TransformTypeTraits.def"
849#undef REVERTIBLE_TYPE_TRAIT
852 llvm::SmallDenseMap<IdentifierInfo *, tok::TokenKind>::iterator Known =
853 RevertibleTypeTraits.find(II);
854 if (Known != RevertibleTypeTraits.end()) {
856 *
Kind = Known->second;
862ExprResult Parser::ParseBuiltinPtrauthTypeDiscriminator() {
866 if (
T.expectAndConsume())
878 Loc, UETT_PtrAuthTypeDiscriminator,
1065ExprResult Parser::ParseCastExpression(CastParseKind ParseKind,
1066 bool isAddressOfOperand,
1068 TypeCastState isTypeCast,
1069 bool isVectorLiteral,
1070 bool *NotPrimaryExpression) {
1073 auto SavedType = PreferredType;
1074 NotCastExpr =
false;
1079 bool AllowSuffix =
true;
1091 switch (SavedKind) {
1092 case tok::l_paren: {
1095 ParenParseOption ParenExprType;
1096 switch (ParseKind) {
1097 case CastParseKind::UnaryExprOnly:
1100 case CastParseKind::AnyCastExpr:
1101 ParenExprType = ParenParseOption::CastExpr;
1103 case CastParseKind::PrimaryExprOnly:
1104 ParenExprType = FoldExpr;
1109 Res = ParseParenExpression(ParenExprType,
false,
1110 isTypeCast ==
IsTypeCast, CastTy, RParenLoc);
1115 if (isVectorLiteral)
1118 switch (ParenExprType) {
1119 case SimpleExpr:
break;
1121 case CompoundLiteral:
1139 case tok::numeric_constant:
1140 case tok::binary_data:
1150 Res = ParseCXXBoolLiteral();
1153 case tok::kw___objc_yes:
1154 case tok::kw___objc_no:
1155 Res = ParseObjCBoolLiteral();
1158 case tok::kw_nullptr:
1160 Diag(Tok, diag::warn_cxx98_compat_nullptr);
1163 : diag::ext_c_nullptr) << Tok.
getName();
1168 case tok::annot_primary_expr:
1169 case tok::annot_overload_set:
1170 Res = getExprAnnotation(Tok);
1173 ConsumeAnnotationToken();
1175 checkPotentialAngleBracket(Res);
1178 case tok::annot_non_type:
1179 case tok::annot_non_type_dependent:
1180 case tok::annot_non_type_undeclared: {
1183 Res = tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement);
1185 "should not perform typo correction on annotation token");
1189 case tok::annot_embed: {
1190 injectEmbedTokens();
1191 return ParseCastExpression(ParseKind, isAddressOfOperand, isTypeCast,
1192 isVectorLiteral, NotPrimaryExpression);
1195 case tok::kw___super:
1196 case tok::kw_decltype:
1200 assert(Tok.
isNot(tok::kw_decltype) && Tok.
isNot(tok::kw___super));
1201 return ParseCastExpression(ParseKind, isAddressOfOperand, isTypeCast,
1202 isVectorLiteral, NotPrimaryExpression);
1204 case tok::identifier:
1215 if (Next.is(tok::ellipsis) && Tok.
is(tok::identifier) &&
1216 GetLookAheadToken(2).is(tok::l_square)) {
1221 Tok.
isOneOf(tok::annot_pack_indexing_type, tok::annot_cxxscope))
1222 return ParseCastExpression(ParseKind, isAddressOfOperand, isTypeCast,
1223 isVectorLiteral, NotPrimaryExpression);
1229 else if (Next.is(tok::l_paren) && Tok.
is(tok::identifier) &&
1233 if (isRevertibleTypeTrait(II, &Kind)) {
1235 return ParseCastExpression(ParseKind, isAddressOfOperand,
1236 NotCastExpr, isTypeCast,
1237 isVectorLiteral, NotPrimaryExpression);
1241 else if ((!ColonIsSacred && Next.is(tok::colon)) ||
1242 Next.isOneOf(tok::coloncolon, tok::less, tok::l_paren,
1247 if (!Tok.
is(tok::identifier))
1248 return ParseCastExpression(ParseKind, isAddressOfOperand,
1249 NotCastExpr, isTypeCast,
1251 NotPrimaryExpression);
1264 (&II == Ident_super &&
getCurScope()->isInObjcMethodScope()))) {
1267 if (Tok.
is(tok::code_completion) && &II != Ident_super) {
1270 getCurScope(), II, ILoc, ExprStatementTokLoc == ILoc);
1274 if (Tok.
isNot(tok::identifier) &&
1276 Diag(Tok, diag::err_expected_property_name);
1291 if (
getLangOpts().
ObjC && &II == Ident_super && !InMessageExpression &&
1293 ((Tok.
is(tok::identifier) &&
1295 Tok.
is(tok::code_completion))) {
1296 Res = ParseObjCMessageExpressionBody(
SourceLocation(), ILoc,
nullptr,
1307 ((Tok.
is(tok::identifier) && !InMessageExpression) ||
1308 Tok.
is(tok::code_completion))) {
1310 if (Tok.
is(tok::code_completion) ||
1311 Next.is(tok::colon) || Next.is(tok::r_square))
1313 if (Typ.get()->isObjCObjectOrInterfaceType()) {
1316 DS.SetRangeStart(ILoc);
1317 DS.SetRangeEnd(ILoc);
1318 const char *PrevSpec =
nullptr;
1320 DS.SetTypeSpecType(
TST_typename, ILoc, PrevSpec, DiagID, Typ,
1337 if (isAddressOfOperand && isPostfixExpressionSuffixStart())
1338 isAddressOfOperand =
false;
1347 CastExpressionIdValidator Validator(
1351 Validator.IsAddressOfOperand = isAddressOfOperand;
1352 if (Tok.
isOneOf(tok::periodstar, tok::arrowstar)) {
1353 Validator.WantExpressionKeywords =
false;
1354 Validator.WantRemainingKeywords =
false;
1356 Validator.WantRemainingKeywords = Tok.
isNot(tok::r_paren);
1358 Name.setIdentifier(&II, ILoc);
1360 getCurScope(), ScopeSpec, TemplateKWLoc, Name, Tok.
is(tok::l_paren),
1361 isAddressOfOperand, &Validator,
1363 Tok.
is(tok::r_paren) ?
nullptr : &Replacement);
1365 UnconsumeToken(Replacement);
1366 return ParseCastExpression(ParseKind, isAddressOfOperand,
1367 NotCastExpr, isTypeCast,
1369 NotPrimaryExpression);
1371 Res = tryParseCXXPackIndexingExpression(Res);
1373 checkPotentialAngleBracket(Res);
1376 case tok::char_constant:
1377 case tok::wide_char_constant:
1378 case tok::utf8_char_constant:
1379 case tok::utf16_char_constant:
1380 case tok::utf32_char_constant:
1384 case tok::kw___func__:
1385 case tok::kw___FUNCTION__:
1386 case tok::kw___FUNCDNAME__:
1387 case tok::kw___FUNCSIG__:
1388 case tok::kw_L__FUNCTION__:
1389 case tok::kw_L__FUNCSIG__:
1390 case tok::kw___PRETTY_FUNCTION__:
1402 case tok::string_literal:
1403 case tok::wide_string_literal:
1404 case tok::utf8_string_literal:
1405 case tok::utf16_string_literal:
1406 case tok::utf32_string_literal:
1409 case tok::kw__Generic:
1410 Res = ParseGenericSelectionExpression();
1412 case tok::kw___builtin_available:
1413 Res = ParseAvailabilityCheckExpr(Tok.
getLocation());
1415 case tok::kw___builtin_va_arg:
1416 case tok::kw___builtin_offsetof:
1417 case tok::kw___builtin_choose_expr:
1418 case tok::kw___builtin_astype:
1419 case tok::kw___builtin_convertvector:
1420 case tok::kw___builtin_COLUMN:
1421 case tok::kw___builtin_FILE:
1422 case tok::kw___builtin_FILE_NAME:
1423 case tok::kw___builtin_FUNCTION:
1424 case tok::kw___builtin_FUNCSIG:
1425 case tok::kw___builtin_LINE:
1426 case tok::kw___builtin_source_location:
1427 if (NotPrimaryExpression)
1428 *NotPrimaryExpression =
true;
1430 return ParseBuiltinPrimaryExpression();
1431 case tok::kw___null:
1436 case tok::minusminus: {
1437 if (NotPrimaryExpression)
1438 *NotPrimaryExpression =
true;
1443 Token SavedTok = Tok;
1452 UnaryExprOnly : AnyCastExpr,
1459 UnconsumeToken(SavedTok);
1473 if (NotPrimaryExpression)
1474 *NotPrimaryExpression =
true;
1479 Res = ParseCastExpression(AnyCastExpr,
true);
1495 case tok::kw___real:
1496 case tok::kw___imag: {
1497 if (NotPrimaryExpression)
1498 *NotPrimaryExpression =
true;
1501 Res = ParseCastExpression(AnyCastExpr);
1505 isAddressOfOperand);
1512 case tok::kw_co_await: {
1513 if (NotPrimaryExpression)
1514 *NotPrimaryExpression =
true;
1516 Res = ParseCastExpression(AnyCastExpr);
1522 case tok::kw___extension__:{
1524 if (NotPrimaryExpression)
1525 *NotPrimaryExpression =
true;
1528 Res = ParseCastExpression(AnyCastExpr);
1533 case tok::kw__Alignof:
1534 diagnoseUseOfC11Keyword(Tok);
1536 case tok::kw_alignof:
1537 case tok::kw___alignof:
1539 case tok::kw_sizeof:
1543 case tok::kw___datasizeof:
1544 case tok::kw_vec_step:
1546 case tok::kw___builtin_omp_required_simd_align:
1547 case tok::kw___builtin_vectorelements:
1548 if (NotPrimaryExpression)
1549 *NotPrimaryExpression =
true;
1550 AllowSuffix =
false;
1551 Res = ParseUnaryExprOrTypeTraitExpression();
1554 if (NotPrimaryExpression)
1555 *NotPrimaryExpression =
true;
1557 if (Tok.
isNot(tok::identifier))
1558 return ExprError(
Diag(Tok, diag::err_expected) << tok::identifier);
1561 return ExprError(
Diag(Tok, diag::err_address_of_label_outside_fn));
1563 Diag(AmpAmpLoc, diag::ext_gnu_address_of_label);
1568 AllowSuffix =
false;
1571 case tok::kw_const_cast:
1572 case tok::kw_dynamic_cast:
1573 case tok::kw_reinterpret_cast:
1574 case tok::kw_static_cast:
1575 case tok::kw_addrspace_cast:
1576 if (NotPrimaryExpression)
1577 *NotPrimaryExpression =
true;
1578 Res = ParseCXXCasts();
1580 case tok::kw___builtin_bit_cast:
1581 if (NotPrimaryExpression)
1582 *NotPrimaryExpression =
true;
1583 Res = ParseBuiltinBitCast();
1585 case tok::kw_typeid:
1586 if (NotPrimaryExpression)
1587 *NotPrimaryExpression =
true;
1588 Res = ParseCXXTypeid();
1590 case tok::kw___uuidof:
1591 if (NotPrimaryExpression)
1592 *NotPrimaryExpression =
true;
1593 Res = ParseCXXUuidof();
1596 Res = ParseCXXThis();
1598 case tok::kw___builtin_sycl_unique_stable_name:
1599 Res = ParseSYCLUniqueStableNameExpression();
1602 case tok::annot_typename:
1603 if (isStartOfObjCClassMessageMissingOpenBracket()) {
1611 const char *PrevSpec =
nullptr;
1614 PrevSpec, DiagID,
Type,
1623 ConsumeAnnotationToken();
1630 case tok::annot_decltype:
1631 case tok::annot_pack_indexing_type:
1633 case tok::kw_wchar_t:
1634 case tok::kw_char8_t:
1635 case tok::kw_char16_t:
1636 case tok::kw_char32_t:
1641 case tok::kw___int64:
1642 case tok::kw___int128:
1643 case tok::kw__ExtInt:
1644 case tok::kw__BitInt:
1645 case tok::kw_signed:
1646 case tok::kw_unsigned:
1649 case tok::kw_double:
1650 case tok::kw___bf16:
1651 case tok::kw__Float16:
1652 case tok::kw___float128:
1653 case tok::kw___ibm128:
1656 case tok::kw_typename:
1657 case tok::kw_typeof:
1658 case tok::kw___vector:
1659 case tok::kw__Accum:
1660 case tok::kw__Fract:
1662#define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t:
1663#include "clang/Basic/OpenCLImageTypes.def"
1664#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case tok::kw_##Name:
1665#include "clang/Basic/HLSLIntangibleTypes.def"
1668 Diag(Tok, diag::err_expected_expression);
1673 if (NotPrimaryExpression)
1674 *NotPrimaryExpression =
true;
1676 if (SavedKind == tok::kw_typename) {
1693 ParseCXXSimpleTypeSpecifier(DS);
1694 if (Tok.
isNot(tok::l_paren) &&
1696 return ExprError(
Diag(Tok, diag::err_expected_lparen_after_type)
1697 << DS.getSourceRange());
1699 if (Tok.
is(tok::l_brace))
1700 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
1702 Res = ParseCXXTypeConstructExpression(DS);
1706 case tok::annot_cxxscope: {
1711 if (!Tok.
is(tok::annot_cxxscope))
1712 return ParseCastExpression(ParseKind, isAddressOfOperand, NotCastExpr,
1713 isTypeCast, isVectorLiteral,
1714 NotPrimaryExpression);
1717 if (Next.is(tok::annot_template_id)) {
1724 ParseOptionalCXXScopeSpecifier(SS,
nullptr,
1728 return ParseCastExpression(ParseKind, isAddressOfOperand, NotCastExpr,
1729 isTypeCast, isVectorLiteral,
1730 NotPrimaryExpression);
1735 Res = ParseCXXIdExpression(isAddressOfOperand);
1739 case tok::annot_template_id: {
1747 return ParseCastExpression(ParseKind, isAddressOfOperand,
1748 NotCastExpr, isTypeCast, isVectorLiteral,
1749 NotPrimaryExpression);
1756 case tok::kw_operator:
1757 Res = ParseCXXIdExpression(isAddressOfOperand);
1760 case tok::coloncolon: {
1765 if (!Tok.
is(tok::coloncolon))
1766 return ParseCastExpression(ParseKind, isAddressOfOperand, isTypeCast,
1767 isVectorLiteral, NotPrimaryExpression);
1772 if (Tok.
is(tok::kw_new)) {
1773 if (NotPrimaryExpression)
1774 *NotPrimaryExpression =
true;
1775 Res = ParseCXXNewExpression(
true, CCLoc);
1776 AllowSuffix =
false;
1779 if (Tok.
is(tok::kw_delete)) {
1780 if (NotPrimaryExpression)
1781 *NotPrimaryExpression =
true;
1782 Res = ParseCXXDeleteExpression(
true, CCLoc);
1783 AllowSuffix =
false;
1788 Diag(CCLoc, diag::err_expected_expression);
1793 if (NotPrimaryExpression)
1794 *NotPrimaryExpression =
true;
1795 Res = ParseCXXNewExpression(
false, Tok.
getLocation());
1796 AllowSuffix =
false;
1799 case tok::kw_delete:
1800 if (NotPrimaryExpression)
1801 *NotPrimaryExpression =
true;
1802 Res = ParseCXXDeleteExpression(
false, Tok.
getLocation());
1803 AllowSuffix =
false;
1806 case tok::kw_requires:
1807 Res = ParseRequiresExpression();
1808 AllowSuffix =
false;
1811 case tok::kw_noexcept: {
1812 if (NotPrimaryExpression)
1813 *NotPrimaryExpression =
true;
1814 Diag(Tok, diag::warn_cxx98_compat_noexcept_expr);
1818 if (
T.expectAndConsume(diag::err_expected_lparen_after,
"noexcept"))
1831 T.getCloseLocation());
1832 AllowSuffix =
false;
1836#define TYPE_TRAIT(N,Spelling,K) \
1837 case tok::kw_##Spelling:
1838#include "clang/Basic/TokenKinds.def"
1839 Res = ParseTypeTrait();
1842 case tok::kw___array_rank:
1843 case tok::kw___array_extent:
1844 if (NotPrimaryExpression)
1845 *NotPrimaryExpression =
true;
1846 Res = ParseArrayTypeTrait();
1849 case tok::kw___builtin_ptrauth_type_discriminator:
1850 return ParseBuiltinPtrauthTypeDiscriminator();
1852 case tok::kw___is_lvalue_expr:
1853 case tok::kw___is_rvalue_expr:
1854 if (NotPrimaryExpression)
1855 *NotPrimaryExpression =
true;
1856 Res = ParseExpressionTrait();
1860 if (NotPrimaryExpression)
1861 *NotPrimaryExpression =
true;
1863 return ParseObjCAtExpression(AtLoc);
1866 Res = ParseBlockLiteralExpression();
1868 case tok::code_completion: {
1874#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
1875#include "clang/Basic/TransformTypeTraits.def"
1880 Diag(Tok, diag::ext_keyword_as_ident)
1882 goto ParseIdentifier;
1884 goto ExpectedExpression;
1893 Res = TryParseLambdaExpression();
1897 if (NotPrimaryExpression)
1898 *NotPrimaryExpression =
true;
1899 Res = ParseObjCMessageExpression();
1903 Res = ParseLambdaExpression();
1907 Res = ParseObjCMessageExpression();
1921 if (ParseKind == PrimaryExprOnly)
1936 case tok::minusminus:
1954 Diag(Tok.
getLocation(), diag::err_postfix_after_unary_requires_parens)
1962 PreferredType = SavedType;
1963 Res = ParsePostfixExpressionSuffix(Res);
1965 !
getActions().getOpenCLOptions().isAvailableOption(
1967 if (
Expr *PostfixExpr = Res.
get()) {
1968 QualType Ty = PostfixExpr->getType();
1970 Diag(PostfixExpr->getExprLoc(),
1971 diag::err_opencl_taking_function_address_parser);
2001Parser::ParsePostfixExpressionSuffix(
ExprResult LHS) {
2005 auto SavedType = PreferredType;
2008 PreferredType = SavedType;
2010 case tok::code_completion:
2011 if (InMessageExpression)
2019 case tok::identifier:
2026 nullptr, LHS.
get());
2034 case tok::l_square: {
2042 isSimpleObjCMessageExpression())
2047 if (CheckProhibitedCXX11Attribute()) {
2053 Loc =
T.getOpenLocation();
2056 ExprVector ArgExprs;
2057 bool HasError =
false;
2064 if ((!
getLangOpts().OpenMP && !AllowOpenACCArraySections) ||
2065 Tok.
isNot(tok::colon)) {
2069 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
2070 Idx = ParseBraceInitializer();
2079 ArgExprs.push_back(Idx.
get());
2081 }
else if (Tok.
isNot(tok::r_square)) {
2082 if (ParseExpressionList(ArgExprs)) {
2093 if (ArgExprs.size() <= 1 && AllowOpenACCArraySections) {
2095 if (Tok.
is(tok::colon)) {
2098 if (Tok.
isNot(tok::r_square))
2101 }
else if (ArgExprs.size() <= 1 &&
getLangOpts().OpenMP) {
2103 if (Tok.
is(tok::colon)) {
2106 if (Tok.
isNot(tok::r_square) &&
2114 (OMPClauseKind == llvm::omp::Clause::OMPC_to ||
2115 OMPClauseKind == llvm::omp::Clause::OMPC_from) &&
2116 Tok.
is(tok::colon)) {
2119 if (Tok.
isNot(tok::r_square)) {
2128 if (!LHS.
isInvalid() && !HasError && !Length.isInvalid() &&
2135 if (AllowOpenACCArraySections) {
2137 "Stride/second colon not allowed for OpenACC");
2139 LHS.
get(),
Loc, ArgExprs.empty() ?
nullptr : ArgExprs[0],
2140 ColonLocFirst, Length.get(), RLoc);
2143 LHS.
get(),
Loc, ArgExprs.empty() ?
nullptr : ArgExprs[0],
2144 ColonLocFirst, ColonLocSecond, Length.get(), Stride.
get(),
2161 case tok::lesslessless: {
2166 Expr *ExecConfig =
nullptr;
2170 if (OpKind == tok::lesslessless) {
2171 ExprVector ExecConfigExprs;
2174 if (ParseSimpleExpressionList(ExecConfigExprs)) {
2185 Diag(Tok, diag::err_expected) << tok::greatergreatergreater;
2186 Diag(OpenLoc, diag::note_matching) << tok::lesslessless;
2192 if (ExpectAndConsume(tok::l_paren))
2195 Loc = PrevTokLocation;
2200 getCurScope(), OpenLoc, ExecConfigExprs, CloseLoc);
2204 ExecConfig = ECResult.
get();
2208 Loc = PT.getOpenLocation();
2211 ExprVector ArgExprs;
2212 auto RunSignatureHelp = [&]() ->
QualType {
2215 LHS.
get(), ArgExprs, PT.getOpenLocation());
2216 CalledSignatureHelp =
true;
2217 return PreferredType;
2219 if (OpKind == tok::l_paren || !LHS.
isInvalid()) {
2220 if (Tok.
isNot(tok::r_paren)) {
2221 bool HasTrailingComma =
false;
2222 bool HasError = ParseExpressionList(
2225 PreferredType.enterFunctionArgument(Tok.
getLocation(),
2229 false, &HasTrailingComma);
2231 if (HasError && !HasTrailingComma) {
2241 for (
auto &
E : ArgExprs)
2250 }
else if (Tok.
isNot(tok::r_paren)) {
2251 bool HadDelayedTypo =
false;
2253 HadDelayedTypo =
true;
2254 for (
auto &
E : ArgExprs)
2256 HadDelayedTypo =
true;
2271 ArgExprs.insert(ArgExprs.begin(), Fn);
2289 bool MayBePseudoDestructor =
false;
2292 PreferredType.enterMemAccess(Actions, Tok.
getLocation(), OrigLHS);
2296 const Type* BaseType =
Base->getType().getTypePtrOrNull();
2297 if (BaseType && Tok.
is(tok::l_paren) &&
2300 Diag(OpLoc, diag::err_function_is_not_record)
2301 << OpKind <<
Base->getSourceRange()
2303 return ParsePostfixExpressionSuffix(
Base);
2308 MayBePseudoDestructor);
2313 if (Tok.
is(tok::code_completion)) {
2319 ParseOptionalCXXScopeSpecifier(
2321 false, &MayBePseudoDestructor);
2323 ObjectType =
nullptr;
2326 if (Tok.
is(tok::code_completion)) {
2328 OpKind == tok::arrow ? tok::period : tok::arrow;
2335 getCurScope(), OrigLHS, OpLoc, CorrectedOpKind, ObjectType,
2336 MayBePseudoDestructor);
2340 Expr *CorrectedBase = CorrectedLHS.get();
2342 CorrectedBase =
Base;
2348 Base && ExprStatementTokLoc ==
Base->getBeginLoc(),
2354 if (MayBePseudoDestructor && !LHS.
isInvalid()) {
2355 LHS = ParseCXXPseudoDestructor(LHS.
get(), OpLoc, OpKind, SS,
2370 Tok.
is(tok::kw_class)) {
2380 Name.setIdentifier(
Id,
Loc);
2387 false, &TemplateKWLoc, Name)) {
2394 OpKind, SS, TemplateKWLoc, Name,
2395 CurParsedObjCImpl ? CurParsedObjCImpl->Dcl
2398 if (Tok.
is(tok::less))
2399 checkPotentialAngleBracket(LHS);
2400 }
else if (OrigLHS && Name.isValid()) {
2403 Name.getEndLoc(), {OrigLHS});
2408 case tok::minusminus:
2456Parser::ParseExprAfterUnaryExprOrTypeTrait(
const Token &OpTok,
2461 assert(OpTok.
isOneOf(tok::kw_typeof, tok::kw_typeof_unqual, tok::kw_sizeof,
2462 tok::kw___datasizeof, tok::kw___alignof, tok::kw_alignof,
2463 tok::kw__Alignof, tok::kw_vec_step,
2464 tok::kw___builtin_omp_required_simd_align,
2465 tok::kw___builtin_vectorelements) &&
2466 "Not a typeof/sizeof/alignof/vec_step expression!");
2471 if (Tok.
isNot(tok::l_paren)) {
2474 if (OpTok.
isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2475 tok::kw_alignof, tok::kw__Alignof)) {
2476 if (isTypeIdUnambiguously()) {
2478 ParseSpecifierQualifierList(DS);
2481 ParseDeclarator(DeclaratorInfo);
2487 diag::err_expected_parentheses_around_typename)
2490 Diag(LParenLoc, diag::err_expected_parentheses_around_typename)
2500 if (OpTok.
isOneOf(tok::kw_typeof, tok::kw_typeof_unqual) &&
2511 if (OpTok.
isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2512 tok::kw_alignof, tok::kw__Alignof) &&
2513 Tok.
isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2514 tok::kw_alignof, tok::kw__Alignof))
2516 Operand = ParseCastExpression(UnaryExprOnly);
2519 Operand = ParseCastExpression(UnaryExprOnly);
2525 ParenParseOption ExprType =
CastExpr;
2528 Operand = ParseParenExpression(ExprType,
true,
2529 false, CastTy, RParenLoc);
2540 !OpTok.
isOneOf(tok::kw_typeof, tok::kw_typeof_unqual)) {
2557ExprResult Parser::ParseSYCLUniqueStableNameExpression() {
2558 assert(Tok.
is(tok::kw___builtin_sycl_unique_stable_name) &&
2559 "Not __builtin_sycl_unique_stable_name");
2565 if (
T.expectAndConsume(diag::err_expected_lparen_after,
2566 "__builtin_sycl_unique_stable_name"))
2576 if (
T.consumeClose())
2580 OpLoc,
T.getOpenLocation(),
T.getCloseLocation(), Ty.
get());
2597ExprResult Parser::ParseUnaryExprOrTypeTraitExpression() {
2598 assert(Tok.
isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2599 tok::kw_alignof, tok::kw__Alignof, tok::kw_vec_step,
2600 tok::kw___builtin_omp_required_simd_align,
2601 tok::kw___builtin_vectorelements) &&
2602 "Not a sizeof/alignof/vec_step expression!");
2607 if (Tok.
is(tok::ellipsis) && OpTok.
is(tok::kw_sizeof)) {
2612 if (Tok.
is(tok::l_paren)) {
2615 LParenLoc =
T.getOpenLocation();
2616 if (Tok.
is(tok::identifier)) {
2620 RParenLoc =
T.getCloseLocation();
2624 Diag(Tok, diag::err_expected_parameter_pack);
2627 }
else if (Tok.
is(tok::identifier)) {
2632 Diag(LParenLoc, diag::err_paren_sizeof_parameter_pack)
2637 Diag(Tok, diag::err_sizeof_parameter_pack);
2654 OpTok.
isOneOf(tok::kw_alignof, tok::kw__Alignof))
2655 Diag(OpTok, diag::warn_cxx98_compat_alignof);
2657 Diag(OpTok, diag::warn_c23_compat_keyword) << OpTok.
getName();
2673 case tok::kw_alignof:
2674 case tok::kw__Alignof:
2675 ExprKind = UETT_AlignOf;
2677 case tok::kw___alignof:
2678 ExprKind = UETT_PreferredAlignOf;
2680 case tok::kw_vec_step:
2681 ExprKind = UETT_VecStep;
2683 case tok::kw___builtin_omp_required_simd_align:
2684 ExprKind = UETT_OpenMPRequiredSimdAlign;
2686 case tok::kw___datasizeof:
2687 ExprKind = UETT_DataSizeOf;
2689 case tok::kw___builtin_vectorelements:
2690 ExprKind = UETT_VectorElements;
2703 if (OpTok.
isOneOf(tok::kw_alignof, tok::kw__Alignof))
2739ExprResult Parser::ParseBuiltinPrimaryExpression() {
2747 if (Tok.
isNot(tok::l_paren))
2748 return ExprError(
Diag(Tok, diag::err_expected_after) << BuiltinII
2757 default: llvm_unreachable(
"Not a builtin primary expression!");
2758 case tok::kw___builtin_va_arg: {
2761 if (ExpectAndConsume(tok::comma)) {
2768 if (Tok.
isNot(tok::r_paren)) {
2769 Diag(Tok, diag::err_expected) << tok::r_paren;
2779 case tok::kw___builtin_offsetof: {
2785 if (MacroName ==
"offsetof")
2798 if (ExpectAndConsume(tok::comma)) {
2804 if (Tok.
isNot(tok::identifier)) {
2805 Diag(Tok, diag::err_expected) << tok::identifier;
2814 Comps.back().isBrackets =
false;
2816 Comps.back().LocStart = Comps.back().LocEnd =
ConsumeToken();
2820 if (Tok.
is(tok::period)) {
2823 Comps.back().isBrackets =
false;
2826 if (Tok.
isNot(tok::identifier)) {
2827 Diag(Tok, diag::err_expected) << tok::identifier;
2833 }
else if (Tok.
is(tok::l_square)) {
2834 if (CheckProhibitedCXX11Attribute())
2839 Comps.back().isBrackets =
true;
2842 Comps.back().LocStart = ST.getOpenLocation();
2848 Comps.back().U.E = Res.
get();
2851 Comps.back().LocEnd = ST.getCloseLocation();
2853 if (Tok.
isNot(tok::r_paren)) {
2862 PT.getCloseLocation());
2869 case tok::kw___builtin_choose_expr: {
2871 if (Cond.isInvalid()) {
2875 if (ExpectAndConsume(tok::comma)) {
2881 if (Expr1.isInvalid()) {
2885 if (ExpectAndConsume(tok::comma)) {
2891 if (Expr2.isInvalid()) {
2895 if (Tok.
isNot(tok::r_paren)) {
2896 Diag(Tok, diag::err_expected) << tok::r_paren;
2900 Expr2.get(), ConsumeParen());
2903 case tok::kw___builtin_astype: {
2906 if (
Expr.isInvalid()) {
2911 if (ExpectAndConsume(tok::comma)) {
2922 if (Tok.
isNot(tok::r_paren)) {
2923 Diag(Tok, diag::err_expected) << tok::r_paren;
2932 case tok::kw___builtin_convertvector: {
2935 if (
Expr.isInvalid()) {
2940 if (ExpectAndConsume(tok::comma)) {
2951 if (Tok.
isNot(tok::r_paren)) {
2952 Diag(Tok, diag::err_expected) << tok::r_paren;
2961 case tok::kw___builtin_COLUMN:
2962 case tok::kw___builtin_FILE:
2963 case tok::kw___builtin_FILE_NAME:
2964 case tok::kw___builtin_FUNCTION:
2965 case tok::kw___builtin_FUNCSIG:
2966 case tok::kw___builtin_LINE:
2967 case tok::kw___builtin_source_location: {
2969 if (Tok.
isNot(tok::r_paren)) {
2970 Diag(Tok, diag::err_expected) << tok::r_paren;
2976 case tok::kw___builtin_FILE:
2978 case tok::kw___builtin_FILE_NAME:
2980 case tok::kw___builtin_FUNCTION:
2982 case tok::kw___builtin_FUNCSIG:
2984 case tok::kw___builtin_LINE:
2986 case tok::kw___builtin_COLUMN:
2988 case tok::kw___builtin_source_location:
2991 llvm_unreachable(
"invalid keyword");
3004 return ParsePostfixExpressionSuffix(Res.
get());
3007bool Parser::tryParseOpenMPArrayShapingCastPart() {
3008 assert(Tok.
is(tok::l_square) &&
"Expected open bracket");
3009 bool ErrorFound =
true;
3010 TentativeParsingAction TPA(*
this);
3012 if (Tok.
isNot(tok::l_square))
3017 while (!
SkipUntil(tok::r_square, tok::annot_pragma_openmp_end,
3020 if (Tok.
isNot(tok::r_square))
3025 if (Tok.
is(tok::r_paren)) {
3029 }
while (Tok.
isNot(tok::annot_pragma_openmp_end));
3062Parser::ParseParenExpression(ParenParseOption &ExprType,
bool stopIfCastExpr,
3065 assert(Tok.
is(tok::l_paren) &&
"Not a paren expr!");
3068 if (
T.consumeOpen())
3072 PreferredType.enterParenExpr(Tok.
getLocation(), OpenLoc);
3075 bool isAmbiguousTypeId;
3078 if (Tok.
is(tok::code_completion)) {
3082 ExprType >= CompoundLiteral);
3089 tok::kw___bridge_transfer,
3090 tok::kw___bridge_retained,
3091 tok::kw___bridge_retain));
3092 if (BridgeCast && !
getLangOpts().ObjCAutoRefCount) {
3094 StringRef BridgeCastName = Tok.
getName();
3097 Diag(BridgeKeywordLoc, diag::warn_arc_bridge_cast_nonarc)
3107 Diag(Tok, OpenLoc.
isMacroID() ? diag::ext_gnu_statement_expr_macro
3108 : diag::ext_gnu_statement_expr);
3110 checkCompoundToken(OpenLoc, tok::l_paren, CompoundToken::StmtExprBegin);
3119 while (CodeDC->
isRecord() || isa<EnumDecl>(CodeDC)) {
3122 "statement expr not in code context");
3132 if (!
Stmt.isInvalid()) {
3139 }
else if (ExprType >= CompoundLiteral && BridgeCast) {
3145 if (tokenKind == tok::kw___bridge)
3147 else if (tokenKind == tok::kw___bridge_transfer)
3149 else if (tokenKind == tok::kw___bridge_retained)
3154 assert(tokenKind == tok::kw___bridge_retain);
3157 Diag(BridgeKeywordLoc, diag::err_arc_bridge_retain)
3159 "__bridge_retained");
3164 ColonProtection.restore();
3165 RParenLoc =
T.getCloseLocation();
3168 ExprResult SubExpr = ParseCastExpression(AnyCastExpr);
3174 BridgeKeywordLoc, Ty.
get(),
3175 RParenLoc, SubExpr.
get());
3176 }
else if (ExprType >= CompoundLiteral &&
3177 isTypeIdInParens(isAmbiguousTypeId)) {
3186 if (isAmbiguousTypeId && !stopIfCastExpr) {
3187 ExprResult res = ParseCXXAmbiguousParenExpression(ExprType, CastTy,
T,
3189 RParenLoc =
T.getCloseLocation();
3195 ParseSpecifierQualifierList(DS);
3198 ParseDeclarator(DeclaratorInfo);
3203 if (!DeclaratorInfo.isInvalidType() && Tok.
is(tok::identifier) &&
3217 ColonProtection.restore();
3218 RParenLoc =
T.getCloseLocation();
3219 if (Tok.
is(tok::l_brace)) {
3220 ExprType = CompoundLiteral;
3226 return ParseCompoundLiteralExpression(Ty.
get(), OpenLoc, RParenLoc);
3229 if (Tok.
is(tok::l_paren)) {
3250 Result = ParseCastExpression(AnyCastExpr,
3255 if (!
Result.isInvalid()) {
3257 DeclaratorInfo, CastTy,
3258 RParenLoc,
Result.get());
3262 if (!
Result.isInvalid()) {
3274 if (DeclaratorInfo.isInvalidType())
3279 if (stopIfCastExpr) {
3293 GetLookAheadToken(1).isNot(tok::period)) {
3302 Result = ParseCastExpression(AnyCastExpr,
3305 if (!
Result.isInvalid()) {
3307 DeclaratorInfo, CastTy,
3308 RParenLoc,
Result.get());
3313 Diag(Tok, diag::err_expected_lbrace_in_compound_literal);
3316 }
else if (ExprType >= FoldExpr && Tok.
is(tok::ellipsis) &&
3318 ExprType = FoldExpr;
3320 }
else if (isTypeCast) {
3323 ExprVector ArgExprs;
3325 if (!ParseSimpleExpressionList(ArgExprs)) {
3328 if (ExprType >= FoldExpr && ArgExprs.size() == 1 &&
3330 ExprType = FoldExpr;
3331 return ParseFoldExpression(ArgExprs[0],
T);
3334 ExprType = SimpleExpr;
3338 }
else if (
getLangOpts().OpenMP >= 50 && OpenMPDirectiveParsing &&
3339 ExprType ==
CastExpr && Tok.
is(tok::l_square) &&
3340 tryParseOpenMPArrayShapingCastPart()) {
3341 bool ErrorFound =
false;
3351 while (!
SkipUntil(tok::r_square, tok::r_paren,
3356 OMPDimensions.push_back(NumElements.
get());
3357 OMPBracketsRanges.push_back(TS.getRange());
3358 }
while (Tok.
isNot(tok::r_paren));
3361 RParenLoc =
T.getCloseLocation();
3365 }
else if (!
Result.isInvalid()) {
3367 Result.get(), OpenLoc, RParenLoc, OMPDimensions, OMPBracketsRanges);
3380 if (ExprType >= FoldExpr && isFoldOperator(Tok.
getKind()) &&
3382 ExprType = FoldExpr;
3383 return ParseFoldExpression(
Result,
T);
3385 ExprType = SimpleExpr;
3388 if (!
Result.isInvalid() && Tok.
is(tok::r_paren))
3394 if (
Result.isInvalid()) {
3400 RParenLoc =
T.getCloseLocation();
3413Parser::ParseCompoundLiteralExpression(
ParsedType Ty,
3416 assert(Tok.
is(tok::l_brace) &&
"Not a compound literal!");
3418 Diag(LParenLoc, diag::ext_c99_compound_literal);
3421 if (!
Result.isInvalid() && Ty)
3447 "Not a string-literal-like token!");
3455 StringToks.push_back(Tok);
3460 assert(!AllowUserDefinedLiteral &&
"UDL are always evaluated");
3489ExprResult Parser::ParseGenericSelectionExpression() {
3490 assert(Tok.
is(tok::kw__Generic) &&
"_Generic keyword expected");
3492 diagnoseUseOfC11Keyword(Tok);
3496 if (
T.expectAndConsume())
3503 if (isTypeIdForGenericSelection()) {
3509 const auto *LIT = cast<LocInfoType>(ControllingType.
get().get());
3512 : diag::ext_c2y_generic_with_type_arg);
3526 if (ExpectAndConsume(tok::comma)) {
3536 if (Tok.
is(tok::kw_default)) {
3540 Diag(Tok, diag::err_duplicate_default_assoc);
3541 Diag(DefaultLoc, diag::note_previous_default_assoc);
3556 Types.push_back(Ty);
3558 if (ExpectAndConsume(tok::colon)) {
3567 if (ER.isInvalid()) {
3571 Exprs.push_back(ER.get());
3575 if (
T.getCloseLocation().isInvalid())
3578 void *ExprOrTy = ControllingExpr.
isUsable()
3579 ? ControllingExpr.
get()
3580 : ControllingType.
get().getAsOpaquePtr();
3583 KeyLoc, DefaultLoc,
T.getCloseLocation(), ControllingExpr.
isUsable(),
3584 ExprOrTy, Types, Exprs);
3606 assert(isFoldOperator(Kind) &&
"missing fold-operator");
3610 assert(Tok.
is(tok::ellipsis) &&
"not a fold-expression");
3614 if (Tok.
isNot(tok::r_paren)) {
3615 if (!isFoldOperator(Tok.
getKind()))
3618 if (Kind != tok::unknown && Tok.
getKind() != Kind)
3632 ? diag::warn_cxx14_compat_fold_expression
3633 : diag::ext_fold_expression);
3637 Kind, EllipsisLoc, RHS.
get(),
3638 T.getCloseLocation());
3641void Parser::injectEmbedTokens() {
3645 Data->BinaryData.size() * 2 - 1),
3646 Data->BinaryData.size() * 2 - 1);
3648 for (
auto &Byte :
Data->BinaryData) {
3649 Toks[I].startToken();
3650 Toks[I].setKind(tok::binary_data);
3652 Toks[I].setLength(1);
3653 Toks[I].setLiteralData(&Byte);
3654 if (I != ((
Data->BinaryData.size() - 1) * 2)) {
3655 Toks[I + 1].startToken();
3656 Toks[I + 1].setKind(tok::comma);
3661 PP.EnterTokenStream(std::move(Toks),
true,
3689 llvm::function_ref<
void()> ExpressionStarts,
3690 bool FailImmediatelyOnInvalidExpr,
3691 bool EarlyTypoCorrection,
3692 bool *HasTrailingComma) {
3693 bool SawError =
false;
3695 if (ExpressionStarts)
3700 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
3701 Expr = ParseBraceInitializer();
3705 if (EarlyTypoCorrection)
3708 if (Tok.
is(tok::ellipsis))
3710 else if (Tok.
is(tok::code_completion)) {
3720 if (
Expr.isInvalid()) {
3722 if (FailImmediatelyOnInvalidExpr)
3726 Exprs.push_back(
Expr.get());
3729 if (Tok.
isNot(tok::comma))
3734 checkPotentialAngleBracketDelimiter(Comma);
3736 if (Tok.
is(tok::r_paren)) {
3737 if (HasTrailingComma)
3738 *HasTrailingComma =
true;
3745 for (
auto &
E : Exprs) {
3764 if (
Expr.isInvalid())
3767 Exprs.push_back(
Expr.get());
3777 checkPotentialAngleBracketDelimiter(Comma);
3788 if (Tok.
is(tok::code_completion)) {
3797 ParseSpecifierQualifierList(DS);
3803 ParseDeclarator(DeclaratorInfo);
3805 MaybeParseGNUAttributes(DeclaratorInfo);
3821ExprResult Parser::ParseBlockLiteralExpression() {
3822 assert(Tok.
is(tok::caret) &&
"block literal starts with ^");
3826 "block literal parsing");
3849 if (Tok.
is(tok::l_paren)) {
3850 ParseParenDeclarator(ParamInfo);
3855 ParamInfo.SetIdentifier(
nullptr, CaretLoc);
3856 ParamInfo.SetRangeEnd(Tmp);
3857 if (ParamInfo.isInvalidType()) {
3865 MaybeParseGNUAttributes(ParamInfo);
3869 }
else if (!Tok.
is(tok::l_brace)) {
3870 ParseBlockId(CaretLoc);
3874 ParamInfo.AddTypeInfo(
3892 CaretLoc, ParamInfo),
3895 MaybeParseGNUAttributes(ParamInfo);
3903 if (!Tok.
is(tok::l_brace)) {
3905 Diag(Tok, diag::err_expected_expression);
3912 if (!
Stmt.isInvalid())
3932 llvm::SmallSet<StringRef, 4> Platforms;
3933 bool HasOtherPlatformSpec =
false;
3935 for (
const auto &Spec : AvailSpecs) {
3936 if (Spec.isOtherPlatformSpec()) {
3937 if (HasOtherPlatformSpec) {
3938 P.Diag(Spec.getBeginLoc(), diag::err_availability_query_repeated_star);
3942 HasOtherPlatformSpec =
true;
3946 bool Inserted = Platforms.insert(Spec.getPlatform()).second;
3951 StringRef Platform = Spec.getPlatform();
3952 P.Diag(Spec.getBeginLoc(), diag::err_availability_query_repeated_platform)
3953 << Spec.getEndLoc() << Platform;
3958 if (!HasOtherPlatformSpec) {
3959 SourceLocation InsertWildcardLoc = AvailSpecs.back().getEndLoc();
3960 P.Diag(InsertWildcardLoc, diag::err_availability_query_wildcard_required)
3973std::optional<AvailabilitySpec> Parser::ParseAvailabilitySpec() {
3974 if (Tok.
is(tok::star)) {
3978 if (Tok.
is(tok::code_completion)) {
3981 return std::nullopt;
3983 if (Tok.
isNot(tok::identifier)) {
3984 Diag(Tok, diag::err_avail_query_expected_platform_name);
3985 return std::nullopt;
3990 VersionTuple Version = ParseVersionTuple(VersionRange);
3992 if (Version.empty())
3993 return std::nullopt;
3995 StringRef GivenPlatform = PlatformIdentifier->
Ident->
getName();
3996 StringRef Platform =
3997 AvailabilityAttr::canonicalizePlatformName(GivenPlatform);
3999 if (AvailabilityAttr::getPrettyPlatformName(Platform).empty() ||
4000 (GivenPlatform.contains(
"xros") || GivenPlatform.contains(
"xrOS"))) {
4002 diag::err_avail_query_unrecognized_platform_name)
4004 return std::nullopt;
4013 assert(Tok.
is(tok::kw___builtin_available) ||
4020 if (
Parens.expectAndConsume())
4024 bool HasError =
false;
4026 std::optional<AvailabilitySpec> Spec = ParseAvailabilitySpec();
4030 AvailSpecs.push_back(*Spec);
4043 if (
Parens.consumeClose())
4047 AvailSpecs, BeginLoc,
Parens.getCloseLocation());
Defines the clang::ASTContext interface.
static Decl::Kind getKind(const Decl *D)
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.
const clang::PrintingPolicy & getPrintingPolicy() const
One specifier in an @available expression.
RAII class that helps handle the parsing of an open/close delimiter pair, such as braces { ....
Represents a C++ nested-name-specifier or a global scope specifier.
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
ColonProtectionRAIIObject - This sets the Parser::ColonIsSacred bool and restores it when destroyed.
CompoundStmt - This represents a group of statements like { stmt stmt }.
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 - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isFileContext() const
Captures information about "declaration specifiers".
Information about one declarator, including the parsed type information and the identifier.
RAII object that enters a new expression evaluation context.
This represents one expression.
bool containsErrors() const
Whether this expression contains subexpressions which had errors, e.g.
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.
bool hasRevertedTokenIDToIdentifier() const
True if revertTokenIDToIdentifier() was called.
StringRef getName() const
Return the actual identifier string.
Represents the declaration of a label.
static StringRef getImmediateMacroNameForDiagnostics(SourceLocation Loc, const SourceManager &SM, const LangOptions &LangOpts)
Retrieve the name of the immediate macro expansion.
This represents a decl that may have a name.
void * getAsOpaquePtr() const
static const ParsedAttributesView & none()
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 type-name: [C99 6.7.6] specifier-qualifier-list abstract-declarator[opt].
DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
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.
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.
SourceLocation ConsumeAnyToken(bool ConsumeCodeCompletionTok=false)
ConsumeAnyToken - Dispatch to the right Consume* method based on the current token type.
ExprResult ParseConstantExpression()
ExprResult ParseConditionalExpression()
bool TryConsumeToken(tok::TokenKind Expected)
Scope * getCurScope() const
ExprResult ParseArrayBoundExpression()
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 ...
ExprResult ParseAssignmentExpression(TypeCastState isTypeCast=NotTypeCast)
Parse an expr that doesn't include (top-level) commas.
ExprResult ParseConstantExpressionInExprEvalContext(TypeCastState isTypeCast=NotTypeCast)
const LangOptions & getLangOpts() const
ExprResult ParseExpression(TypeCastState isTypeCast=NotTypeCast)
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.
bool TryAnnotateTypeOrScopeToken(ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No)
TryAnnotateTypeOrScopeToken - If the current token position is on a typename (possibly qualified in C...
TypeCastState
TypeCastState - State whether an expression is or may be a type cast.
ExprResult ParseUnevaluatedStringLiteralExpression()
ExprResult ParseStringLiteralExpression(bool AllowUserDefinedLiteral=false)
const Token & NextToken()
NextToken - This peeks ahead one token and returns it without consuming it.
ExprResult ParseConstraintExpression()
Parse a constraint-expression.
void enterSubscript(Sema &S, SourceLocation Tok, Expr *LHS)
void enterUnary(Sema &S, SourceLocation Tok, tok::TokenKind OpKind, SourceLocation OpLoc)
void enterBinary(Sema &S, SourceLocation Tok, Expr *LHS, tok::TokenKind Op)
QualType get(SourceLocation Tok) const
Get the expected type associated with this location, if any.
void EnterToken(const Token &Tok, bool IsReinject)
Enters a token in the token stream to be lexed next.
SourceManager & getSourceManager() const
llvm::BumpPtrAllocator & getPreprocessorAllocator()
StringRef getSpelling(SourceLocation loc, SmallVectorImpl< char > &buffer, bool *invalid=nullptr) const
Return the 'spelling' of the token at the given location; does not go up to the spelling location or ...
bool isAtStartOfMacroExpansion(SourceLocation loc, SourceLocation *MacroBegin=nullptr) const
Returns true if the given MacroID location points at the first token of the macro expansion.
bool isCodeCompletionReached() const
Returns true if code-completion is enabled and we have hit the code-completion point.
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Computes the source location just past the end of the token at this source location.
If a crash happens while one of these objects are live, the message is printed out along with the spe...
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
@ 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.
ExprResult ActOnExecConfigExpr(Scope *S, SourceLocation LLLLoc, MultiExprArg ExecConfig, SourceLocation GGGLoc)
@ PCC_Type
Code completion occurs where only a type is permitted.
void CodeCompleteExpression(Scope *S, const CodeCompleteExpressionData &Data)
Perform code-completion in an expression context when we know what type we're looking for.
QualType ProduceCallSignatureHelp(Expr *Fn, ArrayRef< Expr * > Args, SourceLocation OpenParLoc)
Determines the preferred type of the current function argument, by examining the signatures of all po...
void CodeCompleteOrdinaryName(Scope *S, ParserCompletionContext CompletionContext)
void CodeCompleteObjCClassPropertyRefExpr(Scope *S, const IdentifierInfo &ClassName, SourceLocation ClassNameLoc, bool IsBaseExprStatement)
void CodeCompleteAvailabilityPlatformName()
void CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base, Expr *OtherOpBase, SourceLocation OpLoc, bool IsArrow, bool IsBaseExprStatement, QualType PreferredType)
void CodeCompletePostfixExpression(Scope *S, ExprResult LHS, QualType PreferredType)
ExprResult ActOnObjCBridgedCast(Scope *S, SourceLocation LParenLoc, ObjCBridgeCastKind Kind, SourceLocation BridgeKeywordLoc, ParsedType Type, SourceLocation RParenLoc, Expr *SubExpr)
ExprResult ActOnClassPropertyRefExpr(const IdentifierInfo &receiverName, const IdentifierInfo &propertyName, SourceLocation receiverNameLoc, SourceLocation propertyNameLoc)
ExprResult ActOnObjCBoolLiteral(SourceLocation AtLoc, SourceLocation ValueLoc, bool Value)
ExprResult ActOnObjCAvailabilityCheckExpr(llvm::ArrayRef< AvailabilitySpec > AvailSpecs, SourceLocation AtLoc, SourceLocation RParen)
ExprResult ActOnArraySectionExpr(Expr *Base, SourceLocation LBLoc, Expr *LowerBound, SourceLocation ColonLocFirst, Expr *Length, SourceLocation RBLoc)
Checks and creates an Array Section used in an OpenACC construct/clause.
ExprResult ActOnOMPArraySectionExpr(Expr *Base, SourceLocation LBLoc, Expr *LowerBound, SourceLocation ColonLocFirst, SourceLocation ColonLocSecond, Expr *Length, Expr *Stride, SourceLocation RBLoc)
ExprResult ActOnOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, SourceLocation RParenLoc, ArrayRef< Expr * > Dims, ArrayRef< SourceRange > Brackets)
ExprResult ActOnUniqueStableNameExpr(SourceLocation OpLoc, SourceLocation LParen, SourceLocation RParen, ParsedType ParsedTy)
RAII class used to indicate that we are performing provisional semantic analysis to determine the val...
ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op, Expr *Input, bool IsAfterAmp=false)
Unary Operators. 'Tok' is the token for the operator.
ExprResult ActOnConstantExpression(ExprResult Res)
ExprResult ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen, Expr *Operand, SourceLocation RParen)
ExprResult ActOnCompoundLiteral(SourceLocation LParenLoc, ParsedType Ty, SourceLocation RParenLoc, Expr *InitExpr)
void ActOnStartStmtExpr()
void ActOnStmtExprError()
ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool HasTrailingLParen, bool IsAddressOfOperand, CorrectionCandidateCallback *CCC=nullptr, bool IsInlineAsmIdentifier=false, Token *KeywordReplacement=nullptr)
ExprResult ActOnCharacterConstant(const Token &Tok, Scope *UDLScope=nullptr)
ExprResult ActOnStartCXXMemberReference(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, ParsedType &ObjectType, bool &MayBePseudoDestructor)
ExprResult ActOnCaseExpr(SourceLocation CaseLoc, ExprResult Val)
ExprResult ActOnCXXNullPtrLiteral(SourceLocation Loc)
ActOnCXXNullPtrLiteral - Parse 'nullptr'.
bool CheckConstraintExpression(const Expr *CE, Token NextToken=Token(), bool *PossibleNonPrimary=nullptr, bool IsTrailingRequiresClause=false)
Check whether the given expression is a valid constraint expression.
ASTContext & getASTContext() const
ExprResult ActOnAddrLabel(SourceLocation OpLoc, SourceLocation LabLoc, LabelDecl *TheDecl)
ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R, MultiExprArg Val)
ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr, SourceLocation RPLoc)
ExprResult ActOnUnevaluatedStringLiteral(ArrayRef< Token > StringToks)
SourceRange getExprRange(Expr *E) const
SemaCodeCompletion & CodeCompletion()
ExprResult ActOnCoawaitExpr(Scope *S, SourceLocation KwLoc, Expr *E)
ExprResult ActOnMemberAccessExpr(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Member, Decl *ObjCImpDecl)
The main callback when the parser finds something like expression .
ExprResult ActOnGenericSelectionExpr(SourceLocation KeyLoc, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool PredicateIsExpr, void *ControllingExprOrType, ArrayRef< ParsedType > ArgTypes, ArrayRef< Expr * > ArgExprs)
ControllingExprOrType is either an opaque pointer coming out of a ParsedType or an Expr *.
void ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope)
ActOnBlockError - If there is an error parsing a block, this callback is invoked to pop the informati...
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
ExprResult ActOnGNUNullExpr(SourceLocation TokenLoc)
ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E)
ExprResult ActOnSourceLocExpr(SourceLocIdentKind Kind, SourceLocation BuiltinLoc, SourceLocation RPLoc)
ExprResult ActOnConditionalOp(SourceLocation QuestionLoc, SourceLocation ColonLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr)
ActOnConditionalOp - Parse a ?: operation.
LabelDecl * LookupOrCreateLabel(IdentifierInfo *II, SourceLocation IdentLoc, SourceLocation GnuLabelLoc=SourceLocation())
LookupOrCreateLabel - Do a name lookup of a label with the specified name.
TypeResult ActOnTypeName(Declarator &D)
ParsedTemplateArgument ActOnPackExpansion(const ParsedTemplateArgument &Arg, SourceLocation EllipsisLoc)
Invoked when parsing a template argument followed by an ellipsis, which creates a pack expansion.
ExprResult ActOnStringLiteral(ArrayRef< Token > StringToks, Scope *UDLScope=nullptr)
ActOnStringLiteral - The specified tokens were lexed as pasted string fragments (e....
ExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc, tok::TokenKind Kind, Expr *LHSExpr, Expr *RHSExpr)
Binary Operators. 'Tok' is the token for the operator.
ParsedType getTypeName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec *SS=nullptr, bool isClassName=false, bool HasTrailingDot=false, ParsedType ObjectType=nullptr, bool IsCtorOrDtorName=false, bool WantNontrivialTypeSourceInfo=false, bool IsClassTemplateDeductionContext=true, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No, IdentifierInfo **CorrectedII=nullptr)
If the identifier refers to a type name within this scope, return the declaration of that type.
ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind)
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
ExprResult ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
Parse a __builtin_astype expression.
ExprResult ActOnVAArg(SourceLocation BuiltinLoc, Expr *E, ParsedType Ty, SourceLocation RPLoc)
ExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, Declarator &D, ParsedType &Ty, SourceLocation RParenLoc, Expr *CastExpr)
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
ExprResult ActOnSizeofParameterPackExpr(Scope *S, SourceLocation OpLoc, IdentifierInfo &Name, SourceLocation NameLoc, SourceLocation RParenLoc)
Called when an expression computing the size of a parameter pack is parsed.
ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc)
ExprResult ActOnCXXFoldExpr(Scope *S, SourceLocation LParenLoc, Expr *LHS, tok::TokenKind Operator, SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc)
Handle a C++1z fold-expression: ( expr op ... op expr ).
ExprResult ActOnBlockStmtExpr(SourceLocation CaretLoc, Stmt *Body, Scope *CurScope)
ActOnBlockStmtExpr - This is called when the body of a block statement literal was successfully compl...
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Kind, Expr *Input)
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope=nullptr)
void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope)
ActOnBlockStart - This callback is invoked when a block literal is started.
ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc, MultiExprArg ArgExprs, SourceLocation RLoc)
ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr)
ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
ExprResult ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc, UnaryExprOrTypeTrait ExprKind, bool IsType, void *TyOrEx, SourceRange ArgRange)
ActOnUnaryExprOrTypeTraitExpr - Handle sizeof(type) and sizeof expr and the same for alignof and __al...
void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo, Scope *CurScope)
ActOnBlockArguments - This callback allows processing of block arguments.
ExprResult ActOnConvertVectorExpr(Expr *E, ParsedType ParsedDestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
ActOnConvertVectorExpr - create a new convert-vector expression from the provided arguments.
ExprResult ActOnBuiltinOffsetOf(Scope *S, SourceLocation BuiltinLoc, SourceLocation TypeLoc, ParsedType ParsedArgTy, ArrayRef< OffsetOfComponent > Components, SourceLocation RParenLoc)
ExprResult CorrectDelayedTyposInExpr(Expr *E, VarDecl *InitDecl=nullptr, bool RecoverUncorrectedTypos=false, llvm::function_ref< ExprResult(Expr *)> Filter=[](Expr *E) -> ExprResult { return E;})
Process any TypoExprs in the given Expr and its children, generating diagnostics as appropriate and r...
ExprResult ActOnNameClassifiedAsOverloadSet(Scope *S, Expr *OverloadSet)
Act on the result of classifying a name as an overload set.
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.
This class handles loading and caching of source files into memory.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Stmt - This represents one statement.
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 setKind(tok::TokenKind K)
SourceLocation getAnnotationEndLoc() const
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)) {....
void * getAnnotationValue() const
tok::TokenKind getKind() const
bool isAtStartOfLine() const
isAtStartOfLine - Return true if this token is at the start of a line.
bool isOneOf(tok::TokenKind K1, tok::TokenKind K2) const
bool isNot(tok::TokenKind K) const
bool isObjCAtKeyword(tok::ObjCKeywordKind objcKey) const
Return true if we have an ObjC keyword identifier.
bool isSimpleTypeSpecifier(const LangOptions &LangOpts) const
Determine whether the token kind starts a simple-type-specifier.
SourceLocation getLastLoc() const
Base wrapper for a particular "section" of type source info.
The base class of the type hierarchy.
bool isSpecificPlaceholderType(unsigned K) const
Test for a specific placeholder type.
bool isFunctionType() const
bool isVectorType() const
Simple class containing the result of Sema::CorrectTypo.
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
Represents a C++ unqualified-id that has been parsed.
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 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.
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.
ActionResult< Expr * > ExprResult
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.
const FunctionProtoType * T
@ Parens
New-expression has a C++98 paren-delimited initializer.
@ EST_None
no exception specification
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.
Helper class to shuttle information about #embed directives from the preprocessor to the parser throu...
Wraps an identifier and optional source location for the identifier.
Information about a template-id annotation token.
TemplateNameKind Kind
The kind of template that Template refers to.