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;
271 ExprResult LHS(ParseCastExpression(AnyCastExpr));
293 bool NotPrimaryExpression =
false;
294 auto ParsePrimary = [&] () {
295 ExprResult E = ParseCastExpression(PrimaryExprOnly,
299 &NotPrimaryExpression);
303 E = ParsePostfixExpressionSuffix(
E);
310 ? diag::note_unparenthesized_non_primary_expr_in_requires_clause
311 : diag::err_unparenthesized_non_primary_expr_in_requires_clause)
319 if (NotPrimaryExpression ||
326 Tok.
isOneOf(tok::period, tok::plusplus, tok::minusminus) ||
327 (Tok.
is(tok::l_square) && !
NextToken().is(tok::l_square))) {
328 E = RecoverFromNonPrimary(
E,
false);
331 NotPrimaryExpression =
false;
333 bool PossibleNonPrimary;
334 bool IsConstraintExpr =
336 IsTrailingRequiresClause);
337 if (!IsConstraintExpr || PossibleNonPrimary) {
342 if (PossibleNonPrimary)
343 E = RecoverFromNonPrimary(
E, !IsConstraintExpr);
352 while (Tok.
is(tok::ampamp)) {
360 tok::ampamp, LHS.
get(), RHS.
get());
386 while (Tok.
is(tok::pipepipe)) {
395 tok::pipepipe, LHS.
get(), RHS.
get());
406bool Parser::isNotExpressionStart() {
408 if (K == tok::l_brace || K == tok::r_brace ||
409 K == tok::kw_for || K == tok::kw_while ||
410 K == tok::kw_if || K == tok::kw_else ||
411 K == tok::kw_goto || K == tok::kw_try)
414 return isKnownToBeDeclarationSpecifier();
417bool Parser::isFoldOperator(
prec::Level Level)
const {
431 GreaterThanIsOperator,
435 auto SavedType = PreferredType;
438 PreferredType = SavedType;
442 if (NextTokPrec < MinPrec)
449 if (OpToken.
is(tok::caretcaret)) {
450 return ExprError(
Diag(Tok, diag::err_opencl_logical_exclusive_or));
455 if (OpToken.
isOneOf(tok::comma, tok::greater, tok::greatergreater,
456 tok::greatergreatergreater) &&
457 checkPotentialAngleBracketDelimiter(OpToken))
465 if (OpToken.
is(tok::comma) && isNotExpressionStart()) {
473 if (isFoldOperator(NextTokPrec) && Tok.
is(tok::ellipsis)) {
487 Tok.
isOneOf(tok::colon, tok::r_square) &&
500 TernaryMiddle = ParseBraceInitializer();
501 if (!TernaryMiddle.isInvalid()) {
502 Diag(BraceLoc, diag::err_init_list_bin_op)
507 }
else if (Tok.
isNot(tok::colon)) {
519 TernaryMiddle =
nullptr;
520 Diag(Tok, diag::ext_gnu_conditional_expr);
523 if (TernaryMiddle.isInvalid()) {
526 TernaryMiddle =
nullptr;
535 const char *FIText =
": ";
539 bool IsInvalid =
false;
540 const char *SourcePtr =
542 if (!IsInvalid && *SourcePtr ==
' ') {
545 if (!IsInvalid && *SourcePtr ==
' ') {
552 Diag(Tok, diag::err_expected)
554 Diag(OpToken, diag::note_matching) << tok::question;
572 bool RHSIsInitList =
false;
574 RHS = ParseBraceInitializer();
575 RHSIsInitList =
true;
579 RHS = ParseCastExpression(AnyCastExpr);
585 if (TernaryMiddle.isUsable())
602 if (ThisPrec < NextTokPrec ||
603 (ThisPrec == NextTokPrec && isRightAssoc)) {
605 Diag(Tok, diag::err_init_list_bin_op)
614 RHS = ParseRHSOfBinaryExpression(RHS,
615 static_cast<prec::Level>(ThisPrec + !isRightAssoc));
616 RHSIsInitList =
false;
622 if (TernaryMiddle.isUsable())
633 Diag(OpToken, diag::warn_cxx98_compat_generalized_initializer_lists)
635 }
else if (ColonLoc.
isValid()) {
636 Diag(ColonLoc, diag::err_init_list_bin_op)
641 Diag(OpToken, diag::err_init_list_bin_op)
651 if (TernaryMiddle.isInvalid()) {
655 if (!GreaterThanIsOperator && OpToken.
is(tok::greatergreater))
657 diag::warn_cxx11_right_shift_in_template_arg,
667 {LHS.get(), RHS.get()});
675 std::vector<clang::Expr *> Args;
677 if (TernaryMiddle.get())
678 Args = {LHS.
get(), TernaryMiddle.get(), RHS.
get()};
680 Args = {LHS.
get(), RHS.
get()};
708ExprResult Parser::ParseCastExpression(CastParseKind ParseKind,
709 bool isAddressOfOperand,
710 TypeCastState isTypeCast,
711 bool isVectorLiteral,
712 bool *NotPrimaryExpression) {
714 ExprResult Res = ParseCastExpression(ParseKind,
719 NotPrimaryExpression);
721 Diag(Tok, diag::err_expected_expression);
728 CastExpressionIdValidator(
Token Next,
bool AllowTypes,
bool AllowNonTypes)
729 : NextToken(Next), AllowNonTypes(AllowNonTypes) {
730 WantTypeSpecifiers = WantFunctionLikeCasts = AllowTypes;
733 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
738 if (isa<TypeDecl>(ND))
739 return WantTypeSpecifiers;
744 if (!NextToken.isOneOf(tok::equal, tok::arrow, tok::period))
747 for (
auto *
C : candidate) {
749 if (isa<ValueDecl>(ND) && !isa<FunctionDecl>(ND))
755 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
756 return std::make_unique<CastExpressionIdValidator>(*
this);
767 if (RevertibleTypeTraits.empty()) {
771#define RTT_JOIN(X, Y) X##Y
772#define REVERTIBLE_TYPE_TRAIT(Name) \
773 RevertibleTypeTraits[PP.getIdentifierInfo(#Name)] = RTT_JOIN(tok::kw_, Name)
831#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) \
832 REVERTIBLE_TYPE_TRAIT(RTT_JOIN(__, Trait));
833#include "clang/Basic/TransformTypeTraits.def"
834#undef REVERTIBLE_TYPE_TRAIT
837 llvm::SmallDenseMap<IdentifierInfo *, tok::TokenKind>::iterator Known =
838 RevertibleTypeTraits.find(II);
839 if (Known != RevertibleTypeTraits.end()) {
841 *
Kind = Known->second;
847ExprResult Parser::ParseBuiltinPtrauthTypeDiscriminator() {
851 if (
T.expectAndConsume())
863 Loc, UETT_PtrAuthTypeDiscriminator,
1050ExprResult Parser::ParseCastExpression(CastParseKind ParseKind,
1051 bool isAddressOfOperand,
1053 TypeCastState isTypeCast,
1054 bool isVectorLiteral,
1055 bool *NotPrimaryExpression) {
1058 auto SavedType = PreferredType;
1059 NotCastExpr =
false;
1064 bool AllowSuffix =
true;
1076 switch (SavedKind) {
1077 case tok::l_paren: {
1080 ParenParseOption ParenExprType;
1081 switch (ParseKind) {
1082 case CastParseKind::UnaryExprOnly:
1085 case CastParseKind::AnyCastExpr:
1086 ParenExprType = ParenParseOption::CastExpr;
1088 case CastParseKind::PrimaryExprOnly:
1089 ParenExprType = FoldExpr;
1094 Res = ParseParenExpression(ParenExprType,
false,
1095 isTypeCast ==
IsTypeCast, CastTy, RParenLoc);
1100 if (isVectorLiteral)
1103 switch (ParenExprType) {
1104 case SimpleExpr:
break;
1106 case CompoundLiteral:
1124 case tok::numeric_constant:
1125 case tok::binary_data:
1135 Res = ParseCXXBoolLiteral();
1138 case tok::kw___objc_yes:
1139 case tok::kw___objc_no:
1140 Res = ParseObjCBoolLiteral();
1143 case tok::kw_nullptr:
1145 Diag(Tok, diag::warn_cxx98_compat_nullptr);
1148 : diag::ext_c_nullptr) << Tok.
getName();
1153 case tok::annot_primary_expr:
1154 case tok::annot_overload_set:
1155 Res = getExprAnnotation(Tok);
1158 ConsumeAnnotationToken();
1160 checkPotentialAngleBracket(Res);
1163 case tok::annot_non_type:
1164 case tok::annot_non_type_dependent:
1165 case tok::annot_non_type_undeclared: {
1168 Res = tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement);
1170 "should not perform typo correction on annotation token");
1174 case tok::annot_embed: {
1175 injectEmbedTokens();
1176 return ParseCastExpression(ParseKind, isAddressOfOperand, isTypeCast,
1177 isVectorLiteral, NotPrimaryExpression);
1180 case tok::kw___super:
1181 case tok::kw_decltype:
1185 assert(Tok.
isNot(tok::kw_decltype) && Tok.
isNot(tok::kw___super));
1186 return ParseCastExpression(ParseKind, isAddressOfOperand, isTypeCast,
1187 isVectorLiteral, NotPrimaryExpression);
1189 case tok::identifier:
1200 if (Next.is(tok::ellipsis) && Tok.
is(tok::identifier) &&
1201 GetLookAheadToken(2).is(tok::l_square)) {
1206 Tok.
is(tok::annot_pack_indexing_type))
1207 return ParseCastExpression(ParseKind, isAddressOfOperand, isTypeCast,
1208 isVectorLiteral, NotPrimaryExpression);
1214 else if (Next.is(tok::l_paren) && Tok.
is(tok::identifier) &&
1218 if (isRevertibleTypeTrait(II, &Kind)) {
1220 return ParseCastExpression(ParseKind, isAddressOfOperand,
1221 NotCastExpr, isTypeCast,
1222 isVectorLiteral, NotPrimaryExpression);
1226 else if ((!ColonIsSacred && Next.is(tok::colon)) ||
1227 Next.isOneOf(tok::coloncolon, tok::less, tok::l_paren,
1232 if (!Tok.
is(tok::identifier))
1233 return ParseCastExpression(ParseKind, isAddressOfOperand,
1234 NotCastExpr, isTypeCast,
1236 NotPrimaryExpression);
1249 (&II == Ident_super &&
getCurScope()->isInObjcMethodScope()))) {
1252 if (Tok.
is(tok::code_completion) && &II != Ident_super) {
1255 getCurScope(), II, ILoc, ExprStatementTokLoc == ILoc);
1259 if (Tok.
isNot(tok::identifier) &&
1261 Diag(Tok, diag::err_expected_property_name);
1276 if (
getLangOpts().
ObjC && &II == Ident_super && !InMessageExpression &&
1278 ((Tok.
is(tok::identifier) &&
1280 Tok.
is(tok::code_completion))) {
1281 Res = ParseObjCMessageExpressionBody(
SourceLocation(), ILoc,
nullptr,
1292 ((Tok.
is(tok::identifier) && !InMessageExpression) ||
1293 Tok.
is(tok::code_completion))) {
1295 if (Tok.
is(tok::code_completion) ||
1296 Next.is(tok::colon) || Next.is(tok::r_square))
1298 if (Typ.get()->isObjCObjectOrInterfaceType()) {
1301 DS.SetRangeStart(ILoc);
1302 DS.SetRangeEnd(ILoc);
1303 const char *PrevSpec =
nullptr;
1305 DS.SetTypeSpecType(
TST_typename, ILoc, PrevSpec, DiagID, Typ,
1322 if (isAddressOfOperand && isPostfixExpressionSuffixStart())
1323 isAddressOfOperand =
false;
1332 CastExpressionIdValidator Validator(
1336 Validator.IsAddressOfOperand = isAddressOfOperand;
1337 if (Tok.
isOneOf(tok::periodstar, tok::arrowstar)) {
1338 Validator.WantExpressionKeywords =
false;
1339 Validator.WantRemainingKeywords =
false;
1341 Validator.WantRemainingKeywords = Tok.
isNot(tok::r_paren);
1343 Name.setIdentifier(&II, ILoc);
1345 getCurScope(), ScopeSpec, TemplateKWLoc, Name, Tok.
is(tok::l_paren),
1346 isAddressOfOperand, &Validator,
1348 Tok.
is(tok::r_paren) ?
nullptr : &Replacement);
1350 UnconsumeToken(Replacement);
1351 return ParseCastExpression(ParseKind, isAddressOfOperand,
1352 NotCastExpr, isTypeCast,
1354 NotPrimaryExpression);
1356 Res = tryParseCXXPackIndexingExpression(Res);
1358 checkPotentialAngleBracket(Res);
1361 case tok::char_constant:
1362 case tok::wide_char_constant:
1363 case tok::utf8_char_constant:
1364 case tok::utf16_char_constant:
1365 case tok::utf32_char_constant:
1369 case tok::kw___func__:
1370 case tok::kw___FUNCTION__:
1371 case tok::kw___FUNCDNAME__:
1372 case tok::kw___FUNCSIG__:
1373 case tok::kw_L__FUNCTION__:
1374 case tok::kw_L__FUNCSIG__:
1375 case tok::kw___PRETTY_FUNCTION__:
1387 case tok::string_literal:
1388 case tok::wide_string_literal:
1389 case tok::utf8_string_literal:
1390 case tok::utf16_string_literal:
1391 case tok::utf32_string_literal:
1394 case tok::kw__Generic:
1395 Res = ParseGenericSelectionExpression();
1397 case tok::kw___builtin_available:
1398 Res = ParseAvailabilityCheckExpr(Tok.
getLocation());
1400 case tok::kw___builtin_va_arg:
1401 case tok::kw___builtin_offsetof:
1402 case tok::kw___builtin_choose_expr:
1403 case tok::kw___builtin_astype:
1404 case tok::kw___builtin_convertvector:
1405 case tok::kw___builtin_COLUMN:
1406 case tok::kw___builtin_FILE:
1407 case tok::kw___builtin_FILE_NAME:
1408 case tok::kw___builtin_FUNCTION:
1409 case tok::kw___builtin_FUNCSIG:
1410 case tok::kw___builtin_LINE:
1411 case tok::kw___builtin_source_location:
1412 if (NotPrimaryExpression)
1413 *NotPrimaryExpression =
true;
1415 return ParseBuiltinPrimaryExpression();
1416 case tok::kw___null:
1421 case tok::minusminus: {
1422 if (NotPrimaryExpression)
1423 *NotPrimaryExpression =
true;
1428 Token SavedTok = Tok;
1437 UnaryExprOnly : AnyCastExpr,
1444 UnconsumeToken(SavedTok);
1458 if (NotPrimaryExpression)
1459 *NotPrimaryExpression =
true;
1464 Res = ParseCastExpression(AnyCastExpr,
true);
1480 case tok::kw___real:
1481 case tok::kw___imag: {
1482 if (NotPrimaryExpression)
1483 *NotPrimaryExpression =
true;
1486 Res = ParseCastExpression(AnyCastExpr);
1490 isAddressOfOperand);
1497 case tok::kw_co_await: {
1498 if (NotPrimaryExpression)
1499 *NotPrimaryExpression =
true;
1501 Res = ParseCastExpression(AnyCastExpr);
1507 case tok::kw___extension__:{
1509 if (NotPrimaryExpression)
1510 *NotPrimaryExpression =
true;
1513 Res = ParseCastExpression(AnyCastExpr);
1518 case tok::kw__Alignof:
1519 diagnoseUseOfC11Keyword(Tok);
1521 case tok::kw_alignof:
1522 case tok::kw___alignof:
1524 case tok::kw_sizeof:
1528 case tok::kw___datasizeof:
1529 case tok::kw_vec_step:
1531 case tok::kw___builtin_omp_required_simd_align:
1532 case tok::kw___builtin_vectorelements:
1533 if (NotPrimaryExpression)
1534 *NotPrimaryExpression =
true;
1535 AllowSuffix =
false;
1536 Res = ParseUnaryExprOrTypeTraitExpression();
1539 if (NotPrimaryExpression)
1540 *NotPrimaryExpression =
true;
1542 if (Tok.
isNot(tok::identifier))
1543 return ExprError(
Diag(Tok, diag::err_expected) << tok::identifier);
1546 return ExprError(
Diag(Tok, diag::err_address_of_label_outside_fn));
1548 Diag(AmpAmpLoc, diag::ext_gnu_address_of_label);
1553 AllowSuffix =
false;
1556 case tok::kw_const_cast:
1557 case tok::kw_dynamic_cast:
1558 case tok::kw_reinterpret_cast:
1559 case tok::kw_static_cast:
1560 case tok::kw_addrspace_cast:
1561 if (NotPrimaryExpression)
1562 *NotPrimaryExpression =
true;
1563 Res = ParseCXXCasts();
1565 case tok::kw___builtin_bit_cast:
1566 if (NotPrimaryExpression)
1567 *NotPrimaryExpression =
true;
1568 Res = ParseBuiltinBitCast();
1570 case tok::kw_typeid:
1571 if (NotPrimaryExpression)
1572 *NotPrimaryExpression =
true;
1573 Res = ParseCXXTypeid();
1575 case tok::kw___uuidof:
1576 if (NotPrimaryExpression)
1577 *NotPrimaryExpression =
true;
1578 Res = ParseCXXUuidof();
1581 Res = ParseCXXThis();
1583 case tok::kw___builtin_sycl_unique_stable_name:
1584 Res = ParseSYCLUniqueStableNameExpression();
1587 case tok::annot_typename:
1588 if (isStartOfObjCClassMessageMissingOpenBracket()) {
1596 const char *PrevSpec =
nullptr;
1599 PrevSpec, DiagID,
Type,
1608 ConsumeAnnotationToken();
1615 case tok::annot_decltype:
1616 case tok::annot_pack_indexing_type:
1618 case tok::kw_wchar_t:
1619 case tok::kw_char8_t:
1620 case tok::kw_char16_t:
1621 case tok::kw_char32_t:
1626 case tok::kw___int64:
1627 case tok::kw___int128:
1628 case tok::kw__ExtInt:
1629 case tok::kw__BitInt:
1630 case tok::kw_signed:
1631 case tok::kw_unsigned:
1634 case tok::kw_double:
1635 case tok::kw___bf16:
1636 case tok::kw__Float16:
1637 case tok::kw___float128:
1638 case tok::kw___ibm128:
1641 case tok::kw_typename:
1642 case tok::kw_typeof:
1643 case tok::kw___vector:
1644 case tok::kw__Accum:
1645 case tok::kw__Fract:
1647#define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t:
1648#include "clang/Basic/OpenCLImageTypes.def"
1649#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case tok::kw_##Name:
1650#include "clang/Basic/HLSLIntangibleTypes.def"
1653 Diag(Tok, diag::err_expected_expression);
1658 if (NotPrimaryExpression)
1659 *NotPrimaryExpression =
true;
1661 if (SavedKind == tok::kw_typename) {
1678 ParseCXXSimpleTypeSpecifier(DS);
1679 if (Tok.
isNot(tok::l_paren) &&
1681 return ExprError(
Diag(Tok, diag::err_expected_lparen_after_type)
1682 << DS.getSourceRange());
1684 if (Tok.
is(tok::l_brace))
1685 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
1687 Res = ParseCXXTypeConstructExpression(DS);
1691 case tok::annot_cxxscope: {
1696 if (!Tok.
is(tok::annot_cxxscope))
1697 return ParseCastExpression(ParseKind, isAddressOfOperand, NotCastExpr,
1698 isTypeCast, isVectorLiteral,
1699 NotPrimaryExpression);
1702 if (Next.is(tok::annot_template_id)) {
1709 ParseOptionalCXXScopeSpecifier(SS,
nullptr,
1713 return ParseCastExpression(ParseKind, isAddressOfOperand, NotCastExpr,
1714 isTypeCast, isVectorLiteral,
1715 NotPrimaryExpression);
1720 Res = ParseCXXIdExpression(isAddressOfOperand);
1724 case tok::annot_template_id: {
1732 return ParseCastExpression(ParseKind, isAddressOfOperand,
1733 NotCastExpr, isTypeCast, isVectorLiteral,
1734 NotPrimaryExpression);
1741 case tok::kw_operator:
1742 Res = ParseCXXIdExpression(isAddressOfOperand);
1745 case tok::coloncolon: {
1750 if (!Tok.
is(tok::coloncolon))
1751 return ParseCastExpression(ParseKind, isAddressOfOperand, isTypeCast,
1752 isVectorLiteral, NotPrimaryExpression);
1757 if (Tok.
is(tok::kw_new)) {
1758 if (NotPrimaryExpression)
1759 *NotPrimaryExpression =
true;
1760 Res = ParseCXXNewExpression(
true, CCLoc);
1761 AllowSuffix =
false;
1764 if (Tok.
is(tok::kw_delete)) {
1765 if (NotPrimaryExpression)
1766 *NotPrimaryExpression =
true;
1767 Res = ParseCXXDeleteExpression(
true, CCLoc);
1768 AllowSuffix =
false;
1773 Diag(CCLoc, diag::err_expected_expression);
1778 if (NotPrimaryExpression)
1779 *NotPrimaryExpression =
true;
1780 Res = ParseCXXNewExpression(
false, Tok.
getLocation());
1781 AllowSuffix =
false;
1784 case tok::kw_delete:
1785 if (NotPrimaryExpression)
1786 *NotPrimaryExpression =
true;
1787 Res = ParseCXXDeleteExpression(
false, Tok.
getLocation());
1788 AllowSuffix =
false;
1791 case tok::kw_requires:
1792 Res = ParseRequiresExpression();
1793 AllowSuffix =
false;
1796 case tok::kw_noexcept: {
1797 if (NotPrimaryExpression)
1798 *NotPrimaryExpression =
true;
1799 Diag(Tok, diag::warn_cxx98_compat_noexcept_expr);
1803 if (
T.expectAndConsume(diag::err_expected_lparen_after,
"noexcept"))
1816 T.getCloseLocation());
1817 AllowSuffix =
false;
1821#define TYPE_TRAIT(N,Spelling,K) \
1822 case tok::kw_##Spelling:
1823#include "clang/Basic/TokenKinds.def"
1824 Res = ParseTypeTrait();
1827 case tok::kw___array_rank:
1828 case tok::kw___array_extent:
1829 if (NotPrimaryExpression)
1830 *NotPrimaryExpression =
true;
1831 Res = ParseArrayTypeTrait();
1834 case tok::kw___builtin_ptrauth_type_discriminator:
1835 return ParseBuiltinPtrauthTypeDiscriminator();
1837 case tok::kw___is_lvalue_expr:
1838 case tok::kw___is_rvalue_expr:
1839 if (NotPrimaryExpression)
1840 *NotPrimaryExpression =
true;
1841 Res = ParseExpressionTrait();
1845 if (NotPrimaryExpression)
1846 *NotPrimaryExpression =
true;
1848 return ParseObjCAtExpression(AtLoc);
1851 Res = ParseBlockLiteralExpression();
1853 case tok::code_completion: {
1859#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
1860#include "clang/Basic/TransformTypeTraits.def"
1865 Diag(Tok, diag::ext_keyword_as_ident)
1867 goto ParseIdentifier;
1869 goto ExpectedExpression;
1878 Res = TryParseLambdaExpression();
1882 if (NotPrimaryExpression)
1883 *NotPrimaryExpression =
true;
1884 Res = ParseObjCMessageExpression();
1888 Res = ParseLambdaExpression();
1892 Res = ParseObjCMessageExpression();
1906 if (ParseKind == PrimaryExprOnly)
1921 case tok::minusminus:
1939 Diag(Tok.
getLocation(), diag::err_postfix_after_unary_requires_parens)
1947 PreferredType = SavedType;
1948 Res = ParsePostfixExpressionSuffix(Res);
1950 !
getActions().getOpenCLOptions().isAvailableOption(
1952 if (
Expr *PostfixExpr = Res.
get()) {
1953 QualType Ty = PostfixExpr->getType();
1955 Diag(PostfixExpr->getExprLoc(),
1956 diag::err_opencl_taking_function_address_parser);
1986Parser::ParsePostfixExpressionSuffix(
ExprResult LHS) {
1990 auto SavedType = PreferredType;
1993 PreferredType = SavedType;
1995 case tok::code_completion:
1996 if (InMessageExpression)
2004 case tok::identifier:
2011 nullptr, LHS.
get());
2019 case tok::l_square: {
2027 isSimpleObjCMessageExpression())
2032 if (CheckProhibitedCXX11Attribute()) {
2038 Loc =
T.getOpenLocation();
2041 ExprVector ArgExprs;
2042 bool HasError =
false;
2049 if ((!
getLangOpts().OpenMP && !AllowOpenACCArraySections) ||
2050 Tok.
isNot(tok::colon)) {
2054 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
2055 Idx = ParseBraceInitializer();
2064 ArgExprs.push_back(Idx.
get());
2066 }
else if (Tok.
isNot(tok::r_square)) {
2067 if (ParseExpressionList(ArgExprs)) {
2078 if (ArgExprs.size() <= 1 && AllowOpenACCArraySections) {
2080 if (Tok.
is(tok::colon)) {
2083 if (Tok.
isNot(tok::r_square))
2086 }
else if (ArgExprs.size() <= 1 &&
getLangOpts().OpenMP) {
2088 if (Tok.
is(tok::colon)) {
2091 if (Tok.
isNot(tok::r_square) &&
2099 (OMPClauseKind == llvm::omp::Clause::OMPC_to ||
2100 OMPClauseKind == llvm::omp::Clause::OMPC_from) &&
2101 Tok.
is(tok::colon)) {
2104 if (Tok.
isNot(tok::r_square)) {
2113 if (!LHS.
isInvalid() && !HasError && !Length.isInvalid() &&
2120 if (AllowOpenACCArraySections) {
2122 "Stride/second colon not allowed for OpenACC");
2124 LHS.
get(),
Loc, ArgExprs.empty() ?
nullptr : ArgExprs[0],
2125 ColonLocFirst, Length.get(), RLoc);
2128 LHS.
get(),
Loc, ArgExprs.empty() ?
nullptr : ArgExprs[0],
2129 ColonLocFirst, ColonLocSecond, Length.get(), Stride.
get(),
2146 case tok::lesslessless: {
2151 Expr *ExecConfig =
nullptr;
2155 if (OpKind == tok::lesslessless) {
2156 ExprVector ExecConfigExprs;
2159 if (ParseSimpleExpressionList(ExecConfigExprs)) {
2170 Diag(Tok, diag::err_expected) << tok::greatergreatergreater;
2171 Diag(OpenLoc, diag::note_matching) << tok::lesslessless;
2177 if (ExpectAndConsume(tok::l_paren))
2180 Loc = PrevTokLocation;
2185 getCurScope(), OpenLoc, ExecConfigExprs, CloseLoc);
2189 ExecConfig = ECResult.
get();
2193 Loc = PT.getOpenLocation();
2196 ExprVector ArgExprs;
2197 auto RunSignatureHelp = [&]() ->
QualType {
2200 LHS.
get(), ArgExprs, PT.getOpenLocation());
2201 CalledSignatureHelp =
true;
2202 return PreferredType;
2204 if (OpKind == tok::l_paren || !LHS.
isInvalid()) {
2205 if (Tok.
isNot(tok::r_paren)) {
2206 if (ParseExpressionList(ArgExprs, [&] {
2207 PreferredType.enterFunctionArgument(Tok.
getLocation(),
2219 for (
auto &
E : ArgExprs)
2228 }
else if (Tok.
isNot(tok::r_paren)) {
2229 bool HadDelayedTypo =
false;
2231 HadDelayedTypo =
true;
2232 for (
auto &
E : ArgExprs)
2234 HadDelayedTypo =
true;
2249 ArgExprs.insert(ArgExprs.begin(), Fn);
2267 bool MayBePseudoDestructor =
false;
2270 PreferredType.enterMemAccess(Actions, Tok.
getLocation(), OrigLHS);
2274 const Type* BaseType =
Base->getType().getTypePtrOrNull();
2275 if (BaseType && Tok.
is(tok::l_paren) &&
2278 Diag(OpLoc, diag::err_function_is_not_record)
2279 << OpKind <<
Base->getSourceRange()
2281 return ParsePostfixExpressionSuffix(
Base);
2286 MayBePseudoDestructor);
2291 if (Tok.
is(tok::code_completion)) {
2297 ParseOptionalCXXScopeSpecifier(
2299 false, &MayBePseudoDestructor);
2301 ObjectType =
nullptr;
2304 if (Tok.
is(tok::code_completion)) {
2306 OpKind == tok::arrow ? tok::period : tok::arrow;
2313 getCurScope(), OrigLHS, OpLoc, CorrectedOpKind, ObjectType,
2314 MayBePseudoDestructor);
2318 Expr *CorrectedBase = CorrectedLHS.get();
2320 CorrectedBase =
Base;
2326 Base && ExprStatementTokLoc ==
Base->getBeginLoc(),
2332 if (MayBePseudoDestructor && !LHS.
isInvalid()) {
2333 LHS = ParseCXXPseudoDestructor(LHS.
get(), OpLoc, OpKind, SS,
2348 Tok.
is(tok::kw_class)) {
2358 Name.setIdentifier(
Id,
Loc);
2365 false, &TemplateKWLoc, Name)) {
2372 OpKind, SS, TemplateKWLoc, Name,
2373 CurParsedObjCImpl ? CurParsedObjCImpl->Dcl
2376 if (Tok.
is(tok::less))
2377 checkPotentialAngleBracket(LHS);
2378 }
else if (OrigLHS && Name.isValid()) {
2381 Name.getEndLoc(), {OrigLHS});
2386 case tok::minusminus:
2434Parser::ParseExprAfterUnaryExprOrTypeTrait(
const Token &OpTok,
2439 assert(OpTok.
isOneOf(tok::kw_typeof, tok::kw_typeof_unqual, tok::kw_sizeof,
2440 tok::kw___datasizeof, tok::kw___alignof, tok::kw_alignof,
2441 tok::kw__Alignof, tok::kw_vec_step,
2442 tok::kw___builtin_omp_required_simd_align,
2443 tok::kw___builtin_vectorelements) &&
2444 "Not a typeof/sizeof/alignof/vec_step expression!");
2449 if (Tok.
isNot(tok::l_paren)) {
2452 if (OpTok.
isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2453 tok::kw_alignof, tok::kw__Alignof)) {
2454 if (isTypeIdUnambiguously()) {
2456 ParseSpecifierQualifierList(DS);
2459 ParseDeclarator(DeclaratorInfo);
2465 diag::err_expected_parentheses_around_typename)
2468 Diag(LParenLoc, diag::err_expected_parentheses_around_typename)
2478 if (OpTok.
isOneOf(tok::kw_typeof, tok::kw_typeof_unqual) &&
2489 if (OpTok.
isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2490 tok::kw_alignof, tok::kw__Alignof) &&
2491 Tok.
isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2492 tok::kw_alignof, tok::kw__Alignof))
2494 Operand = ParseCastExpression(UnaryExprOnly);
2497 Operand = ParseCastExpression(UnaryExprOnly);
2503 ParenParseOption ExprType =
CastExpr;
2506 Operand = ParseParenExpression(ExprType,
true,
2507 false, CastTy, RParenLoc);
2518 !OpTok.
isOneOf(tok::kw_typeof, tok::kw_typeof_unqual)) {
2535ExprResult Parser::ParseSYCLUniqueStableNameExpression() {
2536 assert(Tok.
is(tok::kw___builtin_sycl_unique_stable_name) &&
2537 "Not __builtin_sycl_unique_stable_name");
2543 if (
T.expectAndConsume(diag::err_expected_lparen_after,
2544 "__builtin_sycl_unique_stable_name"))
2554 if (
T.consumeClose())
2558 OpLoc,
T.getOpenLocation(),
T.getCloseLocation(), Ty.
get());
2575ExprResult Parser::ParseUnaryExprOrTypeTraitExpression() {
2576 assert(Tok.
isOneOf(tok::kw_sizeof, tok::kw___datasizeof, tok::kw___alignof,
2577 tok::kw_alignof, tok::kw__Alignof, tok::kw_vec_step,
2578 tok::kw___builtin_omp_required_simd_align,
2579 tok::kw___builtin_vectorelements) &&
2580 "Not a sizeof/alignof/vec_step expression!");
2585 if (Tok.
is(tok::ellipsis) && OpTok.
is(tok::kw_sizeof)) {
2590 if (Tok.
is(tok::l_paren)) {
2593 LParenLoc =
T.getOpenLocation();
2594 if (Tok.
is(tok::identifier)) {
2598 RParenLoc =
T.getCloseLocation();
2602 Diag(Tok, diag::err_expected_parameter_pack);
2605 }
else if (Tok.
is(tok::identifier)) {
2610 Diag(LParenLoc, diag::err_paren_sizeof_parameter_pack)
2615 Diag(Tok, diag::err_sizeof_parameter_pack);
2632 OpTok.
isOneOf(tok::kw_alignof, tok::kw__Alignof))
2633 Diag(OpTok, diag::warn_cxx98_compat_alignof);
2635 Diag(OpTok, diag::warn_c23_compat_keyword) << OpTok.
getName();
2651 case tok::kw_alignof:
2652 case tok::kw__Alignof:
2653 ExprKind = UETT_AlignOf;
2655 case tok::kw___alignof:
2656 ExprKind = UETT_PreferredAlignOf;
2658 case tok::kw_vec_step:
2659 ExprKind = UETT_VecStep;
2661 case tok::kw___builtin_omp_required_simd_align:
2662 ExprKind = UETT_OpenMPRequiredSimdAlign;
2664 case tok::kw___datasizeof:
2665 ExprKind = UETT_DataSizeOf;
2667 case tok::kw___builtin_vectorelements:
2668 ExprKind = UETT_VectorElements;
2681 if (OpTok.
isOneOf(tok::kw_alignof, tok::kw__Alignof))
2717ExprResult Parser::ParseBuiltinPrimaryExpression() {
2725 if (Tok.
isNot(tok::l_paren))
2726 return ExprError(
Diag(Tok, diag::err_expected_after) << BuiltinII
2735 default: llvm_unreachable(
"Not a builtin primary expression!");
2736 case tok::kw___builtin_va_arg: {
2739 if (ExpectAndConsume(tok::comma)) {
2746 if (Tok.
isNot(tok::r_paren)) {
2747 Diag(Tok, diag::err_expected) << tok::r_paren;
2757 case tok::kw___builtin_offsetof: {
2763 if (MacroName ==
"offsetof")
2776 if (ExpectAndConsume(tok::comma)) {
2782 if (Tok.
isNot(tok::identifier)) {
2783 Diag(Tok, diag::err_expected) << tok::identifier;
2792 Comps.back().isBrackets =
false;
2794 Comps.back().LocStart = Comps.back().LocEnd =
ConsumeToken();
2798 if (Tok.
is(tok::period)) {
2801 Comps.back().isBrackets =
false;
2804 if (Tok.
isNot(tok::identifier)) {
2805 Diag(Tok, diag::err_expected) << tok::identifier;
2811 }
else if (Tok.
is(tok::l_square)) {
2812 if (CheckProhibitedCXX11Attribute())
2817 Comps.back().isBrackets =
true;
2820 Comps.back().LocStart = ST.getOpenLocation();
2826 Comps.back().U.E = Res.
get();
2829 Comps.back().LocEnd = ST.getCloseLocation();
2831 if (Tok.
isNot(tok::r_paren)) {
2840 PT.getCloseLocation());
2847 case tok::kw___builtin_choose_expr: {
2849 if (Cond.isInvalid()) {
2853 if (ExpectAndConsume(tok::comma)) {
2859 if (Expr1.isInvalid()) {
2863 if (ExpectAndConsume(tok::comma)) {
2869 if (Expr2.isInvalid()) {
2873 if (Tok.
isNot(tok::r_paren)) {
2874 Diag(Tok, diag::err_expected) << tok::r_paren;
2878 Expr2.get(), ConsumeParen());
2881 case tok::kw___builtin_astype: {
2884 if (
Expr.isInvalid()) {
2889 if (ExpectAndConsume(tok::comma)) {
2900 if (Tok.
isNot(tok::r_paren)) {
2901 Diag(Tok, diag::err_expected) << tok::r_paren;
2910 case tok::kw___builtin_convertvector: {
2913 if (
Expr.isInvalid()) {
2918 if (ExpectAndConsume(tok::comma)) {
2929 if (Tok.
isNot(tok::r_paren)) {
2930 Diag(Tok, diag::err_expected) << tok::r_paren;
2939 case tok::kw___builtin_COLUMN:
2940 case tok::kw___builtin_FILE:
2941 case tok::kw___builtin_FILE_NAME:
2942 case tok::kw___builtin_FUNCTION:
2943 case tok::kw___builtin_FUNCSIG:
2944 case tok::kw___builtin_LINE:
2945 case tok::kw___builtin_source_location: {
2947 if (Tok.
isNot(tok::r_paren)) {
2948 Diag(Tok, diag::err_expected) << tok::r_paren;
2954 case tok::kw___builtin_FILE:
2956 case tok::kw___builtin_FILE_NAME:
2958 case tok::kw___builtin_FUNCTION:
2960 case tok::kw___builtin_FUNCSIG:
2962 case tok::kw___builtin_LINE:
2964 case tok::kw___builtin_COLUMN:
2966 case tok::kw___builtin_source_location:
2969 llvm_unreachable(
"invalid keyword");
2982 return ParsePostfixExpressionSuffix(Res.
get());
2985bool Parser::tryParseOpenMPArrayShapingCastPart() {
2986 assert(Tok.
is(tok::l_square) &&
"Expected open bracket");
2987 bool ErrorFound =
true;
2988 TentativeParsingAction TPA(*
this);
2990 if (Tok.
isNot(tok::l_square))
2995 while (!
SkipUntil(tok::r_square, tok::annot_pragma_openmp_end,
2998 if (Tok.
isNot(tok::r_square))
3003 if (Tok.
is(tok::r_paren)) {
3007 }
while (Tok.
isNot(tok::annot_pragma_openmp_end));
3040Parser::ParseParenExpression(ParenParseOption &ExprType,
bool stopIfCastExpr,
3043 assert(Tok.
is(tok::l_paren) &&
"Not a paren expr!");
3046 if (
T.consumeOpen())
3050 PreferredType.enterParenExpr(Tok.
getLocation(), OpenLoc);
3053 bool isAmbiguousTypeId;
3056 if (Tok.
is(tok::code_completion)) {
3060 ExprType >= CompoundLiteral);
3067 tok::kw___bridge_transfer,
3068 tok::kw___bridge_retained,
3069 tok::kw___bridge_retain));
3070 if (BridgeCast && !
getLangOpts().ObjCAutoRefCount) {
3072 StringRef BridgeCastName = Tok.
getName();
3075 Diag(BridgeKeywordLoc, diag::warn_arc_bridge_cast_nonarc)
3085 Diag(Tok, OpenLoc.
isMacroID() ? diag::ext_gnu_statement_expr_macro
3086 : diag::ext_gnu_statement_expr);
3088 checkCompoundToken(OpenLoc, tok::l_paren, CompoundToken::StmtExprBegin);
3097 while (CodeDC->
isRecord() || isa<EnumDecl>(CodeDC)) {
3100 "statement expr not in code context");
3110 if (!
Stmt.isInvalid()) {
3117 }
else if (ExprType >= CompoundLiteral && BridgeCast) {
3123 if (tokenKind == tok::kw___bridge)
3125 else if (tokenKind == tok::kw___bridge_transfer)
3127 else if (tokenKind == tok::kw___bridge_retained)
3132 assert(tokenKind == tok::kw___bridge_retain);
3135 Diag(BridgeKeywordLoc, diag::err_arc_bridge_retain)
3137 "__bridge_retained");
3142 ColonProtection.restore();
3143 RParenLoc =
T.getCloseLocation();
3146 ExprResult SubExpr = ParseCastExpression(AnyCastExpr);
3152 BridgeKeywordLoc, Ty.
get(),
3153 RParenLoc, SubExpr.
get());
3154 }
else if (ExprType >= CompoundLiteral &&
3155 isTypeIdInParens(isAmbiguousTypeId)) {
3164 if (isAmbiguousTypeId && !stopIfCastExpr) {
3165 ExprResult res = ParseCXXAmbiguousParenExpression(ExprType, CastTy,
T,
3167 RParenLoc =
T.getCloseLocation();
3173 ParseSpecifierQualifierList(DS);
3176 ParseDeclarator(DeclaratorInfo);
3181 if (!DeclaratorInfo.isInvalidType() && Tok.
is(tok::identifier) &&
3195 ColonProtection.restore();
3196 RParenLoc =
T.getCloseLocation();
3197 if (Tok.
is(tok::l_brace)) {
3198 ExprType = CompoundLiteral;
3204 return ParseCompoundLiteralExpression(Ty.
get(), OpenLoc, RParenLoc);
3207 if (Tok.
is(tok::l_paren)) {
3228 Result = ParseCastExpression(AnyCastExpr,
3233 if (!
Result.isInvalid()) {
3235 DeclaratorInfo, CastTy,
3236 RParenLoc,
Result.get());
3240 if (!
Result.isInvalid()) {
3252 if (DeclaratorInfo.isInvalidType())
3257 if (stopIfCastExpr) {
3271 GetLookAheadToken(1).isNot(tok::period)) {
3280 Result = ParseCastExpression(AnyCastExpr,
3283 if (!
Result.isInvalid()) {
3285 DeclaratorInfo, CastTy,
3286 RParenLoc,
Result.get());
3291 Diag(Tok, diag::err_expected_lbrace_in_compound_literal);
3294 }
else if (ExprType >= FoldExpr && Tok.
is(tok::ellipsis) &&
3296 ExprType = FoldExpr;
3298 }
else if (isTypeCast) {
3301 ExprVector ArgExprs;
3303 if (!ParseSimpleExpressionList(ArgExprs)) {
3306 if (ExprType >= FoldExpr && ArgExprs.size() == 1 &&
3308 ExprType = FoldExpr;
3309 return ParseFoldExpression(ArgExprs[0],
T);
3312 ExprType = SimpleExpr;
3316 }
else if (
getLangOpts().OpenMP >= 50 && OpenMPDirectiveParsing &&
3317 ExprType ==
CastExpr && Tok.
is(tok::l_square) &&
3318 tryParseOpenMPArrayShapingCastPart()) {
3319 bool ErrorFound =
false;
3329 while (!
SkipUntil(tok::r_square, tok::r_paren,
3334 OMPDimensions.push_back(NumElements.
get());
3335 OMPBracketsRanges.push_back(TS.getRange());
3336 }
while (Tok.
isNot(tok::r_paren));
3339 RParenLoc =
T.getCloseLocation();
3343 }
else if (!
Result.isInvalid()) {
3345 Result.get(), OpenLoc, RParenLoc, OMPDimensions, OMPBracketsRanges);
3358 if (ExprType >= FoldExpr && isFoldOperator(Tok.
getKind()) &&
3360 ExprType = FoldExpr;
3361 return ParseFoldExpression(
Result,
T);
3363 ExprType = SimpleExpr;
3366 if (!
Result.isInvalid() && Tok.
is(tok::r_paren))
3372 if (
Result.isInvalid()) {
3378 RParenLoc =
T.getCloseLocation();
3391Parser::ParseCompoundLiteralExpression(
ParsedType Ty,
3394 assert(Tok.
is(tok::l_brace) &&
"Not a compound literal!");
3396 Diag(LParenLoc, diag::ext_c99_compound_literal);
3399 if (!
Result.isInvalid() && Ty)
3425 "Not a string-literal-like token!");
3433 StringToks.push_back(Tok);
3438 assert(!AllowUserDefinedLiteral &&
"UDL are always evaluated");
3467ExprResult Parser::ParseGenericSelectionExpression() {
3468 assert(Tok.
is(tok::kw__Generic) &&
"_Generic keyword expected");
3470 diagnoseUseOfC11Keyword(Tok);
3474 if (
T.expectAndConsume())
3481 if (isTypeIdForGenericSelection()) {
3487 const auto *LIT = cast<LocInfoType>(ControllingType.
get().get());
3490 : diag::ext_c2y_generic_with_type_arg);
3504 if (ExpectAndConsume(tok::comma)) {
3514 if (Tok.
is(tok::kw_default)) {
3518 Diag(Tok, diag::err_duplicate_default_assoc);
3519 Diag(DefaultLoc, diag::note_previous_default_assoc);
3534 Types.push_back(Ty);
3536 if (ExpectAndConsume(tok::colon)) {
3545 if (ER.isInvalid()) {
3549 Exprs.push_back(ER.get());
3553 if (
T.getCloseLocation().isInvalid())
3556 void *ExprOrTy = ControllingExpr.
isUsable()
3557 ? ControllingExpr.
get()
3558 : ControllingType.
get().getAsOpaquePtr();
3561 KeyLoc, DefaultLoc,
T.getCloseLocation(), ControllingExpr.
isUsable(),
3562 ExprOrTy, Types, Exprs);
3584 assert(isFoldOperator(Kind) &&
"missing fold-operator");
3588 assert(Tok.
is(tok::ellipsis) &&
"not a fold-expression");
3592 if (Tok.
isNot(tok::r_paren)) {
3593 if (!isFoldOperator(Tok.
getKind()))
3596 if (Kind != tok::unknown && Tok.
getKind() != Kind)
3610 ? diag::warn_cxx14_compat_fold_expression
3611 : diag::ext_fold_expression);
3615 Kind, EllipsisLoc, RHS.
get(),
3616 T.getCloseLocation());
3619void Parser::injectEmbedTokens() {
3623 Data->BinaryData.size() * 2 - 1),
3624 Data->BinaryData.size() * 2 - 1);
3626 for (
auto &Byte :
Data->BinaryData) {
3627 Toks[I].startToken();
3628 Toks[I].setKind(tok::binary_data);
3630 Toks[I].setLength(1);
3631 Toks[I].setLiteralData(&Byte);
3632 if (I != ((
Data->BinaryData.size() - 1) * 2)) {
3633 Toks[I + 1].startToken();
3634 Toks[I + 1].setKind(tok::comma);
3639 PP.EnterTokenStream(std::move(Toks),
true,
3667 llvm::function_ref<
void()> ExpressionStarts,
3668 bool FailImmediatelyOnInvalidExpr,
3669 bool EarlyTypoCorrection) {
3670 bool SawError =
false;
3672 if (ExpressionStarts)
3677 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
3678 Expr = ParseBraceInitializer();
3682 if (EarlyTypoCorrection)
3685 if (Tok.
is(tok::ellipsis))
3687 else if (Tok.
is(tok::code_completion)) {
3697 if (
Expr.isInvalid()) {
3699 if (FailImmediatelyOnInvalidExpr)
3703 Exprs.push_back(
Expr.get());
3706 if (Tok.
isNot(tok::comma))
3711 checkPotentialAngleBracketDelimiter(Comma);
3716 for (
auto &
E : Exprs) {
3735 if (
Expr.isInvalid())
3738 Exprs.push_back(
Expr.get());
3748 checkPotentialAngleBracketDelimiter(Comma);
3759 if (Tok.
is(tok::code_completion)) {
3768 ParseSpecifierQualifierList(DS);
3774 ParseDeclarator(DeclaratorInfo);
3776 MaybeParseGNUAttributes(DeclaratorInfo);
3792ExprResult Parser::ParseBlockLiteralExpression() {
3793 assert(Tok.
is(tok::caret) &&
"block literal starts with ^");
3797 "block literal parsing");
3820 if (Tok.
is(tok::l_paren)) {
3821 ParseParenDeclarator(ParamInfo);
3826 ParamInfo.SetIdentifier(
nullptr, CaretLoc);
3827 ParamInfo.SetRangeEnd(Tmp);
3828 if (ParamInfo.isInvalidType()) {
3836 MaybeParseGNUAttributes(ParamInfo);
3840 }
else if (!Tok.
is(tok::l_brace)) {
3841 ParseBlockId(CaretLoc);
3845 ParamInfo.AddTypeInfo(
3863 CaretLoc, CaretLoc, ParamInfo),
3866 MaybeParseGNUAttributes(ParamInfo);
3874 if (!Tok.
is(tok::l_brace)) {
3876 Diag(Tok, diag::err_expected_expression);
3883 if (!
Stmt.isInvalid())
3903 llvm::SmallSet<StringRef, 4> Platforms;
3904 bool HasOtherPlatformSpec =
false;
3906 for (
const auto &Spec : AvailSpecs) {
3907 if (Spec.isOtherPlatformSpec()) {
3908 if (HasOtherPlatformSpec) {
3909 P.Diag(Spec.getBeginLoc(), diag::err_availability_query_repeated_star);
3913 HasOtherPlatformSpec =
true;
3917 bool Inserted = Platforms.insert(Spec.getPlatform()).second;
3922 StringRef Platform = Spec.getPlatform();
3923 P.Diag(Spec.getBeginLoc(), diag::err_availability_query_repeated_platform)
3924 << Spec.getEndLoc() << Platform;
3929 if (!HasOtherPlatformSpec) {
3930 SourceLocation InsertWildcardLoc = AvailSpecs.back().getEndLoc();
3931 P.Diag(InsertWildcardLoc, diag::err_availability_query_wildcard_required)
3944std::optional<AvailabilitySpec> Parser::ParseAvailabilitySpec() {
3945 if (Tok.
is(tok::star)) {
3949 if (Tok.
is(tok::code_completion)) {
3952 return std::nullopt;
3954 if (Tok.
isNot(tok::identifier)) {
3955 Diag(Tok, diag::err_avail_query_expected_platform_name);
3956 return std::nullopt;
3961 VersionTuple Version = ParseVersionTuple(VersionRange);
3963 if (Version.empty())
3964 return std::nullopt;
3966 StringRef GivenPlatform = PlatformIdentifier->
Ident->
getName();
3967 StringRef Platform =
3968 AvailabilityAttr::canonicalizePlatformName(GivenPlatform);
3970 if (AvailabilityAttr::getPrettyPlatformName(Platform).empty() ||
3971 (GivenPlatform.contains(
"xros") || GivenPlatform.contains(
"xrOS"))) {
3973 diag::err_avail_query_unrecognized_platform_name)
3975 return std::nullopt;
3984 assert(Tok.
is(tok::kw___builtin_available) ||
3991 if (
Parens.expectAndConsume())
3995 bool HasError =
false;
3997 std::optional<AvailabilitySpec> Spec = ParseAvailabilitySpec();
4001 AvailSpecs.push_back(*Spec);
4014 if (
Parens.consumeClose())
4018 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.