28#include "llvm/Support/Compiler.h"
29#include "llvm/Support/ErrorHandling.h"
37 case tok::unknown:
return 0;
39 case tok::kw_addrspace_cast:
return 1;
40 case tok::kw_const_cast:
return 2;
41 case tok::kw_dynamic_cast:
return 3;
42 case tok::kw_reinterpret_cast:
return 4;
43 case tok::kw_static_cast:
return 5;
45 llvm_unreachable(
"Unknown type for digraph error message.");
50bool Parser::areTokensAdjacent(
const Token &
First,
const Token &Second) {
68 P.Diag(DigraphToken.
getLocation(), diag::err_missing_whitespace_digraph)
73 ColonToken.
setKind(tok::coloncolon);
76 DigraphToken.
setKind(tok::less);
87void Parser::CheckForTemplateAndDigraph(
Token &Next,
ParsedType ObjectType,
90 if (!Next.is(tok::l_square) || Next.getLength() != 2)
93 Token SecondToken = GetLookAheadToken(2);
94 if (!SecondToken.
is(tok::colon) || !areTokensAdjacent(Next, SecondToken))
100 bool MemberOfUnknownSpecialization;
103 Template, MemberOfUnknownSpecialization))
106 FixDigraph(*
this, PP, Next, SecondToken, tok::unknown,
159bool Parser::ParseOptionalCXXScopeSpecifier(
161 bool EnteringContext,
bool *MayBePseudoDestructor,
bool IsTypename,
162 const IdentifierInfo **LastII,
bool OnlyNamespace,
bool InUsingDeclaration,
163 bool Disambiguation) {
165 "Call sites of this function should be guarded by checking for C++");
167 if (Tok.
is(tok::annot_cxxscope)) {
168 assert(!LastII &&
"want last identifier but have already annotated scope");
169 assert(!MayBePseudoDestructor &&
"unexpected annot_cxxscope");
173 ConsumeAnnotationToken();
178 bool CheckForDestructor =
false;
179 if (MayBePseudoDestructor && *MayBePseudoDestructor) {
180 CheckForDestructor =
true;
181 *MayBePseudoDestructor =
false;
187 bool HasScopeSpecifier =
false;
189 if (Tok.
is(tok::coloncolon)) {
192 if (NextKind == tok::kw_new || NextKind == tok::kw_delete)
195 if (NextKind == tok::l_brace) {
204 HasScopeSpecifier =
true;
208 if (Tok.
is(tok::kw___super)) {
210 if (!Tok.
is(tok::coloncolon)) {
218 if (!HasScopeSpecifier &&
219 Tok.
isOneOf(tok::kw_decltype, tok::annot_decltype)) {
229 AnnotateExistingDecltypeSpecifier(DS, DeclLoc, EndLoc);
236 HasScopeSpecifier =
true;
239 else if (!HasScopeSpecifier && Tok.
is(tok::identifier) &&
240 GetLookAheadToken(1).is(tok::ellipsis) &&
241 GetLookAheadToken(2).is(tok::l_square) &&
242 !GetLookAheadToken(3).is(tok::r_square)) {
251 DS.getRepAsType().get(), DS.getPackIndexingExpr(), DS.getBeginLoc(),
252 DS.getEllipsisLoc());
268 Diag(Start, diag::warn_pre_cxx26_ambiguous_pack_indexing_type) <<
Type;
278 HasScopeSpecifier =
true;
282 auto SavedType = PreferredType;
284 if (HasScopeSpecifier) {
285 if (Tok.
is(tok::code_completion)) {
290 getCurScope(), SS, EnteringContext, InUsingDeclaration,
310 ObjectType =
nullptr;
318 if (Tok.
is(tok::kw_template)) {
322 if (!HasScopeSpecifier && !ObjectType)
325 TentativeParsingAction TPA(*
this);
329 if (Tok.
is(tok::identifier)) {
333 }
else if (Tok.
is(tok::kw_operator)) {
338 if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType,
347 diag::err_id_after_template_in_nested_name_spec)
360 if (Tok.
isNot(tok::less)) {
370 EnteringContext, Template,
true);
371 if (AnnotateTemplateIdToken(Template, TNK, SS, TemplateKWLoc,
378 if (Tok.
is(tok::annot_template_id) &&
NextToken().is(tok::coloncolon)) {
387 if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde)) {
388 *MayBePseudoDestructor =
true;
393 *LastII = TemplateId->
Name;
396 ConsumeAnnotationToken();
398 assert(Tok.
is(tok::coloncolon) &&
"NextToken() not working properly!");
401 HasScopeSpecifier =
true;
427#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
428#include "clang/Basic/TransformTypeTraits.def"
431 Diag(Tok, diag::ext_keyword_as_ident)
442 if (Tok.
isNot(tok::identifier))
457 if (Next.is(tok::colon) && !ColonIsSacred) {
464 Diag(Next, diag::err_unexpected_colon_in_nested_name_spec)
467 Next.setKind(tok::coloncolon);
471 if (Next.is(tok::coloncolon) && GetLookAheadToken(2).is(tok::l_brace)) {
482 if (Next.is(tok::coloncolon)) {
483 if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde)) {
484 *MayBePseudoDestructor =
true;
489 const Token &Next2 = GetLookAheadToken(2);
490 if (Next2.
is(tok::kw_private) || Next2.
is(tok::kw_protected) ||
491 Next2.
is(tok::kw_public) || Next2.
is(tok::kw_virtual)) {
492 Diag(Next2, diag::err_unexpected_token_in_nested_name_spec)
497 ColonColon.
setKind(tok::colon);
510 assert(Tok.
isOneOf(tok::coloncolon, tok::colon) &&
511 "NextToken() not working properly!");
512 Token ColonColon = Tok;
515 bool IsCorrectedToColon =
false;
516 bool *CorrectionFlagPtr = ColonIsSacred ? &IsCorrectedToColon :
nullptr;
518 getCurScope(), IdInfo, EnteringContext, SS, CorrectionFlagPtr,
522 if (CorrectionFlagPtr && IsCorrectedToColon) {
523 ColonColon.
setKind(tok::colon);
531 HasScopeSpecifier =
true;
535 CheckForTemplateAndDigraph(Next, ObjectType, EnteringContext, II, SS);
539 if (Next.is(tok::less)) {
544 bool MemberOfUnknownSpecialization;
548 EnteringContext, Template, MemberOfUnknownSpecialization,
555 isTemplateArgumentList(1) == TPResult::False)
572 if (MemberOfUnknownSpecialization && !Disambiguation &&
573 (ObjectType || SS.
isSet()) &&
574 (IsTypename || isTemplateArgumentList(1) == TPResult::True)) {
577 if (!ObjectHadErrors) {
582 unsigned DiagID = diag::err_missing_dependent_template_keyword;
584 DiagID = diag::warn_missing_dependent_template_keyword;
595 EnteringContext, Template,
true);
612 if (CheckForDestructor && !HasScopeSpecifier && Tok.
is(tok::tilde))
613 *MayBePseudoDestructor =
true;
619 bool isAddressOfOperand,
620 Token &Replacement) {
625 case tok::annot_non_type: {
626 NamedDecl *ND = getNonTypeAnnotation(Tok);
632 case tok::annot_non_type_dependent: {
638 if (isAddressOfOperand && isPostfixExpressionSuffixStart())
639 isAddressOfOperand =
false;
646 case tok::annot_non_type_undeclared: {
648 "undeclared non-type annotation should be unqualified");
663 false, &TemplateKWLoc, Name))
668 if (isAddressOfOperand && isPostfixExpressionSuffixStart())
669 isAddressOfOperand =
false;
672 getCurScope(), SS, TemplateKWLoc, Name, Tok.
is(tok::l_paren),
673 isAddressOfOperand,
nullptr,
false,
679 E = tryParseCXXPackIndexingExpression(
E);
681 if (!
E.isInvalid() && !
E.isUnset() && Tok.
is(tok::less))
682 checkPotentialAngleBracket(
E);
687 assert(Tok.
is(tok::ellipsis) &&
NextToken().is(tok::l_square) &&
693 if (
T.consumeClose() || IndexExpr.
isInvalid())
696 EllipsisLoc,
T.getOpenLocation(),
697 IndexExpr.
get(),
T.getCloseLocation());
701Parser::tryParseCXXPackIndexingExpression(
ExprResult PackIdExpression) {
704 Tok.
is(tok::ellipsis) &&
NextToken().is(tok::l_square)) {
705 E = ParseCXXPackIndexingExpression(
E);
752ExprResult Parser::ParseCXXIdExpression(
bool isAddressOfOperand) {
758 ParseOptionalCXXScopeSpecifier(SS,
nullptr,
764 tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement);
768 UnconsumeToken(Replacement);
769 Result = tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement);
771 assert(!
Result.isUnset() &&
"Typo correction suggested a keyword replacement "
772 "for a previous keyword suggestion");
824 if (ParseLambdaIntroducer(Intro)) {
831 return ParseLambdaExpressionAfterIntroducer(Intro);
838ExprResult Parser::TryParseLambdaExpression() {
840 "Not at the start of a possible lambda expression.");
843 if (Next.is(tok::eof))
848 if (Next.is(tok::r_square) ||
849 Next.is(tok::equal) ||
850 (Next.is(tok::amp) &&
851 After.isOneOf(tok::r_square, tok::comma)) ||
852 (Next.is(tok::identifier) &&
853 After.is(tok::r_square)) ||
854 Next.is(tok::ellipsis)) {
855 return ParseLambdaExpression();
860 if (Next.is(tok::identifier) &&
After.is(tok::identifier))
870 TentativeParsingAction TPA(*
this);
871 LambdaIntroducerTentativeParse Tentative;
872 if (ParseLambdaIntroducer(Intro, &Tentative)) {
878 case LambdaIntroducerTentativeParse::Success:
882 case LambdaIntroducerTentativeParse::Incomplete:
887 if (ParseLambdaIntroducer(Intro))
891 case LambdaIntroducerTentativeParse::MessageSend:
892 case LambdaIntroducerTentativeParse::Invalid:
899 return ParseLambdaExpressionAfterIntroducer(Intro);
912 LambdaIntroducerTentativeParse *Tentative) {
914 *Tentative = LambdaIntroducerTentativeParse::Success;
916 assert(Tok.
is(tok::l_square) &&
"Lambda expressions begin with '['.");
926 auto Invalid = [&](llvm::function_ref<void()> Action) {
928 *Tentative = LambdaIntroducerTentativeParse::Invalid;
937 auto NonTentativeAction = [&](llvm::function_ref<void()> Action) {
939 *Tentative = LambdaIntroducerTentativeParse::Incomplete;
945 if (Tok.
is(tok::amp) &&
955 }
else if (Tok.
is(tok::equal)) {
962 while (Tok.
isNot(tok::r_square)) {
964 if (Tok.
isNot(tok::comma)) {
969 if (Tok.
is(tok::code_completion) &&
985 if (Tok.
is(tok::code_completion)) {
1009 if (Tok.
is(tok::star)) {
1011 if (Tok.
is(tok::kw_this)) {
1019 }
else if (Tok.
is(tok::kw_this)) {
1022 }
else if (Tok.
isOneOf(tok::amp, tok::equal) &&
1034 if (Tok.
is(tok::amp)) {
1038 if (Tok.
is(tok::code_completion)) {
1049 if (Tok.
is(tok::identifier)) {
1052 }
else if (Tok.
is(tok::kw_this)) {
1065 if (Tok.
is(tok::l_paren)) {
1074 *Tentative = LambdaIntroducerTentativeParse::Incomplete;
1075 }
else if (ParseExpressionList(Exprs)) {
1081 Parens.getCloseLocation(),
1084 }
else if (Tok.
isOneOf(tok::l_brace, tok::equal)) {
1097 Init = ParseInitializer();
1098 }
else if (Tok.
is(tok::l_brace)) {
1102 *Tentative = LambdaIntroducerTentativeParse::Incomplete;
1126 Init = ParseInitializer();
1127 if (!
Init.isInvalid())
1136 Tok.
setKind(tok::annot_primary_expr);
1137 setExprAnnotation(Tok,
Init);
1142 ConsumeAnnotationToken();
1151 if (Tentative && Tok.
is(tok::identifier) &&
1154 *Tentative = LambdaIntroducerTentativeParse::MessageSend;
1160 if (llvm::any_of(EllipsisLocs,
1166 !InitCapture ? &EllipsisLocs[2] :
1169 EllipsisLoc = *ExpectedEllipsisLoc;
1171 unsigned DiagID = 0;
1173 DiagID = diag::err_lambda_capture_misplaced_ellipsis;
1179 unsigned NumEllipses = std::accumulate(
1180 std::begin(EllipsisLocs), std::end(EllipsisLocs), 0,
1182 if (NumEllipses > 1)
1183 DiagID = diag::err_lambda_capture_multiple_ellipses;
1186 NonTentativeAction([&] {
1195 assert(DiagLoc.
isValid() &&
"no location for diagnostic");
1199 auto &&
D =
Diag(DiagLoc, DiagID);
1200 if (DiagID == diag::err_lambda_capture_misplaced_ellipsis) {
1220 if (
Init.isUsable())
1222 if (
Init.isUsable()) {
1223 NonTentativeAction([&] {
1260 auto ConsumeLocation = [&
P, &DeclEndLoc](
SourceLocation &SpecifierLoc,
1262 if (SpecifierLoc.isValid()) {
1263 P.Diag(
P.getCurToken().getLocation(),
1264 diag::err_lambda_decl_specifier_repeated)
1268 SpecifierLoc =
P.ConsumeToken();
1269 DeclEndLoc = SpecifierLoc;
1273 switch (
P.getCurToken().getKind()) {
1274 case tok::kw_mutable:
1275 ConsumeLocation(MutableLoc, 0);
1277 case tok::kw_static:
1278 ConsumeLocation(StaticLoc, 1);
1280 case tok::kw_constexpr:
1281 ConsumeLocation(ConstexprLoc, 2);
1283 case tok::kw_consteval:
1284 ConsumeLocation(ConstevalLoc, 3);
1295 P.Diag(StaticLoc, !
P.getLangOpts().CPlusPlus23
1296 ? diag::err_static_lambda
1297 : diag::warn_cxx20_compat_static_lambda);
1298 const char *PrevSpec =
nullptr;
1299 unsigned DiagID = 0;
1302 P.getActions().getASTContext().getPrintingPolicy());
1303 assert(PrevSpec ==
nullptr && DiagID == 0 &&
1304 "Static cannot have been set previously!");
1312 P.Diag(ConstexprLoc, !
P.getLangOpts().CPlusPlus17
1313 ? diag::ext_constexpr_on_lambda_cxx17
1314 : diag::warn_cxx14_compat_constexpr_on_lambda);
1315 const char *PrevSpec =
nullptr;
1316 unsigned DiagID = 0;
1319 assert(PrevSpec ==
nullptr && DiagID == 0 &&
1320 "Constexpr cannot have been set previously!");
1328 P.Diag(ConstevalLoc, diag::warn_cxx20_compat_consteval);
1329 const char *PrevSpec =
nullptr;
1330 unsigned DiagID = 0;
1334 P.Diag(ConstevalLoc, DiagID) << PrevSpec;
1350 P.Diag(StaticLoc, diag::err_static_mutable_lambda);
1352 P.Diag(StaticLoc, diag::err_static_lambda_captures);
1358ExprResult Parser::ParseLambdaExpressionAfterIntroducer(
1362 Diag(LambdaBeginLoc, diag::ext_hlsl_lambda) << 1;
1365 ? diag::warn_cxx98_compat_lambda
1370 "lambda expression parsing");
1375 TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
1392 if (Tok.
is(tok::kw___noinline__)) {
1395 Attributes.addNew(AttrName, AttrNameLoc,
nullptr,
1396 AttrNameLoc,
nullptr,
1397 0, tok::kw___noinline__);
1398 }
else if (Tok.
is(tok::kw___attribute))
1399 ParseGNUAttributes(Attributes,
nullptr, &
D);
1404 D.takeAttributes(Attributes);
1407 MultiParseScope TemplateParamScope(*
this);
1408 if (Tok.
is(tok::less)) {
1410 ? diag::warn_cxx17_compat_lambda_template_parameter_list
1411 : diag::ext_lambda_template_parameter_list);
1415 if (ParseTemplateParameters(TemplateParamScope,
1416 CurTemplateDepthTracker.getDepth(),
1417 TemplateParams, LAngleLoc, RAngleLoc)) {
1422 if (TemplateParams.empty()) {
1424 diag::err_lambda_template_parameter_list_empty);
1435 ++CurTemplateDepthTracker;
1446 Intro, LAngleLoc, TemplateParams, RAngleLoc, RequiresClause);
1454 if (isCXX11AttributeSpecifier()) {
1456 ? diag::warn_cxx20_compat_decl_attrs_on_lambda
1457 : diag::ext_decl_attrs_on_lambda)
1459 MaybeParseCXX11Attributes(
D);
1466 bool HasParentheses =
false;
1467 bool HasSpecifiers =
false;
1478 if (Tok.
is(tok::l_paren)) {
1481 LParenLoc =
T.getOpenLocation();
1483 if (Tok.
isNot(tok::r_paren)) {
1485 CurTemplateDepthTracker.getOriginalDepth());
1487 ParseParameterDeclarationClause(
D, Attributes, ParamInfo, EllipsisLoc);
1494 CurTemplateDepthTracker.setAddedDepth(1);
1498 DeclEndLoc = RParenLoc =
T.getCloseLocation();
1499 HasParentheses =
true;
1503 Tok.
isOneOf(tok::kw_mutable, tok::arrow, tok::kw___attribute,
1504 tok::kw_constexpr, tok::kw_consteval, tok::kw_static,
1505 tok::kw___private, tok::kw___global, tok::kw___local,
1506 tok::kw___constant, tok::kw___generic, tok::kw_groupshared,
1507 tok::kw_requires, tok::kw_noexcept) ||
1511 if (HasSpecifiers && !HasParentheses && !
getLangOpts().CPlusPlus23) {
1515 Diag(Tok, diag::ext_lambda_missing_parens)
1519 if (HasParentheses || HasSpecifiers) {
1523 MaybeParseAttributes(PAKM_GNU | PAKM_Declspec, Attributes);
1531 ConstevalLoc, DeclEndLoc);
1542 if (!HasParentheses)
1545 if (HasSpecifiers || HasParentheses) {
1554 ESpecType = tryParseExceptionSpecification(
1555 false, ESpecRange, DynamicExceptions,
1556 DynamicExceptionRanges, NoexceptExpr, ExceptionSpecTokens);
1559 DeclEndLoc = ESpecRange.
getEnd();
1562 if (MaybeParseCXX11Attributes(Attributes))
1563 DeclEndLoc = Attributes.Range.getEnd();
1566 if (Tok.
isOneOf(tok::kw___private, tok::kw___global, tok::kw___local,
1567 tok::kw___constant, tok::kw___generic)) {
1568 ParseOpenCLQualifiers(DS.getAttributes());
1575 if (Tok.
is(tok::arrow)) {
1578 TrailingReturnType =
1579 ParseTrailingReturnType(
Range,
false);
1588 false, LParenLoc, ParamInfo.data(),
1589 ParamInfo.size(), EllipsisLoc, RParenLoc,
1591 NoLoc, MutableLoc, ESpecType,
1592 ESpecRange, DynamicExceptions.data(),
1593 DynamicExceptionRanges.data(), DynamicExceptions.size(),
1594 NoexceptExpr.
isUsable() ? NoexceptExpr.
get() :
nullptr,
1596 {}, LParenLoc, FunLocalRangeEnd,
D,
1597 TrailingReturnType, TrailingReturnTypeLoc, &DS),
1598 std::move(Attributes), DeclEndLoc);
1605 if (HasParentheses && Tok.
is(tok::kw_requires))
1606 ParseTrailingRequiresClause(
D);
1613 if (A.getKind() == ParsedAttr::AT_CUDADevice ||
1614 A.getKind() == ParsedAttr::AT_CUDAHost ||
1615 A.getKind() == ParsedAttr::AT_CUDAGlobal)
1616 Diag(A.getLoc(), diag::warn_cuda_attr_lambda_position)
1617 << A.getAttrName()->getName();
1626 ParseScope BodyScope(
this, ScopeFlags);
1631 if (!Tok.
is(tok::l_brace)) {
1632 Diag(Tok, diag::err_expected_lambda_body);
1639 TemplateParamScope.Exit();
1663 const char *CastName =
nullptr;
1666 default: llvm_unreachable(
"Unknown C++ cast!");
1667 case tok::kw_addrspace_cast: CastName =
"addrspace_cast";
break;
1668 case tok::kw_const_cast: CastName =
"const_cast";
break;
1669 case tok::kw_dynamic_cast: CastName =
"dynamic_cast";
break;
1670 case tok::kw_reinterpret_cast: CastName =
"reinterpret_cast";
break;
1671 case tok::kw_static_cast: CastName =
"static_cast";
break;
1679 if (Tok.
is(tok::l_square) && Tok.
getLength() == 2) {
1681 if (Next.is(tok::colon) && areTokensAdjacent(Tok, Next))
1682 FixDigraph(*
this, PP, Tok, Next, Kind,
true);
1685 if (ExpectAndConsume(tok::less, diag::err_expected_less_after, CastName))
1690 ParseSpecifierQualifierList(DS,
AS_none,
1691 DeclSpecContext::DSC_type_specifier);
1696 ParseDeclarator(DeclaratorInfo);
1700 if (ExpectAndConsume(tok::greater))
1701 return ExprError(
Diag(LAngleBracketLoc, diag::note_matching) << tok::less);
1705 if (
T.expectAndConsume(diag::err_expected_lparen_after, CastName))
1713 if (!
Result.isInvalid() && !DeclaratorInfo.isInvalidType())
1715 LAngleBracketLoc, DeclaratorInfo,
1717 T.getOpenLocation(),
Result.get(),
1718 T.getCloseLocation());
1730 assert(Tok.
is(tok::kw_typeid) &&
"Not 'typeid'!");
1737 if (
T.expectAndConsume(diag::err_expected_lparen_after,
"typeid"))
1739 LParenLoc =
T.getOpenLocation();
1760 if (isTypeIdInParens()) {
1765 RParenLoc =
T.getCloseLocation();
1770 Ty.
get().getAsOpaquePtr(), RParenLoc);
1779 RParenLoc =
T.getCloseLocation();
1784 Result.get(), RParenLoc);
1797 assert(Tok.
is(tok::kw___uuidof) &&
"Not '__uuidof'!");
1803 if (
T.expectAndConsume(diag::err_expected_lparen_after,
"__uuidof"))
1808 if (isTypeIdInParens()) {
1818 Ty.
get().getAsOpaquePtr(),
1819 T.getCloseLocation());
1833 Result.get(),
T.getCloseLocation());
1880 if (Tok.
is(tok::identifier)) {
1883 assert(Tok.
is(tok::coloncolon) &&
"ParseOptionalCXXScopeSpecifier fail");
1885 }
else if (Tok.
is(tok::annot_template_id)) {
1891 ConsumeAnnotationToken();
1892 assert(Tok.
is(tok::coloncolon) &&
"ParseOptionalCXXScopeSpecifier fail");
1895 assert(SS.
isEmpty() &&
"missing last component of nested name specifier");
1900 assert(Tok.
is(tok::tilde) &&
"ParseOptionalCXXScopeSpecifier fail");
1903 if (Tok.
is(tok::kw_decltype) && !FirstTypeName.
isValid()) {
1905 ParseDecltypeSpecifier(DS);
1912 if (!Tok.
is(tok::identifier)) {
1913 Diag(Tok, diag::err_destructor_tilde_identifier);
1918 if (GetLookAheadToken(1).is(tok::ellipsis) &&
1919 GetLookAheadToken(2).is(tok::l_square)) {
1921 ParsePackIndexingType(DS);
1940 if (Tok.
is(tok::less) &&
1941 ParseUnqualifiedIdTemplateId(
1943 Name, NameLoc,
false, SecondTypeName,
1948 SS, FirstTypeName, CCLoc, TildeLoc,
1967 assert(Tok.
is(tok::kw_throw) &&
"Not throw!");
1994 assert(Tok.
is(tok::kw_co_yield) &&
"Not co_yield!");
1999 if (!
Expr.isInvalid())
2010 assert(Tok.
is(tok::kw_this) &&
"Not 'this'!");
2029Parser::ParseCXXTypeConstructExpression(
const DeclSpec &DS) {
2034 assert((Tok.
is(tok::l_paren) ||
2036 &&
"Expected '(' or '{'!");
2038 if (Tok.
is(tok::l_brace)) {
2041 if (
Init.isInvalid())
2055 auto RunSignatureHelp = [&]() {
2061 Exprs,
T.getOpenLocation(),
false);
2062 CalledSignatureHelp =
true;
2063 return PreferredType;
2066 if (Tok.
isNot(tok::r_paren)) {
2067 if (ParseExpressionList(Exprs, [&] {
2068 PreferredType.enterFunctionArgument(Tok.
getLocation(),
2086 Exprs,
T.getCloseLocation(),
2094 assert(Tok.
is(tok::kw_using) &&
"Expected using");
2097 "Unexpected Declarator Context");
2101 DG = ParseUsingDeclaration(Context, {}, DeclStart, DeclEnd, Attrs,
AS_none);
2106 ? diag::ext_alias_in_init_statement
2107 : diag::warn_cxx20_alias_in_init_statement)
2147 ForRangeInfo *FRI,
bool EnterForConditionScope) {
2149 struct ForConditionScopeRAII {
2151 void enter(
bool IsConditionVariable) {
2154 S->setIsConditionVarScope(IsConditionVariable);
2157 ~ForConditionScopeRAII() {
2159 S->setIsConditionVarScope(
false);
2161 } ForConditionScope{EnterForConditionScope ?
getCurScope() : nullptr};
2164 PreferredType.enterCondition(Actions, Tok.
getLocation());
2166 if (Tok.
is(tok::code_completion)) {
2174 MaybeParseCXX11Attributes(attrs);
2176 const auto WarnOnInit = [
this, &CK] {
2178 ? diag::warn_cxx14_compat_init_statement
2179 : diag::ext_init_statement)
2184 switch (isCXXConditionDeclarationOrInitStatement(InitStmt, FRI)) {
2185 case ConditionOrInitStatement::Expression: {
2187 ForConditionScope.enter(
false);
2189 ProhibitAttributes(attrs);
2193 if (InitStmt && Tok.
is(tok::semi)) {
2197 Diag(SemiLoc, diag::warn_empty_init_statement)
2203 return ParseCXXCondition(
nullptr,
Loc, CK, MissingOK);
2208 if (
Expr.isInvalid())
2211 if (InitStmt && Tok.
is(tok::semi)) {
2215 return ParseCXXCondition(
nullptr,
Loc, CK, MissingOK);
2222 case ConditionOrInitStatement::InitStmtDecl: {
2226 if (Tok.
is(tok::kw_using))
2227 DG = ParseAliasDeclarationInInitStatement(
2232 attrs, DeclSpecAttrs,
true);
2235 return ParseCXXCondition(
nullptr,
Loc, CK, MissingOK);
2238 case ConditionOrInitStatement::ForRangeDecl: {
2242 assert(FRI &&
"should not parse a for range declaration here");
2251 case ConditionOrInitStatement::ConditionDecl:
2252 case ConditionOrInitStatement::Error:
2257 ForConditionScope.enter(
true);
2261 ParseSpecifierQualifierList(DS,
AS_none, DeclSpecContext::DSC_condition);
2265 ParseDeclarator(DeclaratorInfo);
2268 if (Tok.
is(tok::kw_asm)) {
2271 if (AsmLabel.isInvalid()) {
2275 DeclaratorInfo.setAsmLabel(AsmLabel.get());
2276 DeclaratorInfo.SetRangeEnd(
Loc);
2280 MaybeParseGNUAttributes(DeclaratorInfo);
2291 bool CopyInitialization = isTokenEqualOrEqualTypo();
2292 if (CopyInitialization)
2298 diag::warn_cxx98_compat_generalized_initializer_lists);
2299 InitExpr = ParseBraceInitializer();
2300 }
else if (CopyInitialization) {
2301 PreferredType.enterVariableInit(Tok.
getLocation(), DeclOut);
2303 }
else if (Tok.
is(tok::l_paren)) {
2307 RParen = ConsumeParen();
2309 diag::err_expected_init_in_condition_lparen)
2350void Parser::ParseCXXSimpleTypeSpecifier(
DeclSpec &DS) {
2352 const char *PrevSpec;
2359 case tok::identifier:
2360 case tok::coloncolon:
2361 llvm_unreachable(
"Annotation token should already be formed!");
2363 llvm_unreachable(
"Not a simple-type-specifier token!");
2366 case tok::annot_typename: {
2370 ConsumeAnnotationToken();
2371 DS.
Finish(Actions, Policy);
2375 case tok::kw__ExtInt:
2376 case tok::kw__BitInt: {
2377 DiagnoseBitIntUse(Tok);
2386 DS.
Finish(Actions, Policy);
2399 case tok::kw___int64:
2403 case tok::kw_signed:
2406 case tok::kw_unsigned:
2421 case tok::kw___int128:
2424 case tok::kw___bf16:
2433 case tok::kw_double:
2436 case tok::kw__Float16:
2439 case tok::kw___float128:
2442 case tok::kw___ibm128:
2445 case tok::kw_wchar_t:
2448 case tok::kw_char8_t:
2451 case tok::kw_char16_t:
2454 case tok::kw_char32_t:
2460 case tok::kw__Accum:
2463 case tok::kw__Fract:
2469#define GENERIC_IMAGE_TYPE(ImgType, Id) \
2470 case tok::kw_##ImgType##_t: \
2471 DS.SetTypeSpecType(DeclSpec::TST_##ImgType##_t, Loc, PrevSpec, DiagID, \
2474#include "clang/Basic/OpenCLImageTypes.def"
2475#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
2476 case tok::kw_##Name: \
2477 DS.SetTypeSpecType(DeclSpec::TST_##Name, Loc, PrevSpec, DiagID, Policy); \
2479#include "clang/Basic/HLSLIntangibleTypes.def"
2481 case tok::annot_decltype:
2482 case tok::kw_decltype:
2484 return DS.
Finish(Actions, Policy);
2486 case tok::annot_pack_indexing_type:
2488 return DS.
Finish(Actions, Policy);
2491 case tok::kw_typeof:
2492 ParseTypeofSpecifier(DS);
2493 DS.
Finish(Actions, Policy);
2498 DS.
Finish(Actions, Policy);
2513 ParseSpecifierQualifierList(DS,
AS_none,
2514 getDeclSpecContextFromDeclaratorContext(Context));
2554bool Parser::ParseUnqualifiedIdTemplateId(
2558 assert(Tok.
is(tok::less) &&
"Expected '<' to finish parsing a template-id");
2562 switch (
Id.getKind()) {
2566 if (AssumeTemplateId) {
2570 ObjectType, EnteringContext, Template,
2573 bool MemberOfUnknownSpecialization;
2576 ObjectType, EnteringContext, Template,
2577 MemberOfUnknownSpecialization);
2582 isTemplateArgumentList(0) == TPResult::False)
2586 ObjectType && isTemplateArgumentList(0) == TPResult::True) {
2589 if (!ObjectHadErrors) {
2596 Name = std::string(
Id.Identifier->getName());
2602 Name +=
Id.Identifier->getName();
2604 Diag(
Id.StartLocation, diag::err_missing_dependent_template_keyword)
2609 getCurScope(), SS, TemplateKWLoc,
Id, ObjectType, EnteringContext,
2619 bool MemberOfUnknownSpecialization;
2623 EnteringContext, Template,
2624 MemberOfUnknownSpecialization);
2632 bool MemberOfUnknownSpecialization;
2637 EnteringContext, Template,
true);
2641 EnteringContext, Template,
2642 MemberOfUnknownSpecialization);
2645 Diag(NameLoc, diag::err_destructor_template_id)
2659 TemplateArgList TemplateArgs;
2660 if (ParseTemplateIdAfterTemplateName(
true, LAngleLoc, TemplateArgs, RAngleLoc,
2681 :
Id.OperatorFunctionId.Operator;
2684 TemplateKWLoc,
Id.StartLocation, TemplateII, OpKind, Template, TNK,
2685 LAngleLoc, RAngleLoc, TemplateArgs,
false, TemplateIds);
2687 Id.setTemplateId(TemplateId);
2696 getCurScope(), SS, TemplateKWLoc, Template, Name, NameLoc, LAngleLoc,
2697 TemplateArgsPtr, RAngleLoc,
true);
2698 if (
Type.isInvalid())
2702 Id.setConstructorName(
Type.get(), NameLoc, RAngleLoc);
2704 Id.setDestructorName(
Id.StartLocation,
Type.get(), RAngleLoc);
2749bool Parser::ParseUnqualifiedIdOperator(
CXXScopeSpec &SS,
bool EnteringContext,
2752 assert(Tok.
is(tok::kw_operator) &&
"Expected 'operator' keyword");
2758 unsigned SymbolIdx = 0;
2763 case tok::kw_delete: {
2764 bool isNew = Tok.
getKind() == tok::kw_new;
2768 if (Tok.
is(tok::l_square) &&
2774 if (
T.getCloseLocation().isInvalid())
2777 SymbolLocations[SymbolIdx++] =
T.getOpenLocation();
2778 SymbolLocations[SymbolIdx++] =
T.getCloseLocation();
2779 Op = isNew? OO_Array_New : OO_Array_Delete;
2781 Op = isNew? OO_New : OO_Delete;
2786#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
2788 SymbolLocations[SymbolIdx++] = ConsumeToken(); \
2791#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
2792#include "clang/Basic/OperatorKinds.def"
2794 case tok::l_paren: {
2799 if (
T.getCloseLocation().isInvalid())
2802 SymbolLocations[SymbolIdx++] =
T.getOpenLocation();
2803 SymbolLocations[SymbolIdx++] =
T.getCloseLocation();
2808 case tok::l_square: {
2813 if (
T.getCloseLocation().isInvalid())
2816 SymbolLocations[SymbolIdx++] =
T.getOpenLocation();
2817 SymbolLocations[SymbolIdx++] =
T.getCloseLocation();
2822 case tok::code_completion: {
2836 Result.setOperatorFunctionId(KeywordLoc, Op, SymbolLocations);
2850 unsigned DiagId = 0;
2856 while (isTokenStringLiteral()) {
2857 if (!Tok.
is(tok::string_literal) && !DiagId) {
2862 DiagId = diag::err_literal_operator_string_prefix;
2864 Toks.push_back(Tok);
2865 TokLocs.push_back(ConsumeStringToken());
2874 bool IsUDSuffix = !
Literal.getUDSuffix().empty();
2883 }
else if (Tok.
is(tok::identifier)) {
2886 TokLocs.push_back(SuffixLoc);
2898 DiagLoc = TokLocs.front();
2899 DiagId = diag::err_literal_operator_string_not_empty;
2909 SourceRange(TokLocs.front(), TokLocs.back()), Str);
2912 Result.setLiteralOperatorId(II, KeywordLoc, SuffixLoc);
2930 if (ParseCXXTypeSpecifierSeq(
2938 ParseDeclaratorInternal(
D,
nullptr);
2946 Result.setConversionFunctionId(KeywordLoc, Ty.
get(),
2988 bool ObjectHadErrors,
bool EnteringContext,
2989 bool AllowDestructorName,
2990 bool AllowConstructorName,
2991 bool AllowDeductionGuide,
2999 bool TemplateSpecified =
false;
3000 if (Tok.
is(tok::kw_template)) {
3001 if (TemplateKWLoc && (ObjectType || SS.
isSet())) {
3002 TemplateSpecified =
true;
3006 Diag(TemplateLoc, diag::err_unexpected_template_in_unqualified_id)
3014 if (Tok.
is(tok::identifier)) {
3028 if (AllowConstructorName &&
3035 Result.setConstructorName(Ty, IdLoc, IdLoc);
3049 if (Tok.
is(tok::less))
3050 return ParseUnqualifiedIdTemplateId(
3051 SS, ObjectType, ObjectHadErrors,
3053 EnteringContext,
Result, TemplateSpecified);
3055 if (TemplateSpecified) {
3058 ObjectType, EnteringContext, Template,
3069 Diag(IdLoc, diag::missing_template_arg_list_after_template_kw);
3076 if (Tok.
is(tok::annot_template_id)) {
3082 ConsumeAnnotationToken();
3087 if (AllowConstructorName && TemplateId->
Name &&
3095 diag::err_out_of_line_constructor_template_id)
3106 ConsumeAnnotationToken();
3110 Result.setConstructorTemplateId(TemplateId);
3111 ConsumeAnnotationToken();
3117 Result.setTemplateId(TemplateId);
3120 if (TemplateKWLoc && (ObjectType || SS.
isSet()))
3121 *TemplateKWLoc = TemplateLoc;
3123 Diag(TemplateLoc, diag::err_unexpected_template_in_unqualified_id)
3126 ConsumeAnnotationToken();
3133 if (Tok.
is(tok::kw_operator)) {
3134 if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType,
Result))
3146 return ParseUnqualifiedIdTemplateId(
3147 SS, ObjectType, ObjectHadErrors,
3150 else if (TemplateSpecified &&
3153 EnteringContext, Template,
3161 (AllowDestructorName || SS.
isSet()) && Tok.
is(tok::tilde)) {
3170 if (TemplateSpecified) {
3181 Diag(*TemplateKWLoc, diag::err_unexpected_template_in_destructor_name)
3186 if (SS.
isEmpty() && Tok.
is(tok::kw_decltype)) {
3191 Result.setDestructorName(TildeLoc,
Type, EndLoc);
3198 if (Tok.
isNot(tok::identifier)) {
3199 Diag(Tok, diag::err_destructor_tilde_identifier);
3204 DeclaratorScopeObj DeclScopeObj(*
this, SS);
3212 AnnotateScopeToken(SS,
true);
3215 if (ParseOptionalCXXScopeSpecifier(SS, ObjectType, ObjectHadErrors,
3219 ObjectType =
nullptr;
3220 if (Tok.
isNot(tok::identifier) ||
NextToken().is(tok::coloncolon) ||
3222 Diag(TildeLoc, diag::err_destructor_tilde_scope);
3227 Diag(TildeLoc, diag::err_destructor_tilde_scope)
3233 DeclScopeObj.EnterDeclaratorScope();
3240 if (Tok.
is(tok::less)) {
3241 Result.setDestructorName(TildeLoc,
nullptr, ClassNameLoc);
3242 return ParseUnqualifiedIdTemplateId(
3243 SS, ObjectType, ObjectHadErrors,
3245 ClassNameLoc, EnteringContext,
Result, TemplateSpecified);
3251 ObjectType, EnteringContext);
3255 Result.setDestructorName(TildeLoc, Ty, ClassNameLoc);
3260#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
3261#include "clang/Basic/TransformTypeTraits.def"
3264 Diag(Tok, diag::ext_keyword_as_ident)
3266 goto ParseIdentifier;
3270 Diag(Tok, diag::err_expected_unqualified_id) <<
getLangOpts().CPlusPlus;
3304Parser::ParseCXXNewExpression(
bool UseGlobal,
SourceLocation Start) {
3305 assert(Tok.
is(tok::kw_new) &&
"expected 'new' token");
3311 ExprVector PlacementArgs;
3318 if (Tok.
is(tok::l_paren)) {
3322 PlacementLParen =
T.getOpenLocation();
3323 if (ParseExpressionListOrTypeId(PlacementArgs, DeclaratorInfo)) {
3329 PlacementRParen =
T.getCloseLocation();
3335 if (PlacementArgs.empty()) {
3337 TypeIdParens =
T.getRange();
3341 if (Tok.
is(tok::l_paren)) {
3344 MaybeParseGNUAttributes(DeclaratorInfo);
3345 ParseSpecifierQualifierList(DS);
3347 ParseDeclarator(DeclaratorInfo);
3349 TypeIdParens =
T.getRange();
3351 MaybeParseGNUAttributes(DeclaratorInfo);
3352 if (ParseCXXTypeSpecifierSeq(DS))
3353 DeclaratorInfo.setInvalidType(
true);
3356 ParseDeclaratorInternal(DeclaratorInfo,
3357 &Parser::ParseDirectNewDeclarator);
3364 MaybeParseGNUAttributes(DeclaratorInfo);
3366 DeclaratorInfo.setInvalidType(
true);
3369 ParseDeclaratorInternal(DeclaratorInfo,
3370 &Parser::ParseDirectNewDeclarator);
3373 if (DeclaratorInfo.isInvalidType()) {
3380 if (Tok.
is(tok::l_paren)) {
3382 ExprVector ConstructorArgs;
3385 ConstructorLParen =
T.getOpenLocation();
3386 if (Tok.
isNot(tok::r_paren)) {
3387 auto RunSignatureHelp = [&]() {
3397 DeclaratorInfo.getEndLoc(), ConstructorArgs,
3400 CalledSignatureHelp =
true;
3401 return PreferredType;
3403 if (ParseExpressionList(ConstructorArgs, [&] {
3404 PreferredType.enterFunctionArgument(Tok.
getLocation(),
3414 ConstructorRParen =
T.getCloseLocation();
3424 diag::warn_cxx98_compat_generalized_initializer_lists);
3430 return Actions.
ActOnCXXNew(Start, UseGlobal, PlacementLParen,
3431 PlacementArgs, PlacementRParen,
3442void Parser::ParseDirectNewDeclarator(
Declarator &
D) {
3445 while (Tok.
is(tok::l_square)) {
3447 if (CheckProhibitedCXX11Attribute())
3456 if (
Size.isInvalid()) {
3467 MaybeParseCXX11Attributes(Attrs);
3471 Size.get(),
T.getOpenLocation(),
3472 T.getCloseLocation()),
3473 std::move(Attrs),
T.getCloseLocation());
3475 if (
T.getCloseLocation().isInvalid())
3490bool Parser::ParseExpressionListOrTypeId(
3494 if (isTypeIdInParens()) {
3495 ParseSpecifierQualifierList(
D.getMutableDeclSpec());
3498 return D.isInvalidType();
3502 return ParseExpressionList(PlacementArgs);
3517Parser::ParseCXXDeleteExpression(
bool UseGlobal,
SourceLocation Start) {
3518 assert(Tok.
is(tok::kw_delete) &&
"Expected 'delete' keyword");
3522 bool ArrayDelete =
false;
3523 if (Tok.
is(tok::l_square) &&
NextToken().is(tok::r_square)) {
3531 const Token Next = GetLookAheadToken(2);
3534 if (Next.isOneOf(tok::l_brace, tok::less) ||
3535 (Next.is(tok::l_paren) &&
3536 (GetLookAheadToken(3).is(tok::r_paren) ||
3537 (GetLookAheadToken(3).is(tok::identifier) &&
3538 GetLookAheadToken(4).is(tok::identifier))))) {
3539 TentativeParsingAction TPA(*
this);
3547 bool EmitFixIt =
false;
3548 if (Tok.
is(tok::l_brace)) {
3558 Diag(Start, diag::err_lambda_after_delete)
3566 Diag(Start, diag::err_lambda_after_delete)
3576 Lambda = ParsePostfixExpressionSuffix(Lambda);
3588 if (
T.getCloseLocation().isInvalid())
3623ExprResult Parser::ParseRequiresExpression() {
3624 assert(Tok.
is(tok::kw_requires) &&
"Expected 'requires' keyword");
3629 if (Tok.
is(tok::l_paren)) {
3634 if (!Tok.
is(tok::r_paren)) {
3639 FirstArgAttrs, LocalParameters,
3642 Diag(EllipsisLoc, diag::err_requires_expr_parameter_list_ellipsis);
3643 for (
auto &ParamInfo : LocalParameters)
3644 LocalParameterDecls.push_back(cast<ParmVarDecl>(ParamInfo.Param));
3650 if (
Braces.expectAndConsume())
3667 RequiresKWLoc, LocalParameterDecls,
getCurScope());
3669 if (Tok.
is(tok::r_brace)) {
3676 Diag(Tok, diag::err_empty_requires_expr);
3679 while (!Tok.
is(tok::r_brace)) {
3681 case tok::l_brace: {
3692 ExprBraces.consumeOpen();
3696 ExprBraces.skipToEnd();
3700 if (ExprBraces.consumeClose())
3701 ExprBraces.skipToEnd();
3706 if (Tok.
is(tok::semi)) {
3709 Requirements.push_back(Req);
3714 Diag(Tok, diag::err_requires_expr_missing_arrow)
3717 if (TryAnnotateTypeConstraint()) {
3721 if (!isTypeConstraintAnnotation()) {
3722 Diag(Tok, diag::err_requires_expr_expected_type_constraint);
3727 if (Tok.
is(tok::annot_cxxscope)) {
3731 ConsumeAnnotationToken();
3735 Expression.get(), NoexceptLoc, SS, takeTemplateIdAnnotation(Tok),
3736 TemplateParameterDepth);
3737 ConsumeAnnotationToken();
3739 Requirements.push_back(Req);
3743 bool PossibleRequiresExprInSimpleRequirement =
false;
3744 if (Tok.
is(tok::kw_requires)) {
3745 auto IsNestedRequirement = [&] {
3746 RevertingTentativeParsingAction TPA(*
this);
3748 if (Tok.
is(tok::l_brace))
3755 if (Tok.
is(tok::l_paren)) {
3758 auto Res = TryParseParameterDeclarationClause();
3759 if (Res != TPResult::False) {
3762 while (Depth != 0) {
3763 bool FoundParen =
SkipUntil(tok::l_paren, tok::r_paren,
3767 if (Tok.
is(tok::l_paren))
3769 else if (Tok.
is(tok::r_paren))
3780 if (Tok.
is(tok::l_brace))
3789 if (IsNestedRequirement()) {
3804 Requirements.push_back(Req);
3812 PossibleRequiresExprInSimpleRequirement =
true;
3813 }
else if (Tok.
is(tok::kw_typename)) {
3816 TentativeParsingAction TPA(*
this);
3826 if (Tok.
is(tok::annot_cxxscope)) {
3829 ConsumeAnnotationToken();
3832 if (Tok.
isOneOf(tok::identifier, tok::annot_template_id) &&
3838 if (Tok.
is(tok::identifier)) {
3842 TemplateId = takeTemplateIdAnnotation(Tok);
3843 ConsumeAnnotationToken();
3851 Requirements.push_back(Req);
3868 if (!
Expression.isInvalid() && PossibleRequiresExprInSimpleRequirement)
3869 Diag(StartLoc, diag::err_requires_expr_in_simple_requirement)
3872 Requirements.push_back(Req);
3878 if (Tok.
is(tok::kw_noexcept)) {
3879 Diag(Tok, diag::err_requires_expr_simple_requirement_noexcept)
3888 if (ExpectAndConsumeSemi(diag::err_expected_semi_requirement)) {
3894 if (Requirements.empty()) {
3905 ParsingBodyDecl.complete(Body);
3907 RequiresKWLoc, Body,
Parens.getOpenLocation(), LocalParameterDecls,
3908 Parens.getCloseLocation(), Requirements,
Braces.getCloseLocation());
3913 default: llvm_unreachable(
"Not a known type trait");
3914#define TYPE_TRAIT_1(Spelling, Name, Key) \
3915case tok::kw_ ## Spelling: return UTT_ ## Name;
3916#define TYPE_TRAIT_2(Spelling, Name, Key) \
3917case tok::kw_ ## Spelling: return BTT_ ## Name;
3918#include "clang/Basic/TokenKinds.def"
3919#define TYPE_TRAIT_N(Spelling, Name, Key) \
3920 case tok::kw_ ## Spelling: return TT_ ## Name;
3921#include "clang/Basic/TokenKinds.def"
3928 llvm_unreachable(
"Not a known array type trait");
3929#define ARRAY_TYPE_TRAIT(Spelling, Name, Key) \
3930 case tok::kw_##Spelling: \
3932#include "clang/Basic/TokenKinds.def"
3939 llvm_unreachable(
"Not a known unary expression trait.");
3940#define EXPRESSION_TRAIT(Spelling, Name, Key) \
3941 case tok::kw_##Spelling: \
3943#include "clang/Basic/TokenKinds.def"
3964 if (
Parens.expectAndConsume())
3980 if (Tok.
is(tok::ellipsis)) {
3989 Args.push_back(Ty.
get());
3992 if (
Parens.consumeClose())
4012 if (
T.expectAndConsume())
4024 case ATT_ArrayRank: {
4027 T.getCloseLocation());
4029 case ATT_ArrayExtent: {
4030 if (ExpectAndConsume(tok::comma)) {
4042 T.getCloseLocation());
4045 llvm_unreachable(
"Invalid ArrayTypeTrait!");
4059 if (
T.expectAndConsume())
4067 T.getCloseLocation());
4075Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType,
4080 assert(ExprType ==
CastExpr &&
"Compound literals are not ambiguous!");
4081 assert(isTypeIdInParens() &&
"Not a type-id!");
4105 ParenParseOption ParseAs;
4110 if (!ConsumeAndStoreUntil(tok::r_paren, Toks)) {
4116 if (Tok.
is(tok::l_brace)) {
4117 ParseAs = CompoundLiteral;
4120 if (Tok.
is(tok::l_paren) &&
NextToken().is(tok::r_paren)) {
4127 Result = ParseCastExpression(AnyCastExpr,
4136 ParseAs = NotCastExpr ? SimpleExpr :
CastExpr;
4145 Toks.push_back(AttrEnd);
4148 Toks.push_back(Tok);
4151 PP.EnterTokenStream(Toks,
true,
4157 if (ParseAs >= CompoundLiteral) {
4164 ParseSpecifierQualifierList(DS);
4165 ParseDeclarator(DeclaratorInfo);
4176 if (ParseAs == CompoundLiteral) {
4177 ExprType = CompoundLiteral;
4178 if (DeclaratorInfo.isInvalidType())
4182 return ParseCompoundLiteralExpression(Ty.
get(),
4190 if (DeclaratorInfo.isInvalidType())
4196 DeclaratorInfo, CastTy,
4202 assert(ParseAs == SimpleExpr);
4204 ExprType = SimpleExpr;
4206 if (!
Result.isInvalid() && Tok.
is(tok::r_paren))
4211 if (
Result.isInvalid()) {
4212 while (Tok.
isNot(tok::eof))
4231 if (
T.expectAndConsume(diag::err_expected_lparen_after,
"__builtin_bit_cast"))
4236 ParseSpecifierQualifierList(DS);
4241 ParseDeclarator(DeclaratorInfo);
4243 if (ExpectAndConsume(tok::comma)) {
4251 if (
T.consumeClose())
4254 if (
Operand.isInvalid() || DeclaratorInfo.isInvalidType())
4258 T.getCloseLocation());
Defines the clang::ASTContext interface.
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
static void addConstexprToLambdaDeclSpecifier(Parser &P, SourceLocation ConstexprLoc, DeclSpec &DS)
static void FixDigraph(Parser &P, Preprocessor &PP, Token &DigraphToken, Token &ColonToken, tok::TokenKind Kind, bool AtDigraph)
static ArrayTypeTrait ArrayTypeTraitFromTokKind(tok::TokenKind kind)
static void tryConsumeLambdaSpecifierToken(Parser &P, SourceLocation &MutableLoc, SourceLocation &StaticLoc, SourceLocation &ConstexprLoc, SourceLocation &ConstevalLoc, SourceLocation &DeclEndLoc)
static ExpressionTrait ExpressionTraitFromTokKind(tok::TokenKind kind)
static void addConstevalToLambdaDeclSpecifier(Parser &P, SourceLocation ConstevalLoc, DeclSpec &DS)
static TypeTrait TypeTraitFromTokKind(tok::TokenKind kind)
static void DiagnoseStaticSpecifierRestrictions(Parser &P, SourceLocation StaticLoc, SourceLocation MutableLoc, const LambdaIntroducer &Intro)
static int SelectDigraphErrorMessage(tok::TokenKind Kind)
static void addStaticToLambdaDeclSpecifier(Parser &P, SourceLocation StaticLoc, DeclSpec &DS)
Defines the PrettyStackTraceEntry class, which is used to make crashes give more contextual informati...
static constexpr bool isOneOf()
This file declares facilities that support code completion.
Defines the clang::TemplateNameKind enum.
Defines the clang::TokenKind enum and support functions.
const clang::PrintingPolicy & getPrintingPolicy() const
RAII class that helps handle the parsing of an open/close delimiter pair, such as braces { ....
SourceLocation getOpenLocation() const
SourceLocation getCloseLocation() const
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.
SourceRange getRange() const
SourceLocation getBeginLoc() const
bool isSet() const
Deprecated.
void setEndLoc(SourceLocation Loc)
void SetInvalid(SourceRange R)
Indicate that this nested-name-specifier is invalid.
bool isEmpty() const
No scope specifier.
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.
void restore()
restore - This can be used to restore the state early, before the dtor is run.
Captures information about "declaration specifiers".
static const TST TST_typename
SourceLocation getEndLoc() const LLVM_READONLY
bool SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
These methods set the specified attribute of the DeclSpec and return false if there was no error.
static const TST TST_char8
static const TST TST_BFloat16
bool SetConstexprSpec(ConstexprSpecKind ConstexprKind, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID)
bool SetTypeSpecWidth(TypeSpecifierWidth W, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
These methods set the specified attribute of the DeclSpec, but return true and ignore the request if ...
bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
bool SetTypeSpecSat(SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID)
SourceRange getSourceRange() const LLVM_READONLY
void SetRangeEnd(SourceLocation Loc)
bool SetBitIntType(SourceLocation KWLoc, Expr *BitWidth, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
static const TST TST_double
void SetRangeStart(SourceLocation Loc)
static const TST TST_char
static const TST TST_bool
static const TST TST_char16
static const TST TST_accum
static const TST TST_half
static const TST TST_ibm128
static const TST TST_float128
void Finish(Sema &S, const PrintingPolicy &Policy)
Finish - This does final analysis of the declspec, issuing diagnostics for things like "_Complex" (la...
static const TST TST_wchar
static const TST TST_void
static const TST TST_float
static const TST TST_fract
static const TST TST_float16
static const TST TST_decltype_auto
static const TST TST_error
static const TST TST_char32
static const TST TST_int128
bool SetTypeSpecSign(TypeSpecifierSign S, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID)
static const TST TST_auto
Decl - This represents one declaration (or definition), e.g.
SourceLocation getLocation() const
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
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.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static SourceLocation AdvanceToTokenCharacter(SourceLocation TokStart, unsigned Characters, const SourceManager &SM, const LangOptions &LangOpts)
AdvanceToTokenCharacter - If the current SourceLocation specifies a location at the start of a token,...
static SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset, const SourceManager &SM, const LangOptions &LangOpts)
Computes the source location just past the end of the token at this source location.
This represents a decl that may have a name.
static OpaquePtr make(QualType P)
RAII object that makes sure paren/bracket/brace count is correct after declaration/statement parsing,...
ParsedAttr - Represents a syntactic attribute.
static const ParsedAttributesView & none()
ParsedAttributes - A collection of parsed attributes.
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.
AttributeFactory & getAttrFactory()
static TypeResult getTypeAnnotation(const Token &Tok)
getTypeAnnotation - Read a parsed type out of an annotation token.
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.
bool TryAnnotateOptionalCXXScopeToken(bool EnteringContext=false)
SourceLocation ConsumeAnyToken(bool ConsumeCodeCompletionTok=false)
ConsumeAnyToken - Dispatch to the right Consume* method based on the current token type.
ExprResult ParseConstantExpression()
bool TryConsumeToken(tok::TokenKind Expected)
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
Scope * getCurScope() const
OpaquePtr< TemplateName > TemplateTy
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.
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.
const Token & NextToken()
NextToken - This peeks ahead one token and returns it without consuming it.
ExprResult ParseConstraintExpression()
Parse a constraint-expression.
RAII object used to inform the actions that we're currently parsing a declaration.
void enterTypeCast(SourceLocation Tok, QualType CastType)
Handles all type casts, including C-style cast, C++ casts, etc.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
void EnterToken(const Token &Tok, bool IsReinject)
Enters a token in the token stream to be lexed next.
void AnnotateCachedTokens(const Token &Tok)
We notify the Preprocessor that if it is caching tokens (because backtrack is enabled) it should repl...
void Lex(Token &Result)
Lex the next token for this preprocessor.
const Token & LookAhead(unsigned N)
Peeks ahead N tokens and returns that token without consuming any tokens.
SourceManager & getSourceManager() const
void RevertCachedTokens(unsigned N)
When backtracking is enabled and tokens are cached, this allows to revert a specific number of tokens...
IdentifierTable & getIdentifierTable()
bool isCodeCompletionReached() const
Returns true if code-completion is enabled and we have hit the code-completion point.
SourceLocation getLastCachedTokenLocation() const
Get the location of the last cached token, suitable for setting the end location of an annotation tok...
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.
Represents the body of a requires-expression.
Scope - A scope is a transient data structure that is used while parsing the program.
@ FunctionPrototypeScope
This is a scope that corresponds to the parameters within a function prototype.
@ LambdaScope
This is the scope for a lambda, after the lambda introducer.
@ BlockScope
This is a scope that corresponds to a block/closure object.
@ ContinueScope
This is a while, do, for, which can have continue statements embedded into it.
@ BreakScope
This is a while, do, switch, for, etc that can have break statements embedded into it.
@ CompoundStmtScope
This is a compound statement scope.
@ FunctionDeclarationScope
This is a scope that corresponds to the parameters within a function prototype for a function declara...
@ 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.
void CodeCompleteObjCMessageReceiver(Scope *S)
void CodeCompleteOperatorName(Scope *S)
@ PCC_Condition
Code completion occurs within the condition of an if, while, switch, or for statement.
void CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro, bool AfterAmpersand)
QualType ProduceConstructorSignatureHelp(QualType Type, SourceLocation Loc, ArrayRef< Expr * > Args, SourceLocation OpenParLoc, bool Braced)
void CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, bool EnteringContext, bool IsUsingDeclaration, QualType BaseType, QualType PreferredType)
void CodeCompleteOrdinaryName(Scope *S, ParserCompletionContext CompletionContext)
ExprResult ActOnCXXTypeid(SourceLocation OpLoc, SourceLocation LParenLoc, bool isType, void *TyOrExpr, SourceLocation RParenLoc)
ActOnCXXTypeid - Parse typeid( something ).
ExprResult ActOnCXXUuidof(SourceLocation OpLoc, SourceLocation LParenLoc, bool isType, void *TyOrExpr, SourceLocation RParenLoc)
ActOnCXXUuidof - Parse __uuidof( something ).
ExprResult ActOnLambdaExpr(SourceLocation StartLoc, Stmt *Body)
ActOnLambdaExpr - This is called when the body of a lambda expression was successfully completed.
TypeResult ActOnTemplateIdType(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy Template, const IdentifierInfo *TemplateII, SourceLocation TemplateIILoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc, bool IsCtorOrDtorName=false, bool IsClassName=false, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No)
DeclResult ActOnCXXConditionDeclaration(Scope *S, Declarator &D)
ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a C++ if/switch/while/for statem...
ExprResult ActOnExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc, Expr *Queried, SourceLocation RParen)
ActOnExpressionTrait - Parsed one of the unary type trait support pseudo-functions.
@ Switch
An integral condition for a 'switch' statement.
ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool HasTrailingLParen, bool IsAddressOfOperand, CorrectionCandidateCallback *CCC=nullptr, bool IsInlineAsmIdentifier=false, Token *KeywordReplacement=nullptr)
void ActOnLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro, Scope *CurContext)
Once the Lambdas capture are known, we can start to create the closure, call operator method,...
concepts::Requirement * ActOnSimpleRequirement(Expr *E)
StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue=true)
concepts::Requirement * ActOnCompoundRequirement(Expr *E, SourceLocation NoexceptLoc)
bool ActOnCXXNestedNameSpecifierDecltype(CXXScopeSpec &SS, const DeclSpec &DS, SourceLocation ColonColonLoc)
ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, bool ArrayForm, Expr *Operand)
ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
TemplateNameKind isTemplateName(Scope *S, CXXScopeSpec &SS, bool hasTemplateKeyword, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool &MemberOfUnknownSpecialization, bool Disambiguation=false)
void FinalizeDeclaration(Decl *D)
FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform any semantic actions neces...
ExprResult ActOnCoyieldExpr(Scope *S, SourceLocation KwLoc, Expr *E)
ParsedType getDestructorName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, ParsedType ObjectType, bool EnteringContext)
ASTContext & getASTContext() const
bool isCurrentClassName(const IdentifierInfo &II, Scope *S, const CXXScopeSpec *SS=nullptr)
isCurrentClassName - Determine whether the identifier II is the name of the class type currently bein...
ExprResult ActOnPseudoDestructorExpr(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, CXXScopeSpec &SS, UnqualifiedId &FirstTypeName, SourceLocation CCLoc, SourceLocation TildeLoc, UnqualifiedId &SecondTypeName)
ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R, MultiExprArg Val)
ExprResult ActOnArrayTypeTrait(ArrayTypeTrait ATT, SourceLocation KWLoc, ParsedType LhsTy, Expr *DimExpr, SourceLocation RParen)
ActOnArrayTypeTrait - Parsed one of the binary type trait support pseudo-functions.
void ActOnFinishRequiresExpr()
ExprResult ActOnCXXThrow(Scope *S, SourceLocation OpLoc, Expr *expr)
sema::LambdaScopeInfo * getCurGenericLambda()
Retrieve the current generic lambda info, if any.
ExprResult ActOnNameClassifiedAsNonType(Scope *S, const CXXScopeSpec &SS, NamedDecl *Found, SourceLocation NameLoc, const Token &NextToken)
Act on the result of classifying a name as a specific non-type declaration.
ExprResult ActOnBuiltinBitCastExpr(SourceLocation KWLoc, Declarator &Dcl, ExprResult Operand, SourceLocation RParenLoc)
bool ActOnCXXGlobalScopeSpecifier(SourceLocation CCLoc, CXXScopeSpec &SS)
The parser has parsed a global nested-name-specifier '::'.
bool ActOnCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo, bool EnteringContext, CXXScopeSpec &SS, bool *IsCorrectedToColon=nullptr, bool OnlyNamespace=false)
The parser has parsed a nested-name-specifier 'identifier::'.
bool checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Id, bool IsUDSuffix)
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK, bool MissingOK=false)
sema::LambdaScopeInfo * PushLambdaScope()
SemaCodeCompletion & CodeCompletion()
void ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro, Declarator &ParamInfo, const DeclSpec &DS)
ActOnStartOfLambdaDefinition - This is called just before we start parsing the body of a lambda; it a...
void ActOnLambdaClosureParameters(Scope *LambdaScope, MutableArrayRef< DeclaratorChunk::ParamInfo > ParamInfo)
ExprResult ActOnCXXBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind)
ActOnCXXBoolLiteral - Parse {true,false} literals.
bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS)
ExprResult ActOnCXXTypeConstructExpr(ParsedType TypeRep, SourceLocation LParenOrBraceLoc, MultiExprArg Exprs, SourceLocation RParenOrBraceLoc, bool ListInitialization)
ActOnCXXTypeConstructExpr - Parse construction of a specified type.
ConditionResult ActOnConditionVariable(Decl *ConditionVar, SourceLocation StmtLoc, ConditionKind CK)
bool ActOnSuperScopeSpecifier(SourceLocation SuperLoc, SourceLocation ColonColonLoc, CXXScopeSpec &SS)
The parser has parsed a '__super' nested-name-specifier.
ExprResult ActOnRequiresExpr(SourceLocation RequiresKWLoc, RequiresExprBodyDecl *Body, SourceLocation LParenLoc, ArrayRef< ParmVarDecl * > LocalParameters, SourceLocation RParenLoc, ArrayRef< concepts::Requirement * > Requirements, SourceLocation ClosingBraceLoc)
StmtResult ActOnNullStmt(SourceLocation SemiLoc, bool HasLeadingEmptyMacro=false)
ExprResult ActOnCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, SourceLocation LAngleBracketLoc, Declarator &D, SourceLocation RAngleBracketLoc, SourceLocation LParenLoc, Expr *E, SourceLocation RParenLoc)
ActOnCXXNamedCast - Parse {dynamic,static,reinterpret,const,addrspace}_cast's.
ExprResult ActOnPackIndexingExpr(Scope *S, Expr *PackExpression, SourceLocation EllipsisLoc, SourceLocation LSquareLoc, Expr *IndexExpr, SourceLocation RSquareLoc)
ParsedType getDestructorTypeForDecltype(const DeclSpec &DS, ParsedType ObjectType)
ExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, Declarator &D, Expr *Initializer)
Parsed a C++ 'new' expression (C++ 5.3.4).
void RestoreNestedNameSpecifierAnnotation(void *Annotation, SourceRange AnnotationRange, CXXScopeSpec &SS)
Given an annotation pointer for a nested-name-specifier, restore the nested-name-specifier structure.
TemplateNameKind ActOnTemplateName(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool AllowInjectedClassName=false)
Form a template name from a name that is syntactically required to name a template,...
ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E)
SourceManager & getSourceManager() const
void ActOnLambdaExplicitTemplateParameterList(LambdaIntroducer &Intro, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > TParams, SourceLocation RAngleLoc, ExprResult RequiresClause)
This is called after parsing the explicit template parameter list on a lambda (if it exists) in C++2a...
bool ActOnCXXNestedNameSpecifierIndexedPack(CXXScopeSpec &SS, const DeclSpec &DS, SourceLocation ColonColonLoc, QualType Type)
ParsedType actOnLambdaInitCaptureInitialization(SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc, IdentifierInfo *Id, LambdaCaptureInitKind InitKind, Expr *&Init)
Perform initialization analysis of the init-capture and perform any implicit conversions such as an l...
void ActOnInitializerError(Decl *Dcl)
ActOnInitializerError - Given that there was an error parsing an initializer for the given declaratio...
ExprResult ActOnNameClassifiedAsUndeclaredNonType(IdentifierInfo *Name, SourceLocation NameLoc)
Act on the result of classifying a name as an undeclared (ADL-only) non-type declaration.
TypeResult ActOnTypeName(Declarator &D)
void ActOnLambdaClosureQualifiers(LambdaIntroducer &Intro, SourceLocation MutableLoc)
void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope, bool IsInstantiation=false)
ActOnLambdaError - If there is an error parsing a lambda, this callback is invoked to pop the informa...
concepts::Requirement * ActOnTypeRequirement(SourceLocation TypenameKWLoc, CXXScopeSpec &SS, SourceLocation NameLoc, const IdentifierInfo *TypeName, TemplateIdAnnotation *TemplateId)
ParsedTemplateArgument ActOnPackExpansion(const ParsedTemplateArgument &Arg, SourceLocation EllipsisLoc)
Invoked when parsing a template argument followed by an ellipsis, which creates a pack expansion.
ExprResult ActOnRequiresClause(ExprResult ConstraintExpr)
RequiresExprBodyDecl * ActOnStartRequiresExpr(SourceLocation RequiresKWLoc, ArrayRef< ParmVarDecl * > LocalParameters, Scope *BodyScope)
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
void RecordParsingTemplateParameterDepth(unsigned Depth)
This is used to inform Sema what the current TemplateParameterDepth is during Parsing.
StmtResult ActOnDeclStmt(DeclGroupPtrTy Decl, SourceLocation StartLoc, SourceLocation EndLoc)
ExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, Declarator &D, ParsedType &Ty, SourceLocation RParenLoc, Expr *CastExpr)
bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name, SourceLocation NameLoc, CXXScopeSpec &SS, ParsedTemplateTy *Template=nullptr)
Determine whether a particular identifier might be the name in a C++1z deduction-guide declaration.
ExprResult ActOnTypeTrait(TypeTrait Kind, SourceLocation KWLoc, ArrayRef< ParsedType > Args, SourceLocation RParenLoc)
Parsed one of the type trait support pseudo-functions.
QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc)
void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit)
AddInitializerToDecl - Adds the initializer Init to the declaration dcl.
ParsedType getConstructorName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, bool EnteringContext)
ExprResult ActOnNameClassifiedAsDependentNonType(const CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, bool IsAddressOfOperand)
Act on the result of classifying a name as an undeclared member of a dependent base class.
concepts::Requirement * ActOnNestedRequirement(Expr *Constraint)
static ConditionResult ConditionError()
bool IsInvalidUnlessNestedName(Scope *S, CXXScopeSpec &SS, NestedNameSpecInfo &IdInfo, bool EnteringContext)
IsInvalidUnlessNestedName - This method is used for error recovery purposes to determine whether the ...
ExprResult ActOnCXXThis(SourceLocation Loc)
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...
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.
A trivial tuple used to represent a source range.
void setBegin(SourceLocation b)
SourceLocation getEnd() const
SourceLocation getBegin() const
void setEnd(SourceLocation e)
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteralParser - This decodes string escape characters and performs wide string analysis and Tra...
Represents a C++ template name within the type system.
Token - This structure provides full information about a lexed token.
IdentifierInfo * getIdentifierInfo() const
void setAnnotationEndLoc(SourceLocation L)
SourceLocation getLocation() const
Return a source location identifier for the specified offset in the current file.
const char * getName() const
unsigned getLength() const
void setLength(unsigned Len)
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 isRegularKeywordAttribute() const
Return true if the token is a keyword that is parsed in the same position as a standard attribute,...
void setEofData(const void *D)
SourceRange getAnnotationRange() const
SourceRange of the group of tokens that this annotation token represents.
void setLocation(SourceLocation L)
bool hasLeadingEmptyMacro() const
Return true if this token has an empty macro before it.
bool isOneOf(tok::TokenKind K1, tok::TokenKind K2) const
bool isNot(tok::TokenKind K) const
const void * getEofData() const
void startToken()
Reset all flags to cleared.
The base class of the type hierarchy.
QualType getCanonicalTypeInternal() const
Represents a C++ unqualified-id that has been parsed.
void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Specify that this unqualified-id was parsed as an identifier.
bool isValid() const
Determine whether this unqualified-id refers to a valid name.
void setTemplateId(TemplateIdAnnotation *TemplateId)
Specify that this unqualified-id was parsed as a template-id.
A static requirement that can be used in a requires-expression to check properties of types and expre...
uint32_t Literal
Literals are represented as positive integers.
@ After
Like System, but searched after the system directories.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
ArrayTypeTrait
Names for the array type traits.
LambdaCaptureKind
The different capture forms in a lambda introducer.
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_StarThis
Capturing the *this object by copy.
@ LCK_This
Capturing the *this object by reference.
@ IK_ConstructorName
A constructor name.
@ IK_LiteralOperatorId
A user-defined literal name, e.g., operator "" _i.
@ IK_Identifier
An identifier.
@ IK_DestructorName
A destructor name.
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
@ CopyInit
[a = b], [a = {b}]
@ Result
The result type of a method or function.
ActionResult< Expr * > ExprResult
TemplateNameKind
Specifies the kind of template name that an identifier refers to.
@ TNK_Var_template
The name refers to a variable template whose specialization produces a variable.
@ TNK_Dependent_template_name
The name refers to a dependent template name:
@ TNK_Function_template
The name refers to a function template or a set of overloaded functions that includes at least one fu...
@ TNK_Non_template
The name does not refer to a template.
@ TNK_Undeclared_template
Lookup for the name failed, but we're assuming it was a template name anyway.
const FunctionProtoType * T
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
TypeTrait
Names for traits that operate specifically on types.
@ Parens
New-expression has a C++98 paren-delimited initializer.
@ Braces
New-expression has a C++11 list-initializer.
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ 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.
static DeclaratorChunk getArray(unsigned TypeQuals, bool isStatic, bool isStar, Expr *NumElts, SourceLocation LBLoc, SourceLocation RBLoc)
Return a DeclaratorChunk for an array.
Represents a complete lambda introducer.
bool hasLambdaCapture() const
void addCapture(LambdaCaptureKind Kind, SourceLocation Loc, IdentifierInfo *Id, SourceLocation EllipsisLoc, LambdaCaptureInitKind InitKind, ExprResult Init, ParsedType InitCaptureType, SourceRange ExplicitRange)
Append a capture in a lambda introducer.
SourceLocation DefaultLoc
LambdaCaptureDefault Default
Describes how types, statements, expressions, and declarations should be printed.
Keeps information about an identifier in a nested-name-spec.
Information about a template-id annotation token.
const IdentifierInfo * Name
FIXME: Temporarily stores the name of a specialization.
unsigned NumArgs
NumArgs - The number of template arguments.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
SourceLocation TemplateKWLoc
TemplateKWLoc - The location of the template keyword.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.
static TemplateIdAnnotation * Create(SourceLocation TemplateKWLoc, SourceLocation TemplateNameLoc, const IdentifierInfo *Name, OverloadedOperatorKind OperatorKind, ParsedTemplateTy OpaqueTemplateName, TemplateNameKind TemplateKind, SourceLocation LAngleLoc, SourceLocation RAngleLoc, ArrayRef< ParsedTemplateArgument > TemplateArgs, bool ArgsInvalid, SmallVectorImpl< TemplateIdAnnotation * > &CleanupList)
Creates a new TemplateIdAnnotation with NumArgs arguments and appends it to List.