23 #include "llvm/Support/ErrorHandling.h"
26 using namespace clang;
31 case tok::unknown:
return 0;
33 case tok::kw_const_cast:
return 1;
34 case tok::kw_dynamic_cast:
return 2;
35 case tok::kw_reinterpret_cast:
return 3;
36 case tok::kw_static_cast:
return 4;
38 llvm_unreachable(
"Unknown type for digraph error message.");
43 bool Parser::areTokensAdjacent(
const Token &First,
const Token &Second) {
61 P.
Diag(DigraphToken.
getLocation(), diag::err_missing_whitespace_digraph)
66 ColonToken.
setKind(tok::coloncolon);
69 DigraphToken.
setKind(tok::less);
83 if (!Next.
is(tok::l_square) || Next.
getLength() != 2)
86 Token SecondToken = GetLookAheadToken(2);
87 if (!SecondToken.
is(tok::colon) || !areTokensAdjacent(Next, SecondToken))
93 bool MemberOfUnknownSpecialization;
95 TemplateName, ObjectType, EnteringContext,
96 Template, MemberOfUnknownSpecialization))
99 FixDigraph(*
this, PP, Next, SecondToken, tok::unknown,
107 void Parser::CheckForLParenAfterColonColon() {
108 if (!Tok.
is(tok::l_paren))
112 Token NextTok = GetLookAheadToken(1);
113 Token StarTok = NextTok;
115 Token IdentifierTok = StarTok.
is(tok::star) ? GetLookAheadToken(2) : StarTok;
116 if (IdentifierTok.
isNot(tok::identifier))
123 NextTok = StarTok.
is(tok::star) ? GetLookAheadToken(2) : GetLookAheadToken(1);
124 if (NextTok.
is(tok::r_paren)) {
127 if (StarTok.
is(tok::star))
134 if (StarTok.
is(tok::star))
187 bool Parser::ParseOptionalCXXScopeSpecifier(
CXXScopeSpec &SS,
189 bool EnteringContext,
190 bool *MayBePseudoDestructor,
194 "Call sites of this function should be guarded by checking for C++");
196 if (Tok.
is(tok::annot_cxxscope)) {
197 assert(!LastII &&
"want last identifier but have already annotated scope");
198 assert(!MayBePseudoDestructor &&
"unexpected annot_cxxscope");
206 if (Tok.
is(tok::annot_template_id)) {
214 bool CheckForDestructor =
false;
215 if (MayBePseudoDestructor && *MayBePseudoDestructor) {
216 CheckForDestructor =
true;
217 *MayBePseudoDestructor =
false;
223 bool HasScopeSpecifier =
false;
225 if (Tok.
is(tok::coloncolon)) {
228 if (NextKind == tok::kw_new || NextKind == tok::kw_delete)
231 if (NextKind == tok::l_brace) {
240 CheckForLParenAfterColonColon();
242 HasScopeSpecifier =
true;
246 if (Tok.
is(tok::kw___super)) {
248 if (!Tok.
is(tok::coloncolon)) {
256 if (!HasScopeSpecifier &&
257 Tok.
isOneOf(tok::kw_decltype, tok::annot_decltype)) {
264 AnnotateExistingDecltypeSpecifier(DS, DeclLoc, EndLoc);
271 HasScopeSpecifier =
true;
275 if (HasScopeSpecifier) {
286 ObjectType =
nullptr;
288 if (Tok.
is(tok::code_completion)) {
307 if (Tok.
is(tok::kw_template)) {
311 if (!HasScopeSpecifier && !ObjectType)
314 TentativeParsingAction TPA(*
this);
318 if (Tok.
is(tok::identifier)) {
322 }
else if (Tok.
is(tok::kw_operator)) {
327 if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType,
336 diag::err_id_after_template_in_nested_name_spec)
349 if (Tok.
isNot(tok::less)) {
359 SS, TemplateKWLoc, TemplateName,
360 ObjectType, EnteringContext,
362 if (AnnotateTemplateIdToken(Template, TNK, SS, TemplateKWLoc,
363 TemplateName,
false))
371 if (Tok.
is(tok::annot_template_id) &&
NextToken().
is(tok::coloncolon)) {
380 if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde)) {
381 *MayBePseudoDestructor =
true;
386 *LastII = TemplateId->
Name;
391 assert(Tok.
is(tok::coloncolon) &&
"NextToken() not working properly!");
394 HasScopeSpecifier =
true;
420 if (Tok.
isNot(tok::identifier))
433 if (Next.
is(tok::colon) && !ColonIsSacred) {
442 Diag(Next, diag::err_unexpected_colon_in_nested_name_spec)
449 if (Next.
is(tok::coloncolon) && GetLookAheadToken(2).
is(tok::l_brace)) {
452 Token Identifier = Tok;
456 UnconsumeToken(Identifier);
460 if (Next.
is(tok::coloncolon)) {
461 if (CheckForDestructor && GetLookAheadToken(2).
is(tok::tilde) &&
464 *MayBePseudoDestructor =
true;
469 const Token &Next2 = GetLookAheadToken(2);
470 if (Next2.
is(tok::kw_private) || Next2.
is(tok::kw_protected) ||
471 Next2.
is(tok::kw_public) || Next2.
is(tok::kw_virtual)) {
472 Diag(Next2, diag::err_unexpected_token_in_nested_name_spec)
477 ColonColon.setKind(tok::colon);
488 Token Identifier = Tok;
490 assert(Tok.
isOneOf(tok::coloncolon, tok::colon) &&
491 "NextToken() not working properly!");
492 Token ColonColon = Tok;
495 CheckForLParenAfterColonColon();
497 bool IsCorrectedToColon =
false;
498 bool *CorrectionFlagPtr = ColonIsSacred ? &IsCorrectedToColon :
nullptr;
500 ObjectType, EnteringContext, SS,
501 false, CorrectionFlagPtr)) {
504 if (CorrectionFlagPtr && IsCorrectedToColon) {
505 ColonColon.setKind(tok::colon);
513 HasScopeSpecifier =
true;
517 CheckForTemplateAndDigraph(Next, ObjectType, EnteringContext, II, SS);
521 if (Next.
is(tok::less)) {
525 bool MemberOfUnknownSpecialization;
532 MemberOfUnknownSpecialization)) {
541 TemplateName,
false))
546 if (MemberOfUnknownSpecialization && (ObjectType || SS.
isSet()) &&
547 (IsTypename || IsTemplateArgumentList(1))) {
552 unsigned DiagID = diag::err_missing_dependent_template_keyword;
554 DiagID = diag::warn_missing_dependent_template_keyword;
563 TemplateName, ObjectType,
564 EnteringContext, Template)) {
568 TemplateName,
false))
586 if (CheckForDestructor && Tok.
is(tok::tilde))
587 *MayBePseudoDestructor =
true;
600 nullptr, TemplateKWLoc, Name))
605 if (isAddressOfOperand && isPostfixExpressionSuffixStart())
606 isAddressOfOperand =
false;
609 Tok.
is(tok::l_paren), isAddressOfOperand,
656 ExprResult Parser::ParseCXXIdExpression(
bool isAddressOfOperand) {
662 ParseOptionalCXXScopeSpecifier(SS,
nullptr,
false);
666 tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement);
670 UnconsumeToken(Replacement);
671 Result = tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement);
673 assert(!Result.
isUnset() &&
"Typo correction suggested a keyword replacement "
674 "for a previous keyword suggestion");
720 Optional<unsigned> DiagID = ParseLambdaIntroducer(Intro);
722 Diag(Tok, DiagID.getValue());
729 return ParseLambdaExpressionAfterIntroducer(Intro);
737 ExprResult Parser::TryParseLambdaExpression() {
739 && Tok.
is(tok::l_square)
740 &&
"Not at the start of a possible lambda expression.");
748 if (Next.is(tok::r_square) ||
749 Next.is(tok::equal) ||
750 (Next.is(tok::amp) &&
751 (After.
is(tok::r_square) ||
752 After.
is(tok::comma))) ||
753 (Next.is(tok::identifier) &&
754 After.
is(tok::r_square))) {
755 return ParseLambdaExpression();
760 if (Next.is(tok::identifier) && After.
is(tok::identifier)) {
771 if (TryParseLambdaIntroducer(Intro))
774 return ParseLambdaExpressionAfterIntroducer(Intro);
787 bool *SkippedInits) {
788 typedef Optional<unsigned> DiagResult;
790 assert(Tok.
is(tok::l_square) &&
"Lambda expressions begin with '['.");
799 if (Tok.
is(tok::amp) &&
804 }
else if (Tok.
is(tok::equal)) {
810 while (Tok.
isNot(tok::r_square)) {
812 if (Tok.
isNot(tok::comma)) {
817 if (Tok.
is(tok::code_completion) &&
826 return DiagResult(diag::err_expected_comma_or_rsquare);
831 if (Tok.
is(tok::code_completion)) {
853 if (Tok.
is(tok::star)) {
855 if (Tok.
is(tok::kw_this)) {
859 return DiagResult(diag::err_expected_star_this_capture);
861 }
else if (Tok.
is(tok::kw_this)) {
865 if (Tok.
is(tok::amp)) {
869 if (Tok.
is(tok::code_completion)) {
877 if (Tok.
is(tok::identifier)) {
880 }
else if (Tok.
is(tok::kw_this)) {
884 return DiagResult(diag::err_this_captured_by_reference);
886 return DiagResult(diag::err_expected_capture);
889 if (Tok.
is(tok::l_paren)) {
891 Parens.consumeOpen();
899 *SkippedInits =
true;
900 }
else if (ParseExpressionList(Exprs, Commas)) {
904 Parens.consumeClose();
906 Parens.getCloseLocation(),
909 }
else if (Tok.
isOneOf(tok::l_brace, tok::equal)) {
922 Init = ParseInitializer();
923 }
else if (Tok.
is(tok::l_brace)) {
925 Braces.consumeOpen();
927 *SkippedInits =
true;
951 Init = ParseInitializer();
959 Tok.
setKind(tok::annot_primary_expr);
960 setExprAnnotation(Tok, Init);
1017 Loc, Kind ==
LCK_ByRef, Id, InitKind, InitExpr);
1020 Intro.
addCapture(Kind, Loc, Id, EllipsisLoc, InitKind, Init,
1026 return DiagResult();
1033 TentativeParsingAction PA(*
this);
1035 bool SkippedInits =
false;
1036 Optional<unsigned> DiagID(ParseLambdaIntroducer(Intro, &SkippedInits));
1047 DiagID = ParseLambdaIntroducer(Intro);
1048 assert(!DiagID &&
"parsing lambda-introducer failed on reparse");
1058 ExprResult Parser::ParseLambdaExpressionAfterIntroducer(
1061 Diag(LambdaBeginLoc, diag::warn_cxx98_compat_lambda);
1064 "lambda expression parsing");
1074 TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
1078 if (Tok.
is(tok::l_paren)) {
1079 ParseScope PrototypeScope(
this,
1094 if (Tok.
isNot(tok::r_paren)) {
1096 ParseParameterDeclarationClause(D,
Attr, ParamInfo, EllipsisLoc);
1100 ++CurTemplateDepthTracker;
1104 DeclEndLoc = RParenLoc;
1108 MaybeParseGNUAttributes(
Attr, &DeclEndLoc);
1112 MaybeParseMicrosoftDeclSpecs(
Attr, &DeclEndLoc);
1117 DeclEndLoc = MutableLoc;
1126 ESpecType = tryParseExceptionSpecification(
false,
1129 DynamicExceptionRanges,
1131 ExceptionSpecTokens);
1134 DeclEndLoc = ESpecRange.
getEnd();
1137 MaybeParseCXX11Attributes(
Attr, &DeclEndLoc);
1142 if (Tok.
is(tok::arrow)) {
1145 TrailingReturnType = ParseTrailingReturnType(Range);
1147 DeclEndLoc = Range.
getEnd();
1150 PrototypeScope.Exit();
1156 ParamInfo.data(), ParamInfo.size(),
1157 EllipsisLoc, RParenLoc,
1158 DS.getTypeQualifiers(),
1165 ESpecType, ESpecRange,
1166 DynamicExceptions.data(),
1167 DynamicExceptionRanges.data(),
1168 DynamicExceptions.size(),
1170 NoexceptExpr.
get() :
nullptr,
1172 LParenLoc, FunLocalRangeEnd, D,
1173 TrailingReturnType),
1175 }
else if (Tok.
isOneOf(tok::kw_mutable, tok::arrow, tok::kw___attribute) ||
1179 unsigned TokKind = 0;
1181 case tok::kw_mutable: TokKind = 0;
break;
1182 case tok::arrow: TokKind = 1;
break;
1183 case tok::kw___attribute:
1184 case tok::l_square: TokKind = 2;
break;
1185 default: llvm_unreachable(
"Unknown token kind");
1188 Diag(Tok, diag::err_lambda_missing_parens)
1197 MaybeParseGNUAttributes(
Attr, &DeclEndLoc);
1201 if (Tok.
is(tok::kw_mutable)) {
1203 DeclEndLoc = MutableLoc;
1207 MaybeParseCXX11Attributes(
Attr, &DeclEndLoc);
1210 if (Tok.
is(tok::arrow)) {
1212 TrailingReturnType = ParseTrailingReturnType(Range);
1214 DeclEndLoc = Range.
getEnd();
1239 DeclLoc, DeclEndLoc, D,
1240 TrailingReturnType),
1248 ParseScope BodyScope(
this, ScopeFlags);
1253 if (!Tok.
is(tok::l_brace)) {
1254 Diag(Tok, diag::err_expected_lambda_body);
1280 const char *CastName =
nullptr;
1283 default: llvm_unreachable(
"Unknown C++ cast!");
1284 case tok::kw_const_cast: CastName =
"const_cast";
break;
1285 case tok::kw_dynamic_cast: CastName =
"dynamic_cast";
break;
1286 case tok::kw_reinterpret_cast: CastName =
"reinterpret_cast";
break;
1287 case tok::kw_static_cast: CastName =
"static_cast";
break;
1295 if (Tok.
is(tok::l_square) && Tok.
getLength() == 2) {
1297 if (Next.
is(tok::colon) && areTokensAdjacent(Tok, Next))
1298 FixDigraph(*
this, PP, Tok, Next, Kind,
true);
1301 if (ExpectAndConsume(tok::less, diag::err_expected_less_after, CastName))
1306 ParseSpecifierQualifierList(DS);
1310 ParseDeclarator(DeclaratorInfo);
1314 if (ExpectAndConsume(tok::greater))
1315 return ExprError(
Diag(LAngleBracketLoc, diag::note_matching) << tok::less);
1320 if (T.expectAndConsume(diag::err_expected_lparen_after, CastName))
1328 if (!Result.
isInvalid() && !DeclaratorInfo.isInvalidType())
1330 LAngleBracketLoc, DeclaratorInfo,
1332 T.getOpenLocation(), Result.
get(),
1333 T.getCloseLocation());
1345 assert(Tok.
is(tok::kw_typeid) &&
"Not 'typeid'!");
1352 if (T.expectAndConsume(diag::err_expected_lparen_after,
"typeid"))
1354 LParenLoc = T.getOpenLocation();
1374 if (isTypeIdInParens()) {
1379 RParenLoc = T.getCloseLocation();
1384 Ty.
get().getAsOpaquePtr(), RParenLoc);
1393 RParenLoc = T.getCloseLocation();
1398 Result.
get(), RParenLoc);
1411 assert(Tok.
is(tok::kw___uuidof) &&
"Not '__uuidof'!");
1417 if (T.expectAndConsume(diag::err_expected_lparen_after,
"__uuidof"))
1422 if (isTypeIdInParens()) {
1431 Result = Actions.
ActOnCXXUuidof(OpLoc, T.getOpenLocation(),
true,
1432 Ty.
get().getAsOpaquePtr(),
1433 T.getCloseLocation());
1446 Result.
get(), T.getCloseLocation());
1482 if (Tok.
is(tok::identifier)) {
1485 assert(Tok.
is(tok::coloncolon) &&
"ParseOptionalCXXScopeSpecifier fail");
1487 }
else if (Tok.
is(tok::annot_template_id)) {
1493 assert(Tok.
is(tok::coloncolon) &&
"ParseOptionalCXXScopeSpecifier fail");
1500 assert(Tok.
is(tok::tilde) &&
"ParseOptionalCXXScopeSpecifier fail");
1503 if (Tok.
is(tok::kw_decltype) && !FirstTypeName.
isValid() && SS.
isEmpty()) {
1505 ParseDecltypeSpecifier(DS);
1512 if (!Tok.
is(tok::identifier)) {
1513 Diag(Tok, diag::err_destructor_tilde_identifier);
1525 if (Tok.
is(tok::less) &&
1528 false, ObjectType, SecondTypeName,
1533 SS, FirstTypeName, CCLoc, TildeLoc,
1552 assert(Tok.
is(tok::kw_throw) &&
"Not throw!");
1578 ExprResult Parser::ParseCoyieldExpression() {
1579 assert(Tok.
is(tok::kw_co_yield) &&
"Not co_yield!");
1595 assert(Tok.
is(tok::kw_this) &&
"Not 'this'!");
1613 Parser::ParseCXXTypeConstructExpression(
const DeclSpec &DS) {
1617 assert((Tok.
is(tok::l_paren) ||
1619 &&
"Expected '(' or '{'!");
1621 if (Tok.
is(tok::l_brace)) {
1625 Expr *InitList = Init.
get();
1634 CommaLocsTy CommaLocs;
1636 if (Tok.
isNot(tok::r_paren)) {
1637 if (ParseExpressionList(Exprs, CommaLocs, [&] {
1654 assert((Exprs.size() == 0 || Exprs.size()-1 == CommaLocs.size())&&
1655 "Unexpected number of commas!");
1658 T.getCloseLocation());
1685 if (Tok.
is(tok::code_completion)) {
1691 ParsedAttributesWithRange attrs(AttrFactory);
1692 MaybeParseCXX11Attributes(attrs);
1695 switch (isCXXConditionDeclarationOrInitStatement(InitStmt)) {
1697 ProhibitAttributes(attrs);
1704 if (InitStmt && Tok.
is(tok::semi)) {
1707 return ParseCXXCondition(
nullptr, Loc, CK);
1718 return ParseCXXCondition(
nullptr, Loc, CK);
1729 ParseSpecifierQualifierList(DS,
AS_none, DSC_condition);
1733 ParseDeclarator(DeclaratorInfo);
1736 if (Tok.
is(tok::kw_asm)) {
1739 if (AsmLabel.isInvalid()) {
1743 DeclaratorInfo.setAsmLabel(AsmLabel.get());
1744 DeclaratorInfo.SetRangeEnd(Loc);
1748 MaybeParseGNUAttributes(DeclaratorInfo);
1759 bool CopyInitialization = isTokenEqualOrEqualTypo();
1760 if (CopyInitialization)
1766 diag::warn_cxx98_compat_generalized_initializer_lists);
1767 InitExpr = ParseBraceInitializer();
1768 }
else if (CopyInitialization) {
1770 }
else if (Tok.
is(tok::l_paren)) {
1774 RParen = ConsumeParen();
1775 Diag(DeclOut->getLocation(),
1776 diag::err_expected_init_in_condition_lparen)
1779 Diag(DeclOut->getLocation(), diag::err_expected_init_in_condition);
1818 void Parser::ParseCXXSimpleTypeSpecifier(
DeclSpec &DS) {
1820 const char *PrevSpec;
1827 case tok::identifier:
1828 case tok::coloncolon:
1829 llvm_unreachable(
"Annotation token should already be formed!");
1831 llvm_unreachable(
"Not a simple-type-specifier token!");
1834 case tok::annot_typename: {
1844 DS.
Finish(Actions, Policy);
1855 case tok::kw___int64:
1858 case tok::kw_signed:
1861 case tok::kw_unsigned:
1873 case tok::kw___int128:
1882 case tok::kw_double:
1885 case tok::kw___float128:
1888 case tok::kw_wchar_t:
1891 case tok::kw_char16_t:
1894 case tok::kw_char32_t:
1900 case tok::annot_decltype:
1901 case tok::kw_decltype:
1903 return DS.
Finish(Actions, Policy);
1906 case tok::kw_typeof:
1907 ParseTypeofSpecifier(DS);
1908 DS.
Finish(Actions, Policy);
1911 if (Tok.
is(tok::annot_typename))
1916 DS.
Finish(Actions, Policy);
1930 bool Parser::ParseCXXTypeSpecifierSeq(
DeclSpec &DS) {
1931 ParseSpecifierQualifierList(DS,
AS_none, DSC_type_specifier);
1968 bool Parser::ParseUnqualifiedIdTemplateId(
CXXScopeSpec &SS,
1972 bool EnteringContext,
1975 bool AssumeTemplateId) {
1976 assert((AssumeTemplateId || Tok.
is(tok::less)) &&
1977 "Expected '<' to finish parsing a template-id");
1985 if (AssumeTemplateId) {
1987 Id, ObjectType, EnteringContext,
1992 bool MemberOfUnknownSpecialization;
1995 ObjectType, EnteringContext, Template,
1996 MemberOfUnknownSpecialization);
1999 ObjectType && IsTemplateArgumentList()) {
2018 SS, TemplateKWLoc, Id,
2019 ObjectType, EnteringContext,
2029 bool MemberOfUnknownSpecialization;
2032 TemplateName, ObjectType,
2033 EnteringContext, Template,
2034 MemberOfUnknownSpecialization);
2040 bool MemberOfUnknownSpecialization;
2044 SS, TemplateKWLoc, TemplateName,
2045 ObjectType, EnteringContext,
2051 TemplateName, ObjectType,
2052 EnteringContext, Template,
2053 MemberOfUnknownSpecialization);
2056 Diag(NameLoc, diag::err_destructor_template_id)
2073 TemplateArgList TemplateArgs;
2074 if (Tok.
is(tok::less) &&
2075 ParseTemplateIdAfterTemplateName(Template, Id.
StartLocation,
2076 SS,
true, LAngleLoc,
2095 TemplateId->
Name =
nullptr;
2100 TemplateId->
SS = SS;
2103 TemplateId->
Kind = TNK;
2107 for (
unsigned Arg = 0, ArgEnd = TemplateArgs.size();
2108 Arg != ArgEnd; ++Arg)
2109 Args[Arg] = TemplateArgs[Arg];
2122 LAngleLoc, TemplateArgsPtr, RAngleLoc,
2175 bool Parser::ParseUnqualifiedIdOperator(
CXXScopeSpec &SS,
bool EnteringContext,
2178 assert(Tok.
is(tok::kw_operator) &&
"Expected 'operator' keyword");
2184 unsigned SymbolIdx = 0;
2189 case tok::kw_delete: {
2190 bool isNew = Tok.
getKind() == tok::kw_new;
2194 if (Tok.
is(tok::l_square) &&
2200 if (T.getCloseLocation().isInvalid())
2203 SymbolLocations[SymbolIdx++] = T.getOpenLocation();
2204 SymbolLocations[SymbolIdx++] = T.getCloseLocation();
2205 Op = isNew? OO_Array_New : OO_Array_Delete;
2207 Op = isNew? OO_New : OO_Delete;
2212 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
2214 SymbolLocations[SymbolIdx++] = ConsumeToken(); \
2217 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
2218 #include "clang/Basic/OperatorKinds.def"
2220 case tok::l_paren: {
2225 if (T.getCloseLocation().isInvalid())
2228 SymbolLocations[SymbolIdx++] = T.getOpenLocation();
2229 SymbolLocations[SymbolIdx++] = T.getCloseLocation();
2234 case tok::l_square: {
2239 if (T.getCloseLocation().isInvalid())
2242 SymbolLocations[SymbolIdx++] = T.getOpenLocation();
2243 SymbolLocations[SymbolIdx++] = T.getCloseLocation();
2248 case tok::code_completion: {
2276 unsigned DiagId = 0;
2282 while (isTokenStringLiteral()) {
2283 if (!Tok.
is(tok::string_literal) && !DiagId) {
2288 DiagId = diag::err_literal_operator_string_prefix;
2290 Toks.push_back(Tok);
2291 TokLocs.push_back(ConsumeStringToken());
2295 if (Literal.hadError)
2302 if (!Literal.getUDSuffix().empty()) {
2306 Literal.getUDSuffixOffset(),
2308 }
else if (Tok.
is(tok::identifier)) {
2311 TokLocs.push_back(SuffixLoc);
2318 if (!Literal.GetString().empty() || Literal.Pascal) {
2323 DiagLoc = TokLocs.front();
2324 DiagId = diag::err_literal_operator_string_not_empty;
2334 SourceRange(TokLocs.front(), TokLocs.back()), Str);
2355 if (ParseCXXTypeSpecifierSeq(DS))
2361 ParseDeclaratorInternal(D,
nullptr);
2370 D.getSourceRange().getEnd());
2405 bool AllowDestructorName,
2406 bool AllowConstructorName,
2413 bool TemplateSpecified =
false;
2415 (ObjectType || SS.
isSet())) {
2416 TemplateSpecified =
true;
2423 if (Tok.
is(tok::identifier)) {
2435 if (AllowConstructorName &&
2449 if (TemplateSpecified || Tok.
is(tok::less))
2450 return ParseUnqualifiedIdTemplateId(SS, TemplateKWLoc, Id, IdLoc,
2451 EnteringContext, ObjectType,
2452 Result, TemplateSpecified);
2459 if (Tok.
is(tok::annot_template_id)) {
2463 if (AllowConstructorName && TemplateId->
Name &&
2471 diag::err_out_of_line_constructor_template_id)
2502 if (Tok.
is(tok::kw_operator)) {
2503 if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType, Result))
2513 (TemplateSpecified || Tok.
is(tok::less)))
2514 return ParseUnqualifiedIdTemplateId(SS, TemplateKWLoc,
2516 EnteringContext, ObjectType,
2517 Result, TemplateSpecified);
2523 (AllowDestructorName || SS.
isSet()) && Tok.
is(tok::tilde)) {
2532 if (SS.
isEmpty() && Tok.
is(tok::kw_decltype)) {
2543 if (Tok.
isNot(tok::identifier)) {
2544 Diag(Tok, diag::err_destructor_tilde_identifier);
2549 DeclaratorScopeObj DeclScopeObj(*
this, SS);
2550 if (!TemplateSpecified &&
NextToken().is(tok::coloncolon)) {
2557 AnnotateScopeToken(SS,
true);
2560 if (ParseOptionalCXXScopeSpecifier(SS, ObjectType, EnteringContext))
2563 ObjectType =
nullptr;
2566 Diag(TildeLoc, diag::err_destructor_tilde_scope);
2571 Diag(TildeLoc, diag::err_destructor_tilde_scope)
2577 DeclScopeObj.EnterDeclaratorScope();
2584 if (TemplateSpecified || Tok.
is(tok::less)) {
2586 return ParseUnqualifiedIdTemplateId(SS, TemplateKWLoc,
2587 ClassName, ClassNameLoc,
2588 EnteringContext, ObjectType,
2589 Result, TemplateSpecified);
2604 Diag(Tok, diag::err_expected_unqualified_id)
2638 Parser::ParseCXXNewExpression(
bool UseGlobal,
SourceLocation Start) {
2639 assert(Tok.
is(tok::kw_new) &&
"expected 'new' token");
2645 ExprVector PlacementArgs;
2651 if (Tok.
is(tok::l_paren)) {
2655 PlacementLParen = T.getOpenLocation();
2656 if (ParseExpressionListOrTypeId(PlacementArgs, DeclaratorInfo)) {
2662 PlacementRParen = T.getCloseLocation();
2668 if (PlacementArgs.empty()) {
2670 TypeIdParens = T.getRange();
2674 if (Tok.
is(tok::l_paren)) {
2677 MaybeParseGNUAttributes(DeclaratorInfo);
2678 ParseSpecifierQualifierList(DS);
2680 ParseDeclarator(DeclaratorInfo);
2682 TypeIdParens = T.getRange();
2684 MaybeParseGNUAttributes(DeclaratorInfo);
2685 if (ParseCXXTypeSpecifierSeq(DS))
2686 DeclaratorInfo.setInvalidType(
true);
2689 ParseDeclaratorInternal(DeclaratorInfo,
2690 &Parser::ParseDirectNewDeclarator);
2697 MaybeParseGNUAttributes(DeclaratorInfo);
2698 if (ParseCXXTypeSpecifierSeq(DS))
2699 DeclaratorInfo.setInvalidType(
true);
2702 ParseDeclaratorInternal(DeclaratorInfo,
2703 &Parser::ParseDirectNewDeclarator);
2706 if (DeclaratorInfo.isInvalidType()) {
2713 if (Tok.
is(tok::l_paren)) {
2715 ExprVector ConstructorArgs;
2718 ConstructorLParen = T.getOpenLocation();
2719 if (Tok.
isNot(tok::r_paren)) {
2720 CommaLocsTy CommaLocs;
2721 if (ParseExpressionList(ConstructorArgs, CommaLocs, [&] {
2723 DeclaratorInfo).
get();
2726 DeclaratorInfo.getLocEnd(),
2734 ConstructorRParen = T.getCloseLocation();
2742 }
else if (Tok.
is(tok::l_brace) &&
getLangOpts().CPlusPlus11) {
2744 diag::warn_cxx98_compat_generalized_initializer_lists);
2745 Initializer = ParseBraceInitializer();
2750 return Actions.
ActOnCXXNew(Start, UseGlobal, PlacementLParen,
2751 PlacementArgs, PlacementRParen,
2752 TypeIdParens, DeclaratorInfo, Initializer.
get());
2762 void Parser::ParseDirectNewDeclarator(
Declarator &D) {
2765 while (Tok.
is(tok::l_square)) {
2767 if (CheckProhibitedCXX11Attribute())
2775 if (Size.isInvalid()) {
2786 MaybeParseCXX11Attributes(Attrs);
2791 T.getOpenLocation(),
2792 T.getCloseLocation()),
2793 Attrs, T.getCloseLocation());
2795 if (T.getCloseLocation().isInvalid())
2810 bool Parser::ParseExpressionListOrTypeId(
2814 if (isTypeIdInParens()) {
2823 CommaLocsTy CommaLocs;
2824 return ParseExpressionList(PlacementArgs, CommaLocs);
2839 Parser::ParseCXXDeleteExpression(
bool UseGlobal,
SourceLocation Start) {
2840 assert(Tok.
is(tok::kw_delete) &&
"Expected 'delete' keyword");
2844 bool ArrayDelete =
false;
2845 if (Tok.
is(tok::l_square) &&
NextToken().
is(tok::r_square)) {
2859 if (T.getCloseLocation().isInvalid())
2863 ExprResult Operand(ParseCastExpression(
false));
2864 if (Operand.isInvalid())
2867 return Actions.
ActOnCXXDelete(Start, UseGlobal, ArrayDelete, Operand.get());
2872 default: llvm_unreachable(
"Not a known type trait");
2873 #define TYPE_TRAIT_1(Spelling, Name, Key) \
2874 case tok::kw_ ## Spelling: return UTT_ ## Name;
2875 #define TYPE_TRAIT_2(Spelling, Name, Key) \
2876 case tok::kw_ ## Spelling: return BTT_ ## Name;
2877 #include "clang/Basic/TokenKinds.def"
2878 #define TYPE_TRAIT_N(Spelling, Name, Key) \
2879 case tok::kw_ ## Spelling: return TT_ ## Name;
2880 #include "clang/Basic/TokenKinds.def"
2886 default: llvm_unreachable(
"Not a known binary type trait");
2894 default: llvm_unreachable(
"Not a known unary expression trait.");
2902 default: llvm_unreachable(
"Not a known type trait");
2903 #define TYPE_TRAIT(N,Spelling,K) case tok::kw_##Spelling: return N;
2904 #include "clang/Basic/TokenKinds.def"
2926 if (Parens.expectAndConsume())
2939 if (Tok.
is(tok::ellipsis)) {
2948 Args.push_back(Ty.
get());
2951 if (Parens.consumeClose())
2956 if (Arity && Args.size() != Arity) {
2957 Diag(EndLoc, diag::err_type_trait_arity)
2958 << Arity << 0 << (Arity > 1) << (
int)Args.size() <<
SourceRange(Loc);
2962 if (!Arity && Args.empty()) {
2963 Diag(EndLoc, diag::err_type_trait_arity)
2964 << 1 << 1 << 1 << (int)Args.size() <<
SourceRange(Loc);
2983 if (T.expectAndConsume())
2997 T.getCloseLocation());
3000 if (ExpectAndConsume(tok::comma)) {
3009 T.getCloseLocation());
3012 llvm_unreachable(
"Invalid ArrayTypeTrait!");
3026 if (T.expectAndConsume())
3034 T.getCloseLocation());
3042 Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType,
3047 assert(ExprType ==
CastExpr &&
"Compound literals are not ambiguous!");
3048 assert(isTypeIdInParens() &&
"Not a type-id!");
3072 ParenParseOption ParseAs;
3077 if (!ConsumeAndStoreUntil(tok::r_paren, Toks)) {
3083 if (Tok.
is(tok::l_brace)) {
3084 ParseAs = CompoundLiteral;
3094 Result = ParseCastExpression(
false,
3103 ParseAs = NotCastExpr ? SimpleExpr :
CastExpr;
3112 Toks.push_back(AttrEnd);
3115 Toks.push_back(Tok);
3118 PP.EnterTokenStream(Toks,
true );
3123 if (ParseAs >= CompoundLiteral) {
3129 ParseSpecifierQualifierList(DS);
3130 ParseDeclarator(DeclaratorInfo);
3141 if (ParseAs == CompoundLiteral) {
3142 ExprType = CompoundLiteral;
3143 if (DeclaratorInfo.isInvalidType())
3147 return ParseCompoundLiteralExpression(Ty.
get(),
3155 if (DeclaratorInfo.isInvalidType())
3161 DeclaratorInfo, CastTy,
3167 assert(ParseAs == SimpleExpr);
3169 ExprType = SimpleExpr;
SourceManager & getSourceManager() const
static TypeTrait TypeTraitFromTokKind(tok::TokenKind kind)
SourceLocation getCloseLocation() const
Defines the clang::ASTContext interface.
SourceLocation getEnd() const
void setConstructorName(ParsedType ClassType, SourceLocation ClassNameLoc, SourceLocation EndLoc)
Specify that this unqualified-id was parsed as a constructor name.
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK)
ExprResult ActOnArrayTypeTrait(ArrayTypeTrait ATT, SourceLocation KWLoc, ParsedType LhsTy, Expr *DimExpr, SourceLocation RParen)
ActOnArrayTypeTrait - Parsed one of the bianry type trait support pseudo-functions.
IdKind getKind() const
Determine what kind of name we have.
ExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, Declarator &D, ParsedType &Ty, SourceLocation RParenLoc, Expr *CastExpr)
Disambiguated as an expression (either kind).
no exception specification
ExprResult ParseExpression(TypeCastState isTypeCast=NotTypeCast)
Simple precedence-based parser for binary/ternary operators.
void restore()
restore - This can be used to restore the state early, before the dtor is run.
This is a scope that corresponds to the parameters within a function prototype.
ConditionResult ActOnConditionVariable(Decl *ConditionVar, SourceLocation StmtLoc, ConditionKind CK)
bool checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Id)
SourceRange getSourceRange() const LLVM_READONLY
Return the source range that covers this unqualified-id.
static const TSS TSS_unsigned
SourceLocation StartLocation
The location of the first token that describes this unqualified-id, which will be the location of the...
IdentifierInfo * Name
FIXME: Temporarily stores the name of a specialization.
const LangOptions & getLangOpts() const
static const TST TST_wchar
ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R, MultiExprArg Val)
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
static ConditionResult ConditionError()
const Token & LookAhead(unsigned N)
Peeks ahead N tokens and returns that token without consuming any tokens.
SourceLocation getSpellingLoc(SourceLocation Loc) const
Given a SourceLocation object, return the spelling location referenced by the ID. ...
IdentifierInfo * Identifier
When Kind == IK_Identifier, the parsed identifier, or when Kind == IK_UserLiteralId, the identifier suffix.
StmtResult ActOnExprStmt(ExprResult Arg)
The current expression is potentially evaluated at run time, which means that code may be generated t...
DeclResult ActOnCXXConditionDeclaration(Scope *S, Declarator &D)
ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a C++ if/switch/while/for statem...
void setEndLoc(SourceLocation Loc)
static const TST TST_char16
Defines the PrettyStackTraceEntry class, which is used to make crashes give more contextual informati...
Defines the C++ template declaration subclasses.
const char * getName() const
static DeclaratorChunk getFunction(bool HasProto, bool IsAmbiguous, SourceLocation LParenLoc, ParamInfo *Params, unsigned NumParams, SourceLocation EllipsisLoc, SourceLocation RParenLoc, unsigned TypeQuals, bool RefQualifierIsLvalueRef, SourceLocation RefQualifierLoc, SourceLocation ConstQualifierLoc, SourceLocation VolatileQualifierLoc, SourceLocation RestrictQualifierLoc, SourceLocation MutableLoc, ExceptionSpecificationType ESpecType, SourceRange ESpecRange, ParsedType *Exceptions, SourceRange *ExceptionRanges, unsigned NumExceptions, Expr *NoexceptExpr, CachedTokens *ExceptionSpecTokens, SourceLocation LocalRangeBegin, SourceLocation LocalRangeEnd, Declarator &TheDeclarator, TypeResult TrailingReturnType=TypeResult())
DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
The base class of the type hierarchy.
This indicates that the scope corresponds to a function, which means that labels are set here...
void CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, bool EnteringContext)
TemplateNameKind Kind
The kind of template that Template refers to.
Parser - This implements a parser for the C family of languages.
ExprResult ActOnExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc, Expr *Queried, SourceLocation RParen)
ActOnExpressionTrait - Parsed one of the unary type trait support pseudo-functions.
void CodeCompleteObjCMessageReceiver(Scope *S)
RAII object that enters a new expression evaluation context.
void EnterToken(const Token &Tok)
Enters a token in the token stream to be lexed next.
Information about one declarator, including the parsed type information and the identifier.
static const TST TST_char
Like System, but searched after the system directories.
void setBegin(SourceLocation b)
SourceLocation getLastCachedTokenLocation() const
Get the location of the last cached token, suitable for setting the end location of an annotation tok...
Describes how types, statements, expressions, and declarations should be printed. ...
ColonProtectionRAIIObject - This sets the Parser::ColonIsSacred bool and restores it when destroyed...
bool isEmpty() const
No scope specifier.
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 ...
Information about a template-id annotation token.
void CodeCompleteOrdinaryName(Scope *S, ParserCompletionContext CompletionContext)
void CodeCompleteConstructor(Scope *S, QualType Type, SourceLocation Loc, ArrayRef< Expr * > Args)
const Token & NextToken()
NextToken - This peeks ahead one token and returns it without consuming it.
Disambiguated as a simple-declaration init-statement.
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Computes the source location just past the end of the token at this source location.
bool TryConsumeToken(tok::TokenKind Expected)
bool ActOnCXXNestedNameSpecifierDecltype(CXXScopeSpec &SS, const DeclSpec &DS, SourceLocation ColonColonLoc)
One of these records is kept for each identifier that is lexed.
void setConstructorTemplateId(TemplateIdAnnotation *TemplateId)
Specify that this unqualified-id was parsed as a template-id that names a constructor.
class LLVM_ALIGNAS(8) DependentTemplateSpecializationType const IdentifierInfo * Name
Represents a template specialization type whose template cannot be resolved, e.g. ...
sema::LambdaScopeInfo * getCurGenericLambda()
Retrieve the current generic lambda info, if any.
void AddTypeInfo(const DeclaratorChunk &TI, ParsedAttributes &attrs, SourceLocation EndLoc)
AddTypeInfo - Add a chunk to this declarator.
void setConversionFunctionId(SourceLocation OperatorLoc, ParsedType Ty, SourceLocation EndLoc)
Specify that this unqualified-id was parsed as a conversion-function-id.
LambdaCaptureKind
The different capture forms in a lambda introducer.
bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS)
OverloadedOperatorKind Operator
The kind of overloaded operator.
TypeResult ActOnTemplateIdType(CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy Template, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc, bool IsCtorOrDtorName=false)
static const TST TST_double
struct OFI OperatorFunctionId
When Kind == IK_OperatorFunctionId, the overloaded operator that we parsed.
ExprResult ActOnCXXUuidof(SourceLocation OpLoc, SourceLocation LParenLoc, bool isType, void *TyOrExpr, SourceLocation RParenLoc)
ActOnCXXUuidof - Parse __uuidof( something ).
Token - This structure provides full information about a lexed token.
void setKind(tok::TokenKind K)
RAII class that helps handle the parsing of an open/close delimiter pair, such as braces { ...
ParsedType getDestructorName(SourceLocation TildeLoc, IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, ParsedType ObjectType, bool EnteringContext)
void SetSourceRange(SourceRange R)
void CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro, bool AfterAmpersand)
UnionParsedType DestructorName
When Kind == IK_DestructorName, the type referred to by the class-name.
This is a scope that corresponds to a block/closure object.
ExprResult ActOnCXXThrow(Scope *S, SourceLocation OpLoc, Expr *expr)
ActOnCXXThrow - Parse throw expressions.
Represents a C++ unqualified-id that has been parsed.
SourceLocation getLocWithOffset(int Offset) const
Return a source location with the specified offset from this SourceLocation.
< Capturing the *this object by copy
void ActOnInitializerError(Decl *Dcl)
ActOnInitializerError - Given that there was an error parsing an initializer for the given declaratio...
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
If a crash happens while one of these objects are live, the message is printed out along with the spe...
void SetInvalid(SourceRange R)
Indicate that this nested-name-specifier is invalid.
ExprResult ActOnCXXThis(SourceLocation loc)
Represents a C++ nested-name-specifier or a global scope specifier.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
ArrayTypeTrait
Names for the array type traits.
tok::TokenKind getKind() const
void setTemplateId(TemplateIdAnnotation *TemplateId)
Specify that this unqualified-id was parsed as a template-id.
static SourceLocation AdvanceToTokenCharacter(SourceLocation TokStart, unsigned Character, const SourceManager &SM, const LangOptions &LangOpts)
AdvanceToTokenCharacter - If the current SourceLocation specifies a location at the start of a token...
SourceRange getSourceRange() const LLVM_READONLY
QualType getCanonicalTypeInternal() const
SourceRange getRange() const
SourceLocation TemplateKWLoc
TemplateKWLoc - The location of the template keyword within the source.
static const TST TST_float
TypeTrait
Names for traits that operate specifically on types.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
void * getAnnotationValue() const
DeclSpec & getMutableDeclSpec()
getMutableDeclSpec - Return a non-const version of the DeclSpec.
static const TSW TSW_long
StmtResult ActOnDeclStmt(DeclGroupPtrTy Decl, SourceLocation StartLoc, SourceLocation EndLoc)
void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit, bool TypeMayContainAuto)
AddInitializerToDecl - Adds the initializer Init to the declaration dcl.
const void * getEofData() const
void SetRangeStart(SourceLocation Loc)
Disambiguated as the declaration form of condition.
TypeResult ParseTypeName(SourceRange *Range=nullptr, Declarator::TheContext Context=Declarator::TypeNameContext, AccessSpecifier AS=AS_none, Decl **OwnedType=nullptr, ParsedAttributes *Attrs=nullptr)
ParseTypeName type-name: [C99 6.7.6] specifier-qualifier-list abstract-declarator[opt].
SmallVector< LambdaCapture, 4 > Captures
SourceRange getAnnotationRange() const
SourceRange of the group of tokens that this annotation token represents.
ExprResult ActOnLambdaExpr(SourceLocation StartLoc, Stmt *Body, Scope *CurScope)
ActOnLambdaExpr - This is called when the body of a lambda expression was successfully completed...
Expr - This represents one expression.
StringRef getName() const
Return the actual identifier string.
bool ActOnCXXGlobalScopeSpecifier(SourceLocation CCLoc, CXXScopeSpec &SS)
The parser has parsed a global nested-name-specifier '::'.
void AnnotateCachedTokens(const Token &Tok)
We notify the Preprocessor that if it is caching tokens (because backtrack is enabled) it should repl...
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, IdentifierInfo **CorrectedII=nullptr)
If the identifier refers to a type name within this scope, return the declaration of that type...
This file defines the classes used to store parsed information about declaration-specifiers and decla...
TypeResult ActOnTypeName(Scope *S, Declarator &D)
void setEofData(const void *D)
void RevertCachedTokens(unsigned N)
When backtracking is enabled and tokens are cached, this allows to revert a specific number of tokens...
ExprResult ActOnPseudoDestructorExpr(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, CXXScopeSpec &SS, UnqualifiedId &FirstTypeName, SourceLocation CCLoc, SourceLocation TildeLoc, UnqualifiedId &SecondTypeName)
OpaquePtr< TemplateName > TemplateTy
Represents a C++ template name within the type system.
SourceLocation getLocation() const
Return a source location identifier for the specified offset in the current file. ...
TemplateNameKind
Specifies the kind of template name that an identifier refers to.
bool isNot(tok::TokenKind K) const
ExprResult ActOnTypeTrait(TypeTrait Kind, SourceLocation KWLoc, ArrayRef< ParsedType > Args, SourceLocation RParenLoc)
Parsed one of the type trait support pseudo-functions.
void setLiteralOperatorId(const IdentifierInfo *Id, SourceLocation OpLoc, SourceLocation IdLoc)
Specific that this unqualified-id was parsed as a literal-operator-id.
bool SetTypeSpecSign(TSS S, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID)
Can't be any of the above!
static const TST TST_half
TemplateNameKind isTemplateName(Scope *S, CXXScopeSpec &SS, bool hasTemplateKeyword, UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool &MemberOfUnknownSpecialization)
ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, bool ArrayForm, Expr *Operand)
ActOnCXXDelete - Parsed a C++ 'delete' expression.
sema::LambdaScopeInfo * PushLambdaScope()
The result type of a method or function.
SourceLocation getAnnotationEndLoc() const
static const TSW TSW_short
ParsedTemplateArgument ActOnPackExpansion(const ParsedTemplateArgument &Arg, SourceLocation EllipsisLoc)
Invoked when parsing a template argument followed by an ellipsis, which creates a pack expansion...
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
const clang::PrintingPolicy & getPrintingPolicy() const
bool SetTypeSpecWidth(TSW 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 isValid() const
Determine whether this unqualified-id refers to a valid name.
OpaquePtr< T > get() const
This is a scope that corresponds to the parameters within a function prototype for a function declara...
ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E)
static const TST TST_char32
ParsedType getDestructorType(const DeclSpec &DS, ParsedType ObjectType)
bool isInvalid() const
Determine whether this unqualified-id refers to an invalid name.
SourceLocation DefaultLoc
Stop skipping at semicolon.
ActionResult - This structure is used while parsing/acting on expressions, stmts, etc...
Represents the parsed form of a C++ template argument.
Encodes a location in the source.
void addCapture(LambdaCaptureKind Kind, SourceLocation Loc, IdentifierInfo *Id, SourceLocation EllipsisLoc, LambdaCaptureInitKind InitKind, ExprResult Init, ParsedType InitCaptureType)
Append a capture in a lambda introducer.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
void setLength(unsigned Len)
An overloaded operator name, e.g., operator+.
void FinalizeDeclaration(Decl *D)
FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform any semantic actions neces...
bool isValid() const
Return true if this is a valid SourceLocation object.
ASTContext & getASTContext() const
void setAnnotationEndLoc(SourceLocation L)
IdentifierTable & getIdentifierTable()
Scope * getCurScope() const
static const TSS TSS_signed
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}_cast's.
void CodeCompleteOperatorName(Scope *S)
void Lex(Token &Result)
Lex the next token for this preprocessor.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
SourceLocation getBegin() const
SourceLocation getBeginLoc() 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)) {...
static DeclaratorChunk getArray(unsigned TypeQuals, bool isStatic, bool isStar, Expr *NumElts, SourceLocation LBLoc, SourceLocation RBLoc)
Return a DeclaratorChunk for an array.
bool ParseUnqualifiedId(CXXScopeSpec &SS, bool EnteringContext, bool AllowDestructorName, bool AllowConstructorName, ParsedType ObjectType, SourceLocation &TemplateKWLoc, UnqualifiedId &Result)
Parse a C++ unqualified-id (or a C identifier), which describes the name of an entity.
ExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, Declarator &D, Expr *Initializer)
ActOnCXXNew - Parsed a C++ 'new' expression.
MutableArrayRef< Expr * > MultiExprArg
static void FixDigraph(Parser &P, Preprocessor &PP, Token &DigraphToken, Token &ColonToken, tok::TokenKind Kind, bool AtDigraph)
bool containsPlaceholderType() const
SourceLocation getOpenLocation() const
bool ActOnCXXNestedNameSpecifier(Scope *S, IdentifierInfo &Identifier, SourceLocation IdentifierLoc, SourceLocation CCLoc, ParsedType ObjectType, bool EnteringContext, CXXScopeSpec &SS, bool ErrorRecoveryLookup=false, bool *IsCorrectedToColon=nullptr)
The parser has parsed a nested-name-specifier 'identifier::'.
The name does not refer to a template.
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...
LambdaCaptureDefault Default
bool IsInvalidUnlessNestedName(Scope *S, CXXScopeSpec &SS, IdentifierInfo &Identifier, SourceLocation IdentifierLoc, SourceLocation ColonLoc, ParsedType ObjectType, bool EnteringContext)
IsInvalidUnlessNestedName - This method is used for error recovery purposes to determine whether the ...
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
static const TST TST_void
CXXScopeSpec SS
The nested-name-specifier that precedes the template name.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
static const TST TST_int128
void RecordParsingTemplateParameterDepth(unsigned Depth)
This is used to inform Sema what the current TemplateParameterDepth is during Parsing.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
SourceLocation getLocEnd() const LLVM_READONLY
bool ActOnSuperScopeSpecifier(SourceLocation SuperLoc, SourceLocation ColonColonLoc, CXXScopeSpec &SS)
The parser has parsed a '__super' nested-name-specifier.
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...
Not an overloaded operator.
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
bool isOneOf(tok::TokenKind K1, tok::TokenKind K2) const
void ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro, Declarator &ParamInfo, Scope *CurScope)
ActOnStartOfLambdaDefinition - This is called just before we start parsing the body of a lambda; it a...
void takeAttributesFrom(ParsedAttributes &attrs)
DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
void RestoreNestedNameSpecifierAnnotation(void *Annotation, SourceRange AnnotationRange, CXXScopeSpec &SS)
Given an annotation pointer for a nested-name-specifier, restore the nested-name-specifier structure...
OverloadedOperatorKind Operator
FIXME: Temporarily stores the overloaded operator kind.
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword...
ExprResult ActOnCXXBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind)
ActOnCXXBoolLiteral - Parse {true,false} literals.
ExprResult ActOnCXXTypeConstructExpr(ParsedType TypeRep, SourceLocation LParenLoc, MultiExprArg Exprs, SourceLocation RParenLoc)
ActOnCXXTypeConstructExpr - Parse construction of a specified type.
void setOperatorFunctionId(SourceLocation OperatorLoc, OverloadedOperatorKind Op, SourceLocation SymbolLocations[3])
Specify that this unqualified-id was parsed as an operator-function-id.
static const TST TST_typename
ActionResult< Stmt * > StmtResult
ExprResult ParseAssignmentExpression(TypeCastState isTypeCast=NotTypeCast)
Parse an expr that doesn't include (top-level) commas.
ExprResult ActOnCXXTypeid(SourceLocation OpLoc, SourceLocation LParenLoc, bool isType, void *TyOrExpr, SourceLocation RParenLoc)
ActOnCXXTypeid - Parse typeid( something ).
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
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.
ExprResult ActOnCoyieldExpr(Scope *S, SourceLocation KwLoc, Expr *E)
Capturing the *this object by reference.
This is a scope that can contain a declaration.
bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool HasTrailingLParen, bool IsAddressOfOperand, std::unique_ptr< CorrectionCandidateCallback > CCC=nullptr, bool IsInlineAsmIdentifier=false, Token *KeywordReplacement=nullptr)
static ParsedType getTypeAnnotation(Token &Tok)
getTypeAnnotation - Read a parsed type out of an annotation token.
ExprResult ParseConstantExpression(TypeCastState isTypeCast=NotTypeCast)
TemplateNameKind ActOnDependentTemplateName(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template)
Form a dependent template name.
Captures information about "declaration specifiers".
void setEnd(SourceLocation e)
bool isNonTypeNestedNameSpecifier(Scope *S, CXXScopeSpec &SS, SourceLocation IdLoc, IdentifierInfo &II, ParsedType ObjectType)
SourceLocation ConsumeToken()
ConsumeToken - Consume the current 'peek token' and lex the next one.
static ExpressionTrait ExpressionTraitFromTokKind(tok::TokenKind kind)
A user-defined literal name, e.g., operator "" _i.
static TemplateIdAnnotation * Allocate(unsigned NumArgs, SmallVectorImpl< TemplateIdAnnotation * > &List)
Creates a new TemplateIdAnnotation with NumArgs arguments and appends it to List. ...
static int SelectDigraphErrorMessage(tok::TokenKind Kind)
static const TST TST_float128
static const TST TST_bool
StringLiteralParser - This decodes string escape characters and performs wide string analysis and Tra...
unsigned kind
All of the diagnostics that can be emitted by the frontend.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string...
void Finish(Sema &S, const PrintingPolicy &Policy)
Finish - This does final analysis of the declspec, issuing diagnostics for things like "_Imaginary" (...
Represents a complete lambda introducer.
static const TSW TSW_longlong
bool isSet() const
Deprecated.
Code completion occurs within the condition of an if, while, switch, or for statement.
unsigned getLength() const
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7)...
static unsigned TypeTraitArity(tok::TokenKind kind)
void setLocation(SourceLocation L)
A trivial tuple used to represent a source range.
void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Specify that this unqualified-id was parsed as an identifier.
bool isInvalidType() const
unsigned NumArgs
NumArgs - The number of template arguments.
void setDestructorName(SourceLocation TildeLoc, ParsedType ClassType, SourceLocation EndLoc)
Specify that this unqualified-id was parsed as a destructor name.
void SetRangeEnd(SourceLocation Loc)
ParsedAttributes - A collection of parsed attributes.
This class handles loading and caching of source files into memory.
static ArrayTypeTrait ArrayTypeTraitFromTokKind(tok::TokenKind kind)
Attr - This represents one attribute.
void startToken()
Reset all flags to cleared.
ParsedType actOnLambdaInitCaptureInitialization(SourceLocation Loc, bool ByRef, IdentifierInfo *Id, LambdaCaptureInitKind InitKind, Expr *&Init)
Perform initialization analysis of the init-capture and perform any implicit conversions such as an l...
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Stop skipping at specified token, but don't skip the token itself.
IdentifierInfo * getIdentifierInfo() const