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) {
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;
593 Token &Replacement) {
605 if (isAddressOfOperand && isPostfixExpressionSuffixStart())
606 isAddressOfOperand =
false;
609 Tok.
is(tok::l_paren), isAddressOfOperand,
656 ExprResult Parser::ParseCXXIdExpression(
bool isAddressOfOperand) {
662 ParseOptionalCXXScopeSpecifier(SS,
ParsedType(),
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.");
745 if (Next.is(tok::r_square) ||
746 Next.is(tok::equal) ||
747 (Next.is(tok::amp) &&
748 (
After.is(tok::r_square) ||
749 After.is(tok::comma))) ||
750 (Next.is(tok::identifier) &&
751 After.is(tok::r_square))) {
752 return ParseLambdaExpression();
757 if (Next.is(tok::identifier) &&
After.is(tok::identifier)) {
768 if (TryParseLambdaIntroducer(Intro))
771 return ParseLambdaExpressionAfterIntroducer(Intro);
784 bool *SkippedInits) {
785 typedef Optional<unsigned> DiagResult;
787 assert(Tok.
is(tok::l_square) &&
"Lambda expressions begin with '['.");
796 if (Tok.
is(tok::amp) &&
801 }
else if (Tok.
is(tok::equal)) {
807 while (Tok.
isNot(tok::r_square)) {
809 if (Tok.
isNot(tok::comma)) {
814 if (Tok.
is(tok::code_completion) &&
823 return DiagResult(diag::err_expected_comma_or_rsquare);
828 if (Tok.
is(tok::code_completion)) {
849 if (Tok.
is(tok::kw_this)) {
853 if (Tok.
is(tok::amp)) {
857 if (Tok.
is(tok::code_completion)) {
865 if (Tok.
is(tok::identifier)) {
868 }
else if (Tok.
is(tok::kw_this)) {
872 return DiagResult(diag::err_this_captured_by_reference);
874 return DiagResult(diag::err_expected_capture);
877 if (Tok.
is(tok::l_paren)) {
879 Parens.consumeOpen();
885 *SkippedInits =
true;
886 }
else if (ParseExpressionList(Exprs, Commas)) {
890 Parens.consumeClose();
892 Parens.getCloseLocation(),
895 }
else if (Tok.
isOneOf(tok::l_brace, tok::equal)) {
905 if (!HadEquals && Tok.
is(tok::l_brace)) {
906 Diag(Tok, diag::warn_init_capture_direct_list_init)
909 Init = ParseInitializer();
910 }
else if (Tok.
is(tok::l_brace)) {
912 Braces.consumeOpen();
914 *SkippedInits =
true;
938 Init = ParseInitializer();
946 Tok.
setKind(tok::annot_primary_expr);
947 setExprAnnotation(Tok, Init);
1006 InitCaptureParsedType.
set(InitCaptureType);
1008 Intro.
addCapture(Kind, Loc, Id, EllipsisLoc, Init, InitCaptureParsedType);
1013 return DiagResult();
1020 TentativeParsingAction PA(*
this);
1022 bool SkippedInits =
false;
1023 Optional<unsigned> DiagID(ParseLambdaIntroducer(Intro, &SkippedInits));
1034 DiagID = ParseLambdaIntroducer(Intro);
1035 assert(!DiagID &&
"parsing lambda-introducer failed on reparse");
1045 ExprResult Parser::ParseLambdaExpressionAfterIntroducer(
1048 Diag(LambdaBeginLoc, diag::warn_cxx98_compat_lambda);
1051 "lambda expression parsing");
1061 TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
1065 if (Tok.
is(tok::l_paren)) {
1066 ParseScope PrototypeScope(
this,
1081 if (Tok.
isNot(tok::r_paren)) {
1083 ParseParameterDeclarationClause(D,
Attr, ParamInfo, EllipsisLoc);
1087 ++CurTemplateDepthTracker;
1091 DeclEndLoc = RParenLoc;
1095 MaybeParseGNUAttributes(
Attr, &DeclEndLoc);
1099 MaybeParseMicrosoftDeclSpecs(
Attr, &DeclEndLoc);
1104 DeclEndLoc = MutableLoc;
1113 ESpecType = tryParseExceptionSpecification(
false,
1116 DynamicExceptionRanges,
1118 ExceptionSpecTokens);
1121 DeclEndLoc = ESpecRange.
getEnd();
1124 MaybeParseCXX11Attributes(
Attr, &DeclEndLoc);
1129 if (Tok.
is(tok::arrow)) {
1132 TrailingReturnType = ParseTrailingReturnType(Range);
1134 DeclEndLoc = Range.
getEnd();
1137 PrototypeScope.Exit();
1143 ParamInfo.data(), ParamInfo.size(),
1144 EllipsisLoc, RParenLoc,
1145 DS.getTypeQualifiers(),
1153 DynamicExceptions.data(),
1154 DynamicExceptionRanges.data(),
1155 DynamicExceptions.size(),
1157 NoexceptExpr.
get() :
nullptr,
1159 LParenLoc, FunLocalRangeEnd, D,
1160 TrailingReturnType),
1162 }
else if (Tok.
isOneOf(tok::kw_mutable, tok::arrow, tok::kw___attribute) ||
1166 unsigned TokKind = 0;
1168 case tok::kw_mutable: TokKind = 0;
break;
1169 case tok::arrow: TokKind = 1;
break;
1170 case tok::kw___attribute:
1171 case tok::l_square: TokKind = 2;
break;
1172 default: llvm_unreachable(
"Unknown token kind");
1175 Diag(Tok, diag::err_lambda_missing_parens)
1184 MaybeParseGNUAttributes(
Attr, &DeclEndLoc);
1188 if (Tok.
is(tok::kw_mutable)) {
1190 DeclEndLoc = MutableLoc;
1194 MaybeParseCXX11Attributes(
Attr, &DeclEndLoc);
1197 if (Tok.
is(tok::arrow)) {
1199 TrailingReturnType = ParseTrailingReturnType(Range);
1201 DeclEndLoc = Range.
getEnd();
1226 DeclLoc, DeclEndLoc, D,
1227 TrailingReturnType),
1235 ParseScope BodyScope(
this, ScopeFlags);
1240 if (!Tok.
is(tok::l_brace)) {
1241 Diag(Tok, diag::err_expected_lambda_body);
1267 const char *CastName =
nullptr;
1270 default: llvm_unreachable(
"Unknown C++ cast!");
1271 case tok::kw_const_cast: CastName =
"const_cast";
break;
1272 case tok::kw_dynamic_cast: CastName =
"dynamic_cast";
break;
1273 case tok::kw_reinterpret_cast: CastName =
"reinterpret_cast";
break;
1274 case tok::kw_static_cast: CastName =
"static_cast";
break;
1282 if (Tok.
is(tok::l_square) && Tok.
getLength() == 2) {
1284 if (Next.
is(tok::colon) && areTokensAdjacent(Tok, Next))
1285 FixDigraph(*
this, PP, Tok, Next, Kind,
true);
1288 if (ExpectAndConsume(tok::less, diag::err_expected_less_after, CastName))
1293 ParseSpecifierQualifierList(DS);
1297 ParseDeclarator(DeclaratorInfo);
1301 if (ExpectAndConsume(tok::greater))
1302 return ExprError(
Diag(LAngleBracketLoc, diag::note_matching) << tok::less);
1307 if (T.expectAndConsume(diag::err_expected_lparen_after, CastName))
1315 if (!Result.
isInvalid() && !DeclaratorInfo.isInvalidType())
1317 LAngleBracketLoc, DeclaratorInfo,
1319 T.getOpenLocation(), Result.
get(),
1320 T.getCloseLocation());
1332 assert(Tok.
is(tok::kw_typeid) &&
"Not 'typeid'!");
1339 if (T.expectAndConsume(diag::err_expected_lparen_after,
"typeid"))
1341 LParenLoc = T.getOpenLocation();
1361 if (isTypeIdInParens()) {
1366 RParenLoc = T.getCloseLocation();
1371 Ty.
get().getAsOpaquePtr(), RParenLoc);
1380 RParenLoc = T.getCloseLocation();
1385 Result.
get(), RParenLoc);
1398 assert(Tok.
is(tok::kw___uuidof) &&
"Not '__uuidof'!");
1404 if (T.expectAndConsume(diag::err_expected_lparen_after,
"__uuidof"))
1409 if (isTypeIdInParens()) {
1418 Result = Actions.
ActOnCXXUuidof(OpLoc, T.getOpenLocation(),
true,
1419 Ty.
get().getAsOpaquePtr(),
1420 T.getCloseLocation());
1433 Result.
get(), T.getCloseLocation());
1469 if (Tok.
is(tok::identifier)) {
1472 assert(Tok.
is(tok::coloncolon) &&
"ParseOptionalCXXScopeSpecifier fail");
1474 }
else if (Tok.
is(tok::annot_template_id)) {
1480 assert(Tok.
is(tok::coloncolon) &&
"ParseOptionalCXXScopeSpecifier fail");
1487 assert(Tok.
is(tok::tilde) &&
"ParseOptionalCXXScopeSpecifier fail");
1490 if (Tok.
is(tok::kw_decltype) && !FirstTypeName.
isValid() && SS.
isEmpty()) {
1492 ParseDecltypeSpecifier(DS);
1499 if (!Tok.
is(tok::identifier)) {
1500 Diag(Tok, diag::err_destructor_tilde_identifier);
1512 if (Tok.
is(tok::less) &&
1515 false, ObjectType, SecondTypeName,
1520 SS, FirstTypeName, CCLoc, TildeLoc,
1539 assert(Tok.
is(tok::kw_throw) &&
"Not throw!");
1567 assert(Tok.
is(tok::kw_this) &&
"Not 'this'!");
1585 Parser::ParseCXXTypeConstructExpression(
const DeclSpec &DS) {
1589 assert((Tok.
is(tok::l_paren) ||
1591 &&
"Expected '(' or '{'!");
1593 if (Tok.
is(tok::l_brace)) {
1606 CommaLocsTy CommaLocs;
1608 if (Tok.
isNot(tok::r_paren)) {
1609 if (ParseExpressionList(Exprs, CommaLocs, [&] {
1626 assert((Exprs.size() == 0 || Exprs.size()-1 == CommaLocs.size())&&
1627 "Unexpected number of commas!");
1630 T.getCloseLocation());
1657 bool Parser::ParseCXXCondition(
ExprResult &ExprOut,
1660 bool ConvertToBoolean) {
1661 if (Tok.
is(tok::code_completion)) {
1667 ParsedAttributesWithRange attrs(AttrFactory);
1668 MaybeParseCXX11Attributes(attrs);
1670 if (!isCXXConditionDeclaration()) {
1671 ProhibitAttributes(attrs);
1680 if (ConvertToBoolean)
1689 ParseSpecifierQualifierList(DS,
AS_none, DSC_condition);
1693 ParseDeclarator(DeclaratorInfo);
1696 if (Tok.
is(tok::kw_asm)) {
1699 if (AsmLabel.isInvalid()) {
1703 DeclaratorInfo.setAsmLabel(AsmLabel.get());
1704 DeclaratorInfo.SetRangeEnd(Loc);
1708 MaybeParseGNUAttributes(DeclaratorInfo);
1713 DeclOut = Dcl.
get();
1718 bool CopyInitialization = isTokenEqualOrEqualTypo();
1719 if (CopyInitialization)
1725 diag::warn_cxx98_compat_generalized_initializer_lists);
1726 InitExpr = ParseBraceInitializer();
1727 }
else if (CopyInitialization) {
1729 }
else if (Tok.
is(tok::l_paren)) {
1733 RParen = ConsumeParen();
1735 diag::err_expected_init_in_condition_lparen)
1739 diag::err_expected_init_in_condition);
1782 void Parser::ParseCXXSimpleTypeSpecifier(
DeclSpec &DS) {
1784 const char *PrevSpec;
1791 case tok::identifier:
1792 case tok::coloncolon:
1793 llvm_unreachable(
"Annotation token should already be formed!");
1795 llvm_unreachable(
"Not a simple-type-specifier token!");
1798 case tok::annot_typename: {
1808 DS.
Finish(Diags, PP, Policy);
1819 case tok::kw___int64:
1822 case tok::kw_signed:
1825 case tok::kw_unsigned:
1837 case tok::kw___int128:
1846 case tok::kw_double:
1849 case tok::kw_wchar_t:
1852 case tok::kw_char16_t:
1855 case tok::kw_char32_t:
1861 case tok::annot_decltype:
1862 case tok::kw_decltype:
1864 return DS.
Finish(Diags, PP, Policy);
1867 case tok::kw_typeof:
1868 ParseTypeofSpecifier(DS);
1869 DS.
Finish(Diags, PP, Policy);
1872 if (Tok.
is(tok::annot_typename))
1877 DS.
Finish(Diags, PP, Policy);
1891 bool Parser::ParseCXXTypeSpecifierSeq(
DeclSpec &DS) {
1892 ParseSpecifierQualifierList(DS,
AS_none, DSC_type_specifier);
1929 bool Parser::ParseUnqualifiedIdTemplateId(
CXXScopeSpec &SS,
1933 bool EnteringContext,
1936 bool AssumeTemplateId) {
1937 assert((AssumeTemplateId || Tok.
is(tok::less)) &&
1938 "Expected '<' to finish parsing a template-id");
1946 if (AssumeTemplateId) {
1948 Id, ObjectType, EnteringContext,
1953 bool MemberOfUnknownSpecialization;
1956 ObjectType, EnteringContext, Template,
1957 MemberOfUnknownSpecialization);
1960 ObjectType && IsTemplateArgumentList()) {
1979 SS, TemplateKWLoc, Id,
1980 ObjectType, EnteringContext,
1990 bool MemberOfUnknownSpecialization;
1993 TemplateName, ObjectType,
1994 EnteringContext, Template,
1995 MemberOfUnknownSpecialization);
2001 bool MemberOfUnknownSpecialization;
2005 SS, TemplateKWLoc, TemplateName,
2006 ObjectType, EnteringContext,
2012 TemplateName, ObjectType,
2013 EnteringContext, Template,
2014 MemberOfUnknownSpecialization);
2017 Diag(NameLoc, diag::err_destructor_template_id)
2034 TemplateArgList TemplateArgs;
2035 if (Tok.
is(tok::less) &&
2036 ParseTemplateIdAfterTemplateName(Template, Id.
StartLocation,
2037 SS,
true, LAngleLoc,
2056 TemplateId->
Name =
nullptr;
2061 TemplateId->
SS = SS;
2064 TemplateId->
Kind = TNK;
2068 for (
unsigned Arg = 0, ArgEnd = TemplateArgs.size();
2069 Arg != ArgEnd; ++Arg)
2070 Args[Arg] = TemplateArgs[Arg];
2083 LAngleLoc, TemplateArgsPtr, RAngleLoc,
2136 bool Parser::ParseUnqualifiedIdOperator(
CXXScopeSpec &SS,
bool EnteringContext,
2139 assert(Tok.
is(tok::kw_operator) &&
"Expected 'operator' keyword");
2145 unsigned SymbolIdx = 0;
2150 case tok::kw_delete: {
2151 bool isNew = Tok.
getKind() == tok::kw_new;
2155 if (Tok.
is(tok::l_square) &&
2161 if (T.getCloseLocation().isInvalid())
2164 SymbolLocations[SymbolIdx++] = T.getOpenLocation();
2165 SymbolLocations[SymbolIdx++] = T.getCloseLocation();
2166 Op = isNew? OO_Array_New : OO_Array_Delete;
2168 Op = isNew? OO_New : OO_Delete;
2173 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
2175 SymbolLocations[SymbolIdx++] = ConsumeToken(); \
2178 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
2179 #include "clang/Basic/OperatorKinds.def"
2181 case tok::l_paren: {
2186 if (T.getCloseLocation().isInvalid())
2189 SymbolLocations[SymbolIdx++] = T.getOpenLocation();
2190 SymbolLocations[SymbolIdx++] = T.getCloseLocation();
2195 case tok::l_square: {
2200 if (T.getCloseLocation().isInvalid())
2203 SymbolLocations[SymbolIdx++] = T.getOpenLocation();
2204 SymbolLocations[SymbolIdx++] = T.getCloseLocation();
2209 case tok::code_completion: {
2237 unsigned DiagId = 0;
2243 while (isTokenStringLiteral()) {
2244 if (!Tok.
is(tok::string_literal) && !DiagId) {
2249 DiagId = diag::err_literal_operator_string_prefix;
2251 Toks.push_back(Tok);
2252 TokLocs.push_back(ConsumeStringToken());
2256 if (Literal.hadError)
2263 if (!Literal.getUDSuffix().empty()) {
2267 Literal.getUDSuffixOffset(),
2269 }
else if (Tok.
is(tok::identifier)) {
2272 TokLocs.push_back(SuffixLoc);
2279 if (!Literal.GetString().empty() || Literal.Pascal) {
2284 DiagLoc = TokLocs.front();
2285 DiagId = diag::err_literal_operator_string_not_empty;
2295 SourceRange(TokLocs.front(), TokLocs.back()), Str);
2316 if (ParseCXXTypeSpecifierSeq(DS))
2322 ParseDeclaratorInternal(D,
nullptr);
2331 D.getSourceRange().getEnd());
2366 bool AllowDestructorName,
2367 bool AllowConstructorName,
2374 bool TemplateSpecified =
false;
2376 (ObjectType || SS.
isSet())) {
2377 TemplateSpecified =
true;
2384 if (Tok.
is(tok::identifier)) {
2396 if (AllowConstructorName &&
2411 if (TemplateSpecified || Tok.
is(tok::less))
2412 return ParseUnqualifiedIdTemplateId(SS, TemplateKWLoc, Id, IdLoc,
2413 EnteringContext, ObjectType,
2414 Result, TemplateSpecified);
2421 if (Tok.
is(tok::annot_template_id)) {
2425 if (AllowConstructorName && TemplateId->
Name &&
2433 diag::err_out_of_line_constructor_template_id)
2466 if (Tok.
is(tok::kw_operator)) {
2467 if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType, Result))
2477 (TemplateSpecified || Tok.
is(tok::less)))
2478 return ParseUnqualifiedIdTemplateId(SS, TemplateKWLoc,
2480 EnteringContext, ObjectType,
2481 Result, TemplateSpecified);
2487 (AllowDestructorName || SS.
isSet()) && Tok.
is(tok::tilde)) {
2496 if (SS.
isEmpty() && Tok.
is(tok::kw_decltype)) {
2507 if (Tok.
isNot(tok::identifier)) {
2508 Diag(Tok, diag::err_destructor_tilde_identifier);
2513 DeclaratorScopeObj DeclScopeObj(*
this, SS);
2514 if (!TemplateSpecified &&
NextToken().is(tok::coloncolon)) {
2521 AnnotateScopeToken(SS,
true);
2524 if (ParseOptionalCXXScopeSpecifier(SS, ObjectType, EnteringContext))
2530 Diag(TildeLoc, diag::err_destructor_tilde_scope);
2535 Diag(TildeLoc, diag::err_destructor_tilde_scope)
2541 DeclScopeObj.EnterDeclaratorScope();
2548 if (TemplateSpecified || Tok.
is(tok::less)) {
2550 return ParseUnqualifiedIdTemplateId(SS, TemplateKWLoc,
2551 ClassName, ClassNameLoc,
2552 EnteringContext, ObjectType,
2553 Result, TemplateSpecified);
2568 Diag(Tok, diag::err_expected_unqualified_id)
2602 Parser::ParseCXXNewExpression(
bool UseGlobal,
SourceLocation Start) {
2603 assert(Tok.
is(tok::kw_new) &&
"expected 'new' token");
2609 ExprVector PlacementArgs;
2615 if (Tok.
is(tok::l_paren)) {
2619 PlacementLParen = T.getOpenLocation();
2620 if (ParseExpressionListOrTypeId(PlacementArgs, DeclaratorInfo)) {
2626 PlacementRParen = T.getCloseLocation();
2632 if (PlacementArgs.empty()) {
2634 TypeIdParens = T.getRange();
2638 if (Tok.
is(tok::l_paren)) {
2641 MaybeParseGNUAttributes(DeclaratorInfo);
2642 ParseSpecifierQualifierList(DS);
2644 ParseDeclarator(DeclaratorInfo);
2646 TypeIdParens = T.getRange();
2648 MaybeParseGNUAttributes(DeclaratorInfo);
2649 if (ParseCXXTypeSpecifierSeq(DS))
2650 DeclaratorInfo.setInvalidType(
true);
2653 ParseDeclaratorInternal(DeclaratorInfo,
2654 &Parser::ParseDirectNewDeclarator);
2661 MaybeParseGNUAttributes(DeclaratorInfo);
2662 if (ParseCXXTypeSpecifierSeq(DS))
2663 DeclaratorInfo.setInvalidType(
true);
2666 ParseDeclaratorInternal(DeclaratorInfo,
2667 &Parser::ParseDirectNewDeclarator);
2670 if (DeclaratorInfo.isInvalidType()) {
2677 if (Tok.
is(tok::l_paren)) {
2679 ExprVector ConstructorArgs;
2682 ConstructorLParen = T.getOpenLocation();
2683 if (Tok.
isNot(tok::r_paren)) {
2684 CommaLocsTy CommaLocs;
2685 if (ParseExpressionList(ConstructorArgs, CommaLocs, [&] {
2687 DeclaratorInfo).
get();
2690 DeclaratorInfo.getLocEnd(),
2698 ConstructorRParen = T.getCloseLocation();
2706 }
else if (Tok.
is(tok::l_brace) &&
getLangOpts().CPlusPlus11) {
2708 diag::warn_cxx98_compat_generalized_initializer_lists);
2709 Initializer = ParseBraceInitializer();
2714 return Actions.
ActOnCXXNew(Start, UseGlobal, PlacementLParen,
2715 PlacementArgs, PlacementRParen,
2716 TypeIdParens, DeclaratorInfo, Initializer.
get());
2726 void Parser::ParseDirectNewDeclarator(
Declarator &D) {
2729 while (Tok.
is(tok::l_square)) {
2731 if (CheckProhibitedCXX11Attribute())
2739 if (Size.isInvalid()) {
2750 MaybeParseCXX11Attributes(Attrs);
2755 T.getOpenLocation(),
2756 T.getCloseLocation()),
2757 Attrs, T.getCloseLocation());
2759 if (T.getCloseLocation().isInvalid())
2774 bool Parser::ParseExpressionListOrTypeId(
2778 if (isTypeIdInParens()) {
2787 CommaLocsTy CommaLocs;
2788 return ParseExpressionList(PlacementArgs, CommaLocs);
2803 Parser::ParseCXXDeleteExpression(
bool UseGlobal,
SourceLocation Start) {
2804 assert(Tok.
is(tok::kw_delete) &&
"Expected 'delete' keyword");
2808 bool ArrayDelete =
false;
2809 if (Tok.
is(tok::l_square) &&
NextToken().
is(tok::r_square)) {
2823 if (T.getCloseLocation().isInvalid())
2827 ExprResult Operand(ParseCastExpression(
false));
2828 if (Operand.isInvalid())
2831 return Actions.
ActOnCXXDelete(Start, UseGlobal, ArrayDelete, Operand.get());
2836 default: llvm_unreachable(
"Not a known type trait");
2837 #define TYPE_TRAIT_1(Spelling, Name, Key) \
2838 case tok::kw_ ## Spelling: return UTT_ ## Name;
2839 #define TYPE_TRAIT_2(Spelling, Name, Key) \
2840 case tok::kw_ ## Spelling: return BTT_ ## Name;
2841 #include "clang/Basic/TokenKinds.def"
2842 #define TYPE_TRAIT_N(Spelling, Name, Key) \
2843 case tok::kw_ ## Spelling: return TT_ ## Name;
2844 #include "clang/Basic/TokenKinds.def"
2850 default: llvm_unreachable(
"Not a known binary type trait");
2858 default: llvm_unreachable(
"Not a known unary expression trait.");
2866 default: llvm_unreachable(
"Not a known type trait");
2867 #define TYPE_TRAIT(N,Spelling,K) case tok::kw_##Spelling: return N;
2868 #include "clang/Basic/TokenKinds.def"
2890 if (Parens.expectAndConsume())
2903 if (Tok.
is(tok::ellipsis)) {
2912 Args.push_back(Ty.
get());
2915 if (Parens.consumeClose())
2920 if (Arity && Args.size() != Arity) {
2921 Diag(EndLoc, diag::err_type_trait_arity)
2922 << Arity << 0 << (Arity > 1) << (
int)Args.size() <<
SourceRange(Loc);
2926 if (!Arity && Args.empty()) {
2927 Diag(EndLoc, diag::err_type_trait_arity)
2928 << 1 << 1 << 1 << (int)Args.size() <<
SourceRange(Loc);
2947 if (T.expectAndConsume())
2961 T.getCloseLocation());
2964 if (ExpectAndConsume(tok::comma)) {
2973 T.getCloseLocation());
2976 llvm_unreachable(
"Invalid ArrayTypeTrait!");
2990 if (T.expectAndConsume())
2998 T.getCloseLocation());
3006 Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType,
3011 assert(ExprType ==
CastExpr &&
"Compound literals are not ambiguous!");
3012 assert(isTypeIdInParens() &&
"Not a type-id!");
3036 ParenParseOption ParseAs;
3041 if (!ConsumeAndStoreUntil(tok::r_paren, Toks)) {
3047 if (Tok.
is(tok::l_brace)) {
3048 ParseAs = CompoundLiteral;
3058 Result = ParseCastExpression(
false,
3067 ParseAs = NotCastExpr ? SimpleExpr :
CastExpr;
3071 Toks.push_back(Tok);
3080 if (ParseAs >= CompoundLiteral) {
3086 ParseSpecifierQualifierList(DS);
3087 ParseDeclarator(DeclaratorInfo);
3094 if (ParseAs == CompoundLiteral) {
3095 ExprType = CompoundLiteral;
3096 if (DeclaratorInfo.isInvalidType())
3100 return ParseCompoundLiteralExpression(Ty.
get(),
3108 if (DeclaratorInfo.isInvalidType())
3114 DeclaratorInfo, CastTy,
3120 assert(ParseAs == SimpleExpr);
3122 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.
ExprResult ActOnArrayTypeTrait(ArrayTypeTrait ATT, SourceLocation KWLoc, ParsedType LhsTy, Expr *DimExpr, SourceLocation RParen)
IdKind getKind() const
Determine what kind of name we have.
ExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, Declarator &D, ParsedType &Ty, SourceLocation RParenLoc, Expr *CastExpr)
no exception specification
ExprResult ParseExpression(TypeCastState isTypeCast=NotTypeCast)
Simple precedence-based parser for binary/ternary operators.
This is a scope that corresponds to the parameters within a function prototype.
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
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.
The current expression is potentially evaluated at run time, which means that code may be generated t...
DeclResult ActOnCXXConditionDeclaration(Scope *S, Declarator &D)
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
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.
ExprResult ActOnExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc, Expr *Queried, SourceLocation RParen)
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
Describes how types, statements, expressions, and declarations should be printed. ...
void Finish(DiagnosticsEngine &D, Preprocessor &PP, const PrintingPolicy &Policy)
bool isEmpty() const
No scope specifier.
bool SkipUntil(tok::TokenKind T, SkipUntilFlags Flags=static_cast< SkipUntilFlags >(0))
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()
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)
void setConstructorTemplateId(TemplateIdAnnotation *TemplateId)
Specify that this unqualified-id was parsed as a template-id that names a constructor.
OpaquePtr< QualType > ParsedType
sema::LambdaScopeInfo * getCurGenericLambda()
Retrieve the current generic lambda info, if any.
void AddTypeInfo(const DeclaratorChunk &TI, ParsedAttributes &attrs, SourceLocation EndLoc)
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 ).
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)
ExprResult ActOnBooleanCondition(Scope *S, SourceLocation Loc, Expr *SubExpr)
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. Blocks serve as top-level scopes for some...
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 by copy (a.k.a., by value)
ParsedType getTypeName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec *SS=nullptr, bool isClassName=false, bool HasTrailingDot=false, ParsedType ObjectType=ParsedType(), 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...
void ActOnInitializerError(Decl *Dcl)
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
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.
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.
const SourceRange & getSourceRange() const LLVM_READONLY
static SourceLocation AdvanceToTokenCharacter(SourceLocation TokStart, unsigned Character, const SourceManager &SM, const LangOptions &LangOpts)
QualType getCanonicalTypeInternal() const
SourceLocation TemplateKWLoc
static const TST TST_float
TypeTrait
Names for traits that operate specifically on types.
void * getAnnotationValue() const
DeclSpec & getMutableDeclSpec()
static const TSW TSW_long
void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit, bool TypeMayContainAuto)
void SetRangeStart(SourceLocation Loc)
TypeResult ParseTypeName(SourceRange *Range=nullptr, Declarator::TheContext Context=Declarator::TypeNameContext, AccessSpecifier AS=AS_none, Decl **OwnedType=nullptr, ParsedAttributes *Attrs=nullptr)
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)
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)
This file defines the classes used to store parsed information about declaration-specifiers and decla...
TypeResult ActOnTypeName(Scope *S, Declarator &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. Be careful when changing this: this...
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.
const SourceRange & getRange() const
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)
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...
const clang::PrintingPolicy & getPrintingPolicy() const
bool SetTypeSpecWidth(TSW W, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
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
Represents the parsed form of a C++ template argument.
Encodes a location in the source. The SourceManager can decode this to get at the full include stack...
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
void addCapture(LambdaCaptureKind Kind, SourceLocation Loc, IdentifierInfo *Id, SourceLocation EllipsisLoc, ExprResult Init, ParsedType InitCaptureType)
Append a capture in a lambda introducer.
void setLength(unsigned Len)
An overloaded operator name, e.g., operator+.
void FinalizeDeclaration(Decl *D)
bool isValid() const
Return true if this is a valid SourceLocation object.
ASTContext & getASTContext() const
void setAnnotationEndLoc(SourceLocation L)
IdentifierTable & getIdentifierTable()
Scope * getCurScope() const
void EnterTokenStream(const Token *Toks, unsigned NumToks, bool DisableMacroExpansion, bool OwnsTokens)
Add a "macro" context to the top of the include stack, which will cause the lexer to start returning ...
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.
QualType performLambdaInitCaptureInitialization(SourceLocation Loc, bool ByRef, IdentifierInfo *Id, Expr *&Init)
Perform initialization analysis of the init-capture and perform any implicit conversions such as an l...
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, SourceLocation ESpecLoc, ParsedType *Exceptions, SourceRange *ExceptionRanges, unsigned NumExceptions, Expr *NoexceptExpr, CachedTokens *ExceptionSpecTokens, SourceLocation LocalRangeBegin, SourceLocation LocalRangeEnd, Declarator &TheDeclarator, TypeResult TrailingReturnType=TypeResult())
SourceLocation getBegin() const
SourceLocation getBeginLoc() const
bool is(tok::TokenKind K) const
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)
LambdaCaptureDefault Default
bool IsInvalidUnlessNestedName(Scope *S, CXXScopeSpec &SS, IdentifierInfo &Identifier, SourceLocation IdentifierLoc, SourceLocation ColonLoc, ParsedType ObjectType, bool EnteringContext)
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.
static const TST TST_int128
void RecordParsingTemplateParameterDepth(unsigned Depth)
This is used to inform Sema what the current TemplateParameterDepth is during Parsing. Currently it is used to pass on the depth when parsing generic lambda 'auto' parameters.
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)
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)
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)
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
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.
Capturing the this pointer.
This is a scope that can contain a declaration. Some scopes just contain loop constructs but don't co...
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()
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_bool
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...
Represents a complete lambda introducer.
static const TSW TSW_longlong
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.
SourceLocation getLocation() const
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)
This class handles loading and caching of source files into memory.
static ArrayTypeTrait ArrayTypeTraitFromTokKind(tok::TokenKind kind)
Attr - This represents one attribute.
ParsedTemplateTy Template
const DeclSpec & getDeclSpec() const
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