26#include "llvm/ADT/STLForwardCompat.h"
27#include "llvm/Support/Path.h"
28#include "llvm/Support/TimeProfiler.h"
39 explicit ActionCommentHandler(Sema &S) : S(S) { }
41 bool HandleComment(Preprocessor &PP, SourceRange Comment)
override {
42 S.ActOnComment(Comment);
51 Ident__except = PP.getIdentifierInfo(
"__except");
58 PreferredType(&actions.getASTContext(), pp.isCodeCompletionEnabled()),
59 Actions(actions), Diags(PP.getDiagnostics()), StackHandler(Diags),
60 GreaterThanIsOperator(
true), ColonIsSacred(
false),
61 InMessageExpression(
false), ParsingInObjCContainer(
false),
62 TemplateParameterDepth(0) {
65 Tok.setKind(tok::eof);
66 Actions.CurScope =
nullptr;
68 CurParsedObjCImpl =
nullptr;
72 initializePragmaHandlers();
74 CommentSemaHandler.reset(
new ActionCommentHandler(actions));
75 PP.addCommentHandler(CommentSemaHandler.get());
77 PP.setCodeCompletionHandler(*
this);
79 Actions.ParseTypeFromStringCallback =
80 [
this](StringRef TypeStr, StringRef Context,
SourceLocation IncludeLoc) {
81 return this->ParseTypeFromString(TypeStr, Context, IncludeLoc);
86 return Diags.Report(Loc, DiagID);
90 return Diag(Tok.getLocation(), DiagID);
94 unsigned CompatDiagId) {
100 return DiagCompat(Tok.getLocation(), CompatDiagId);
119 switch (ExpectedTok) {
121 return Tok.is(tok::colon) ||
Tok.is(tok::comma);
122 default:
return false;
126bool Parser::ExpectAndConsume(
tok::TokenKind ExpectedTok,
unsigned DiagID,
128 if (Tok.is(ExpectedTok) || Tok.is(tok::code_completion)) {
135 SourceLocation Loc = Tok.getLocation();
137 DiagnosticBuilder DB =
Diag(Loc, DiagID);
140 if (DiagID == diag::err_expected)
142 else if (DiagID == diag::err_expected_after)
143 DB << Msg << ExpectedTok;
153 SourceLocation EndLoc = PP.getLocForEndOfToken(PrevTokLocation);
154 const char *Spelling =
nullptr;
158 DiagnosticBuilder DB =
162 if (DiagID == diag::err_expected)
164 else if (DiagID == diag::err_expected_after)
165 DB << Msg << ExpectedTok;
172bool Parser::ExpectAndConsumeSemi(
unsigned DiagID, StringRef TokenUsed) {
176 if (Tok.is(tok::code_completion)) {
177 handleUnexpectedCodeCompletionToken();
181 if ((Tok.is(tok::r_paren) || Tok.is(tok::r_square)) &&
183 Diag(Tok, diag::err_extraneous_token_before_semi)
184 << PP.getSpelling(Tok)
191 return ExpectAndConsume(tok::semi, DiagID , TokenUsed);
195 if (!Tok.is(tok::semi))
return;
197 bool HadMultipleSemis =
false;
198 SourceLocation StartLoc = Tok.getLocation();
199 SourceLocation EndLoc = Tok.getLocation();
202 while ((Tok.is(tok::semi) && !Tok.isAtStartOfLine())) {
203 HadMultipleSemis =
true;
204 EndLoc = Tok.getLocation();
212 Diag(StartLoc, diag::warn_cxx98_compat_top_level_semi)
215 Diag(StartLoc, diag::ext_extra_semi_cxx11)
221 Diag(StartLoc, diag::ext_extra_semi)
224 TST, Actions.getASTContext().getPrintingPolicy())
228 Diag(StartLoc, diag::warn_extra_semi_after_mem_fn_def)
232bool Parser::expectIdentifier() {
233 if (Tok.is(tok::identifier))
235 if (
const auto *II = Tok.getIdentifierInfo()) {
237 Diag(Tok, diag::err_expected_token_instead_of_objcxx_keyword)
238 << tok::identifier << Tok.getIdentifierInfo();
243 Diag(Tok, diag::err_expected) << tok::identifier;
251 SourceLocation SecondTokLoc = Tok.getLocation();
256 PP.getSourceManager().getFileID(FirstTokLoc) !=
257 PP.getSourceManager().getFileID(SecondTokLoc)) {
258 Diag(FirstTokLoc, diag::warn_compound_token_split_by_macro)
259 << (FirstTokKind == Tok.getKind()) << FirstTokKind << Tok.getKind()
260 <<
static_cast<int>(Op) << SourceRange(FirstTokLoc);
261 Diag(SecondTokLoc, diag::note_compound_token_split_second_token_here)
262 << (FirstTokKind == Tok.getKind()) << Tok.getKind()
263 << SourceRange(SecondTokLoc);
268 if (Tok.hasLeadingSpace() || Tok.isAtStartOfLine()) {
269 SourceLocation SpaceLoc = PP.getLocForEndOfToken(FirstTokLoc);
271 SpaceLoc = FirstTokLoc;
272 Diag(SpaceLoc, diag::warn_compound_token_split_by_whitespace)
273 << (FirstTokKind == Tok.getKind()) << FirstTokKind << Tok.getKind()
274 <<
static_cast<int>(Op) << SourceRange(FirstTokLoc, SecondTokLoc);
284 return (
static_cast<unsigned>(L) &
static_cast<unsigned>(R)) != 0;
290 bool isFirstTokenSkipped =
true;
293 for (
unsigned i = 0, NumToks = Toks.size(); i != NumToks; ++i) {
294 if (Tok.is(Toks[i])) {
307 if (Toks.size() == 1 && Toks[0] == tok::eof &&
310 while (Tok.isNot(tok::eof))
315 switch (Tok.getKind()) {
320 case tok::annot_pragma_openmp:
321 case tok::annot_attr_openmp:
322 case tok::annot_pragma_openmp_end:
324 if (OpenMPDirectiveParsing)
326 ConsumeAnnotationToken();
328 case tok::annot_pragma_openacc:
329 case tok::annot_pragma_openacc_end:
331 if (OpenACCDirectiveParsing)
333 ConsumeAnnotationToken();
335 case tok::annot_module_begin:
336 case tok::annot_module_end:
337 case tok::annot_module_include:
338 case tok::annot_repl_input_end:
344 case tok::code_completion:
346 handleUnexpectedCodeCompletionToken();
388 if (ParenCount && !isFirstTokenSkipped)
393 if (BracketCount && !isFirstTokenSkipped)
398 if (BraceCount && !isFirstTokenSkipped)
412 isFirstTokenSkipped =
false;
421 if (NumCachedScopes) {
422 Scope *N = ScopeCache[--NumCachedScopes];
424 Actions.CurScope = N;
435 Actions.ActOnPopScope(Tok.getLocation(),
getCurScope());
438 Actions.CurScope = OldScope->
getParent();
440 if (NumCachedScopes == ScopeCacheSize)
443 ScopeCache[NumCachedScopes++] = OldScope;
446Parser::ParseScopeFlags::ParseScopeFlags(
Parser *
Self,
unsigned ScopeFlags,
448 : CurScope(ManageFlags ?
Self->getCurScope() :
nullptr) {
450 OldFlags = CurScope->getFlags();
451 CurScope->setFlags(ScopeFlags);
455Parser::ParseScopeFlags::~ParseScopeFlags() {
457 CurScope->setFlags(OldFlags);
468 Actions.CurScope =
nullptr;
471 for (
unsigned i = 0, e = NumCachedScopes; i != e; ++i)
472 delete ScopeCache[i];
474 resetPragmaHandlers();
476 PP.removeCommentHandler(CommentSemaHandler.get());
478 PP.clearCodeCompletionHandler();
480 DestroyTemplateIds();
485 assert(
getCurScope() ==
nullptr &&
"A scope is already active?");
493 &PP.getIdentifierTable().get(
"in");
495 &PP.getIdentifierTable().get(
"out");
497 &PP.getIdentifierTable().get(
"inout");
499 &PP.getIdentifierTable().get(
"oneway");
501 &PP.getIdentifierTable().get(
"bycopy");
503 &PP.getIdentifierTable().get(
"byref");
505 &PP.getIdentifierTable().get(
"nonnull");
507 &PP.getIdentifierTable().get(
"nullable");
509 &PP.getIdentifierTable().get(
"null_unspecified");
512 Ident_instancetype =
nullptr;
513 Ident_final =
nullptr;
514 Ident_sealed =
nullptr;
515 Ident_abstract =
nullptr;
516 Ident_override =
nullptr;
517 Ident_trivially_relocatable_if_eligible =
nullptr;
518 Ident_replaceable_if_eligible =
nullptr;
519 Ident_GNU_final =
nullptr;
520 Ident_import =
nullptr;
521 Ident_module =
nullptr;
523 Ident_super = &PP.getIdentifierTable().get(
"super");
525 Ident_vector =
nullptr;
526 Ident_bool =
nullptr;
527 Ident_Bool =
nullptr;
528 Ident_pixel =
nullptr;
530 Ident_vector = &PP.getIdentifierTable().get(
"vector");
531 Ident_bool = &PP.getIdentifierTable().get(
"bool");
532 Ident_Bool = &PP.getIdentifierTable().get(
"_Bool");
535 Ident_pixel = &PP.getIdentifierTable().get(
"pixel");
537 Ident_introduced =
nullptr;
538 Ident_deprecated =
nullptr;
539 Ident_obsoleted =
nullptr;
540 Ident_unavailable =
nullptr;
541 Ident_strict =
nullptr;
542 Ident_replacement =
nullptr;
544 Ident_language = Ident_defined_in = Ident_generated_declaration = Ident_USR =
547 Ident__except =
nullptr;
549 Ident__exception_code = Ident__exception_info =
nullptr;
550 Ident__abnormal_termination = Ident___exception_code =
nullptr;
551 Ident___exception_info = Ident___abnormal_termination =
nullptr;
552 Ident_GetExceptionCode = Ident_GetExceptionInfo =
nullptr;
553 Ident_AbnormalTermination =
nullptr;
556 Ident__exception_info = PP.getIdentifierInfo(
"_exception_info");
557 Ident___exception_info = PP.getIdentifierInfo(
"__exception_info");
558 Ident_GetExceptionInfo = PP.getIdentifierInfo(
"GetExceptionInformation");
559 Ident__exception_code = PP.getIdentifierInfo(
"_exception_code");
560 Ident___exception_code = PP.getIdentifierInfo(
"__exception_code");
561 Ident_GetExceptionCode = PP.getIdentifierInfo(
"GetExceptionCode");
562 Ident__abnormal_termination = PP.getIdentifierInfo(
"_abnormal_termination");
563 Ident___abnormal_termination = PP.getIdentifierInfo(
"__abnormal_termination");
564 Ident_AbnormalTermination = PP.getIdentifierInfo(
"AbnormalTermination");
566 PP.SetPoisonReason(Ident__exception_code,diag::err_seh___except_block);
567 PP.SetPoisonReason(Ident___exception_code,diag::err_seh___except_block);
568 PP.SetPoisonReason(Ident_GetExceptionCode,diag::err_seh___except_block);
569 PP.SetPoisonReason(Ident__exception_info,diag::err_seh___except_filter);
570 PP.SetPoisonReason(Ident___exception_info,diag::err_seh___except_filter);
571 PP.SetPoisonReason(Ident_GetExceptionInfo,diag::err_seh___except_filter);
572 PP.SetPoisonReason(Ident__abnormal_termination,diag::err_seh___finally_block);
573 PP.SetPoisonReason(Ident___abnormal_termination,diag::err_seh___finally_block);
574 PP.SetPoisonReason(Ident_AbnormalTermination,diag::err_seh___finally_block);
578 Ident_import = PP.getIdentifierInfo(
"import");
579 Ident_module = PP.getIdentifierInfo(
"module");
582 Actions.Initialize();
588void Parser::DestroyTemplateIds() {
596 Actions.ActOnStartOfTranslationUnit();
608 if (NoTopLevelDecls && !Actions.getASTContext().getExternalSource() &&
610 Diag(diag::ext_empty_translation_unit);
612 return NoTopLevelDecls;
617 DestroyTemplateIdAnnotationsRAIIObj CleanupRAII(*
this);
620 switch (Tok.getKind()) {
621 case tok::annot_pragma_unused:
622 HandlePragmaUnused();
636 case tok::identifier: {
638 if ((II == Ident_module || II == Ident_import) &&
640 if (II == Ident_module)
655 Result = ParseModuleDecl(ImportState);
665 case tok::annot_module_include: {
666 auto Loc = Tok.getLocation();
667 Module *Mod =
reinterpret_cast<Module *
>(Tok.getAnnotationValue());
671 Actions.ActOnAnnotModuleInclude(Loc, Mod);
678 ConsumeAnnotationToken();
682 case tok::annot_module_begin:
683 Actions.ActOnAnnotModuleBegin(
685 reinterpret_cast<Module *
>(Tok.getAnnotationValue()));
686 ConsumeAnnotationToken();
690 case tok::annot_module_end:
691 Actions.ActOnAnnotModuleEnd(
693 reinterpret_cast<Module *
>(Tok.getAnnotationValue()));
694 ConsumeAnnotationToken();
699 case tok::annot_repl_input_end:
701 if (PP.getMaxTokens() != 0 && PP.getTokenCount() > PP.getMaxTokens()) {
702 PP.Diag(Tok.getLocation(), diag::warn_max_tokens_total)
703 << PP.getTokenCount() << PP.getMaxTokens();
706 PP.Diag(OverrideLoc, diag::note_max_tokens_total_override);
711 Actions.SetLateTemplateParser(LateTemplateParserCallback,
this);
712 Actions.ActOnEndOfTranslationUnit();
716 case tok::identifier:
721 if ((Tok.getIdentifierInfo() == Ident_module ||
722 Tok.getIdentifierInfo() == Ident_import) &&
724 if (Tok.getIdentifierInfo() == Ident_module)
741 while (MaybeParseCXX11Attributes(DeclAttrs) ||
742 MaybeParseGNUAttributes(DeclSpecAttrs))
745 Result = ParseExternalDeclaration(DeclAttrs, DeclSpecAttrs);
755 else if (ImportState ==
767 DestroyTemplateIdAnnotationsRAIIObj CleanupRAII(*
this);
775 Decl *SingleDecl =
nullptr;
776 switch (
Tok.getKind()) {
777 case tok::annot_pragma_vis:
778 HandlePragmaVisibility();
780 case tok::annot_pragma_pack:
783 case tok::annot_pragma_msstruct:
784 HandlePragmaMSStruct();
786 case tok::annot_pragma_align:
789 case tok::annot_pragma_weak:
792 case tok::annot_pragma_weakalias:
793 HandlePragmaWeakAlias();
795 case tok::annot_pragma_redefine_extname:
796 HandlePragmaRedefineExtname();
798 case tok::annot_pragma_fp_contract:
799 HandlePragmaFPContract();
801 case tok::annot_pragma_fenv_access:
802 case tok::annot_pragma_fenv_access_ms:
803 HandlePragmaFEnvAccess();
805 case tok::annot_pragma_fenv_round:
806 HandlePragmaFEnvRound();
808 case tok::annot_pragma_cx_limited_range:
809 HandlePragmaCXLimitedRange();
811 case tok::annot_pragma_float_control:
812 HandlePragmaFloatControl();
814 case tok::annot_pragma_fp:
817 case tok::annot_pragma_opencl_extension:
818 HandlePragmaOpenCLExtension();
820 case tok::annot_attr_openmp:
821 case tok::annot_pragma_openmp: {
823 return ParseOpenMPDeclarativeDirectiveWithExtDecl(AS, Attrs);
825 case tok::annot_pragma_openacc: {
830 case tok::annot_pragma_ms_pointers_to_members:
831 HandlePragmaMSPointersToMembers();
833 case tok::annot_pragma_ms_vtordisp:
834 HandlePragmaMSVtorDisp();
836 case tok::annot_pragma_ms_pragma:
837 HandlePragmaMSPragma();
839 case tok::annot_pragma_dump:
842 case tok::annot_pragma_attribute:
843 HandlePragmaAttribute();
848 Actions.ActOnEmptyDeclaration(
getCurScope(), Attrs, Tok.getLocation());
852 Diag(Tok, diag::err_extraneous_closing_brace);
856 Diag(Tok, diag::err_expected_external_declaration);
858 case tok::kw___extension__: {
860 ExtensionRAIIObject O(Diags);
862 return ParseExternalDeclaration(Attrs, DeclSpecAttrs);
865 ProhibitAttributes(Attrs);
867 SourceLocation StartLoc = Tok.getLocation();
868 SourceLocation EndLoc;
877 if (!SL->getString().trim().empty())
878 Diag(StartLoc, diag::err_gnu_inline_asm_disabled);
881 ExpectAndConsume(tok::semi, diag::err_expected_after,
882 "top-level asm block");
886 SingleDecl = Actions.ActOnFileScopeAsmDecl(
Result.get(), StartLoc, EndLoc);
890 return ParseObjCAtDirectives(Attrs, DeclSpecAttrs);
894 Diag(Tok, diag::err_expected_external_declaration);
898 SingleDecl = ParseObjCMethodDefinition();
900 case tok::code_completion:
902 if (CurParsedObjCImpl) {
904 Actions.CodeCompletion().CodeCompleteObjCMethodDecl(
911 if (CurParsedObjCImpl) {
913 }
else if (PP.isIncrementalProcessingEnabled()) {
918 Actions.CodeCompletion().CodeCompleteOrdinaryName(
getCurScope(), PCC);
920 case tok::kw_import: {
923 llvm_unreachable(
"not expecting a c++20 import here");
924 ProhibitAttributes(Attrs);
926 SingleDecl = ParseModuleImport(SourceLocation(), IS);
930 ProhibitAttributes(Attrs);
931 SingleDecl = ParseExportDeclaration();
938 case tok::kw_namespace:
939 case tok::kw_typedef:
940 case tok::kw_template:
941 case tok::kw_static_assert:
942 case tok::kw__Static_assert:
945 SourceLocation DeclEnd;
950 case tok::kw_cbuffer:
951 case tok::kw_tbuffer:
953 SourceLocation DeclEnd;
965 SourceLocation DeclEnd;
976 if (NextKind == tok::kw_namespace) {
977 SourceLocation DeclEnd;
984 if (NextKind == tok::kw_template) {
987 SourceLocation DeclEnd;
996 ProhibitAttributes(Attrs);
997 ProhibitAttributes(DeclSpecAttrs);
1002 diag::warn_cxx98_compat_extern_template :
1003 diag::ext_extern_template) << SourceRange(ExternLoc, TemplateLoc);
1004 SourceLocation DeclEnd;
1006 TemplateLoc, DeclEnd, Attrs);
1010 case tok::kw___if_exists:
1011 case tok::kw___if_not_exists:
1012 ParseMicrosoftIfExistsExternalDeclaration();
1015 case tok::kw_module:
1016 Diag(Tok, diag::err_unexpected_module_decl);
1022 if (Tok.isEditorPlaceholder()) {
1027 !isDeclarationStatement(
true))
1028 return ParseTopLevelStmtDecl();
1032 return ParseDeclarationOrFunctionDefinition(Attrs, DeclSpecAttrs, DS);
1037 return Actions.ConvertDeclToDeclGroup(SingleDecl);
1040bool Parser::isDeclarationAfterDeclarator() {
1044 if (KW.
is(tok::kw_default) || KW.
is(tok::kw_delete))
1048 return Tok.is(tok::equal) ||
1049 Tok.is(tok::comma) ||
1050 Tok.is(tok::semi) ||
1051 Tok.is(tok::kw_asm) ||
1052 Tok.is(tok::kw___attribute) ||
1054 Tok.is(tok::l_paren));
1057bool Parser::isStartOfFunctionDefinition(
const ParsingDeclarator &Declarator) {
1058 assert(
Declarator.isFunctionDeclarator() &&
"Isn't a function declarator");
1059 if (Tok.is(tok::l_brace))
1064 Declarator.getFunctionTypeInfo().isKNRPrototype())
1069 return KW.
is(tok::kw_default) || KW.
is(tok::kw_delete);
1072 return Tok.is(tok::colon) ||
1073 Tok.is(tok::kw_try);
1077 ParsedAttributes &Attrs, ParsedAttributes &DeclSpecAttrs,
1083 "expected uninitialised source range");
1088 ParsedTemplateInfo TemplateInfo;
1091 ParseDeclarationSpecifiers(DS, TemplateInfo, AS,
1092 DeclSpecContext::DSC_top_level);
1097 DS, AS, DeclSpecContext::DSC_top_level))
1102 if (Tok.is(tok::semi)) {
1117 llvm_unreachable(
"we only expect to get the length of the class/struct/union/enum");
1122 SourceLocation CorrectLocationForAttributes =
1127 ProhibitAttributes(Attrs, CorrectLocationForAttributes);
1129 RecordDecl *AnonRecord =
nullptr;
1130 Decl *TheDecl = Actions.ParsedFreeStandingDeclSpec(
1133 Actions.ActOnDefinedDeclarationSpecifier(TheDecl);
1135 Decl* decls[] = {AnonRecord, TheDecl};
1136 return Actions.BuildDeclaratorGroup(decls);
1138 return Actions.ConvertDeclToDeclGroup(TheDecl);
1142 Actions.ActOnDefinedDeclarationSpecifier(DS.
getRepAsDecl());
1149 if (!Tok.isObjCAtKeyword(tok::objc_interface) &&
1150 !Tok.isObjCAtKeyword(tok::objc_protocol) &&
1151 !Tok.isObjCAtKeyword(tok::objc_implementation)) {
1152 Diag(Tok, diag::err_objc_unexpected_attr);
1160 const char *PrevSpec =
nullptr;
1163 Actions.getASTContext().getPrintingPolicy()))
1164 Diag(AtLoc, DiagID) << PrevSpec;
1166 if (Tok.isObjCAtKeyword(tok::objc_protocol))
1167 return ParseObjCAtProtocolDeclaration(AtLoc, DS.
getAttributes());
1169 if (Tok.isObjCAtKeyword(tok::objc_implementation))
1170 return ParseObjCAtImplementationDeclaration(AtLoc, DS.
getAttributes());
1172 return Actions.ConvertDeclToDeclGroup(
1173 ParseObjCAtInterfaceDeclaration(AtLoc, DS.
getAttributes()));
1182 ProhibitAttributes(Attrs);
1184 return Actions.ConvertDeclToDeclGroup(TheDecl);
1191 ParsedAttributes &Attrs, ParsedAttributes &DeclSpecAttrs,
1195 llvm::TimeTraceScope TimeScope(
"ParseDeclarationOrFunctionDefinition", [&]() {
1196 return Tok.getLocation().printToString(
1197 Actions.getASTContext().getSourceManager());
1201 return ParseDeclOrFunctionDefInternal(Attrs, DeclSpecAttrs, *DS, AS);
1203 ParsingDeclSpec PDS(*
this);
1207 ObjCDeclContextSwitch ObjCDC(*
this);
1209 return ParseDeclOrFunctionDefInternal(Attrs, DeclSpecAttrs, PDS, AS);
1213Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D,
1214 const ParsedTemplateInfo &TemplateInfo,
1215 LateParsedAttrList *LateParsedAttrs) {
1216 llvm::TimeTraceScope TimeScope(
"ParseFunctionDefinition", [&]() {
1217 return Actions.GetNameForDeclarator(D).getName().getAsString();
1223 TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
1231 const char *PrevSpec;
1233 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy();
1245 ParseKNRParamDeclarations(D);
1249 if (Tok.isNot(tok::l_brace) &&
1251 (Tok.isNot(tok::colon) && Tok.isNot(tok::kw_try) &&
1252 Tok.isNot(tok::equal)))) {
1253 Diag(Tok, diag::err_expected_fn_body);
1259 if (Tok.isNot(tok::l_brace))
1265 if (Tok.isNot(tok::equal)) {
1267 if (AL.isKnownToGCC() && !AL.isStandardAttributeSyntax())
1268 Diag(AL.getLoc(), diag::warn_attribute_on_function_definition) << AL;
1273 if (
getLangOpts().DelayedTemplateParsing && Tok.isNot(tok::equal) &&
1275 LateParsedAttrs->empty() && Actions.canDelayFunctionBody(D)) {
1283 Decl *DP = Actions.HandleDeclarator(ParentScope, D,
1288 if (SkipFunctionBodies && (!DP || Actions.canSkipFunctionBody(DP)) &&
1289 trySkippingFunctionBody()) {
1291 return Actions.ActOnSkippedFunctionBody(DP);
1295 LexTemplateFunctionForLateParsing(Toks);
1299 Actions.CheckForFunctionRedefinition(FnD);
1300 Actions.MarkAsLateParsedTemplate(FnD, DP, Toks);
1304 if (CurParsedObjCImpl && !TemplateInfo.TemplateParams &&
1305 (Tok.is(tok::l_brace) || Tok.is(tok::kw_try) || Tok.is(tok::colon)) &&
1306 Actions.CurContext->isTranslationUnit()) {
1312 Decl *FuncDecl = Actions.HandleDeclarator(ParentScope, D,
1318 StashAwayMethodOrFunctionBodyTokens(FuncDecl);
1319 CurParsedObjCImpl->HasCFunction =
true;
1331 StringLiteral *DeletedMessage =
nullptr;
1333 SourceLocation KWLoc;
1339 ? diag::warn_cxx98_compat_defaulted_deleted_function
1340 : diag::ext_defaulted_deleted_function)
1343 DeletedMessage = ParseCXXDeletedFunctionMessage();
1346 ? diag::warn_cxx98_compat_defaulted_deleted_function
1347 : diag::ext_defaulted_deleted_function)
1351 llvm_unreachable(
"function definition after = not 'delete' or 'default'");
1354 if (Tok.is(tok::comma)) {
1355 Diag(KWLoc, diag::err_default_delete_in_multiple_declaration)
1358 }
else if (ExpectAndConsume(tok::semi, diag::err_expected_after,
1366 Sema::FPFeaturesStateRAII SaveFPFeatures(Actions);
1370 SkipBodyInfo SkipBody;
1372 TemplateInfo.TemplateParams
1373 ? *TemplateInfo.TemplateParams
1375 &SkipBody, BodyKind);
1392 Actions.PopExpressionEvaluationContext();
1404 Actions.SetFunctionBodyKind(Res, KWLoc, BodyKind, DeletedMessage);
1405 Stmt *GeneratedBody = Res ? Res->
getBody() :
nullptr;
1406 Actions.ActOnFinishFunctionBody(Res, GeneratedBody,
false);
1412 if (
const auto *
Template = dyn_cast_if_present<FunctionTemplateDecl>(Res);
1414 Template->getTemplateParameters()->getParam(0)->isImplicit())
1417 CurTemplateDepthTracker.addDepth(1);
1420 if (LateParsedAttrs)
1421 ParseLexedAttributeList(*LateParsedAttrs, Res,
false,
1424 if (SkipFunctionBodies && (!Res || Actions.canSkipFunctionBody(Res)) &&
1425 trySkippingFunctionBody()) {
1427 Actions.ActOnSkippedFunctionBody(Res);
1428 return Actions.ActOnFinishFunctionBody(Res,
nullptr,
false);
1431 if (Tok.is(tok::kw_try))
1432 return ParseFunctionTryBlock(Res, BodyScope);
1436 if (Tok.is(tok::colon)) {
1437 ParseConstructorInitializer(Res);
1440 if (!Tok.is(tok::l_brace)) {
1442 Actions.ActOnFinishFunctionBody(Res,
nullptr);
1446 Actions.ActOnDefaultCtorInitializers(Res);
1448 return ParseFunctionStatementBody(Res, BodyScope);
1451void Parser::SkipFunctionBody() {
1452 if (Tok.is(tok::equal)) {
1457 bool IsFunctionTryBlock = Tok.is(tok::kw_try);
1458 if (IsFunctionTryBlock)
1462 if (ConsumeAndStoreFunctionPrologue(Skipped))
1466 while (IsFunctionTryBlock && Tok.is(tok::kw_catch)) {
1473void Parser::ParseKNRParamDeclarations(Declarator &D) {
1484 SourceLocation DSStart = Tok.getLocation();
1487 DeclSpec DS(AttrFactory);
1488 ParsedTemplateInfo TemplateInfo;
1489 ParseDeclarationSpecifiers(DS, TemplateInfo);
1497 Diag(DSStart, diag::err_declaration_does_not_declare_param);
1506 diag::err_invalid_storage_class_in_func_decl);
1511 diag::err_invalid_storage_class_in_func_decl);
1518 ParseDeclarator(ParmDeclarator);
1523 MaybeParseGNUAttributes(ParmDeclarator);
1527 Actions.ActOnParamDeclarator(
getCurScope(), ParmDeclarator);
1531 ParmDeclarator.getIdentifier()) {
1535 for (
unsigned i = 0; ; ++i) {
1539 Diag(ParmDeclarator.getIdentifierLoc(), diag::err_no_matching_param)
1540 << ParmDeclarator.getIdentifier();
1544 if (FTI.
Params[i].
Ident == ParmDeclarator.getIdentifier()) {
1547 Diag(ParmDeclarator.getIdentifierLoc(),
1548 diag::err_param_redefinition)
1549 << ParmDeclarator.getIdentifier();
1560 if (Tok.isNot(tok::comma))
1563 ParmDeclarator.clear();
1569 ParseDeclarator(ParmDeclarator);
1573 if (!ExpectAndConsumeSemi(diag::err_expected_semi_declaration))
1583 Actions.ActOnFinishKNRParamDeclarations(
getCurScope(), D, Tok.getLocation());
1586ExprResult Parser::ParseAsmStringLiteral(
bool ForAsmLabel) {
1589 if (isTokenStringLiteral()) {
1595 if (!SL->isOrdinary()) {
1596 Diag(Tok, diag::err_asm_operand_wide_string_literal)
1597 << SL->isWide() << SL->getSourceRange();
1601 Tok.is(tok::l_paren)) {
1603 SourceLocation RParenLoc;
1606 EnterExpressionEvaluationContext ConstantEvaluated(
1608 AsmString = ParseParenExpression(
1612 AsmString = Actions.ActOnConstantExpression(AsmString);
1617 Diag(Tok, diag::err_asm_expected_string) << (
1618 (
getLangOpts().CPlusPlus11 && !ForAsmLabel) ? 0 : 1);
1621 return Actions.ActOnGCCAsmStmtString(AsmString.
get(), ForAsmLabel);
1624ExprResult Parser::ParseSimpleAsm(
bool ForAsmLabel, SourceLocation *EndLoc) {
1625 assert(Tok.is(tok::kw_asm) &&
"Not an asm!");
1628 if (isGNUAsmQualifier(Tok)) {
1630 SourceRange RemovalRange(PP.getLocForEndOfToken(Loc),
1631 PP.getLocForEndOfToken(Tok.getLocation()));
1632 Diag(Tok, diag::err_global_asm_qualifier_ignored)
1633 << GNUAsmQualifiers::getQualifierName(getGNUAsmQualifier(Tok))
1639 if (
T.consumeOpen()) {
1640 Diag(Tok, diag::err_expected_lparen_after) <<
"asm";
1646 if (!
Result.isInvalid()) {
1650 *EndLoc =
T.getCloseLocation();
1653 *EndLoc = Tok.getLocation();
1660TemplateIdAnnotation *Parser::takeTemplateIdAnnotation(
const Token &tok) {
1661 assert(tok.
is(tok::annot_template_id) &&
"Expected template-id token");
1662 TemplateIdAnnotation *
1667void Parser::AnnotateScopeToken(CXXScopeSpec &SS,
bool IsNewAnnotation) {
1670 if (PP.isBacktrackEnabled())
1671 PP.RevertCachedTokens(1);
1673 PP.EnterToken(Tok,
true);
1674 Tok.setKind(tok::annot_cxxscope);
1675 Tok.setAnnotationValue(Actions.SaveNestedNameSpecifierAnnotation(SS));
1676 Tok.setAnnotationRange(SS.
getRange());
1681 if (IsNewAnnotation)
1682 PP.AnnotateCachedTokens(Tok);
1686Parser::TryAnnotateName(CorrectionCandidateCallback *CCC,
1688 assert(Tok.is(tok::identifier) || Tok.is(tok::annot_cxxscope));
1690 const bool EnteringContext =
false;
1691 const bool WasScopeAnnotation = Tok.is(tok::annot_cxxscope);
1695 ParseOptionalCXXScopeSpecifier(SS,
nullptr,
1700 if (Tok.isNot(tok::identifier) || SS.
isInvalid()) {
1702 AllowImplicitTypename))
1707 IdentifierInfo *Name = Tok.getIdentifierInfo();
1708 SourceLocation NameLoc = Tok.getLocation();
1712 if (isTentativelyDeclared(Name) && SS.
isEmpty()) {
1716 AllowImplicitTypename))
1728 Sema::NameClassification Classification = Actions.ClassifyName(
1736 isTemplateArgumentList(1) == TPResult::False) {
1738 Token FakeNext =
Next;
1739 FakeNext.
setKind(tok::unknown);
1741 Actions.ClassifyName(
getCurScope(), SS, Name, NameLoc, FakeNext,
1742 SS.
isEmpty() ? CCC :
nullptr);
1745 switch (Classification.
getKind()) {
1751 Tok.setIdentifierInfo(Name);
1753 PP.TypoCorrectToken(Tok);
1755 AnnotateScopeToken(SS, !WasScopeAnnotation);
1764 if (TryAltiVecVectorToken())
1769 SourceLocation BeginLoc = NameLoc;
1776 QualType
T = Actions.GetTypeFromParser(Ty);
1781 SourceLocation NewEndLoc;
1783 = parseObjCTypeArgsAndProtocolQualifiers(IdentifierLoc, Ty,
1788 else if (Tok.is(tok::eof))
1792 Tok.setKind(tok::annot_typename);
1793 setTypeAnnotation(Tok, Ty);
1794 Tok.setAnnotationEndLoc(Tok.getLocation());
1795 Tok.setLocation(BeginLoc);
1796 PP.AnnotateCachedTokens(Tok);
1801 Tok.setKind(tok::annot_overload_set);
1803 Tok.setAnnotationEndLoc(NameLoc);
1806 PP.AnnotateCachedTokens(Tok);
1810 if (TryAltiVecVectorToken())
1815 Tok.setKind(tok::annot_non_type);
1817 Tok.setLocation(NameLoc);
1818 Tok.setAnnotationEndLoc(NameLoc);
1819 PP.AnnotateCachedTokens(Tok);
1821 AnnotateScopeToken(SS, !WasScopeAnnotation);
1826 Tok.setKind(Classification.
getKind() ==
1828 ? tok::annot_non_type_undeclared
1829 : tok::annot_non_type_dependent);
1830 setIdentifierAnnotation(Tok, Name);
1831 Tok.setLocation(NameLoc);
1832 Tok.setAnnotationEndLoc(NameLoc);
1833 PP.AnnotateCachedTokens(Tok);
1835 AnnotateScopeToken(SS, !WasScopeAnnotation);
1839 if (
Next.isNot(tok::less)) {
1843 AnnotateScopeToken(SS, !WasScopeAnnotation);
1851 bool IsConceptName =
1857 if (
Next.is(tok::less))
1859 if (AnnotateTemplateIdToken(
1866 AnnotateScopeToken(SS, !WasScopeAnnotation);
1873 AnnotateScopeToken(SS, !WasScopeAnnotation);
1878 SourceLocation TokenEndLoc = PP.getLocForEndOfToken(PrevTokLocation);
1879 return TokenEndLoc.
isValid() ? TokenEndLoc : Tok.getLocation();
1882bool Parser::TryKeywordIdentFallback(
bool DisableKeyword) {
1883 assert(
Tok.isNot(tok::identifier));
1884 Diag(
Tok, diag::ext_keyword_as_ident)
1888 Tok.getIdentifierInfo()->revertTokenIDToIdentifier();
1889 Tok.setKind(tok::identifier);
1895 assert((Tok.is(tok::identifier) || Tok.is(tok::coloncolon) ||
1896 Tok.is(tok::kw_typename) || Tok.is(tok::annot_cxxscope) ||
1897 Tok.is(tok::kw_decltype) || Tok.is(tok::annot_template_id) ||
1898 Tok.is(tok::kw___super) || Tok.is(tok::kw_auto) ||
1899 Tok.is(tok::annot_pack_indexing_type)) &&
1900 "Cannot be a type or scope token!");
1902 if (Tok.is(tok::kw_typename)) {
1911 PP.Lex(TypedefToken);
1913 PP.EnterToken(Tok,
true);
1916 Diag(Tok.getLocation(), diag::warn_expected_qualified_after_typename);
1928 if (ParseOptionalCXXScopeSpecifier(SS,
nullptr,
1934 if (Tok.is(tok::identifier) || Tok.is(tok::annot_template_id) ||
1935 Tok.is(tok::annot_decltype)) {
1937 if (Tok.is(tok::annot_decltype) ||
1939 Tok.isAnnotation())) {
1940 unsigned DiagID = diag::err_expected_qualified_after_typename;
1944 DiagID = diag::warn_expected_qualified_after_typename;
1945 Diag(Tok.getLocation(), DiagID);
1949 if (Tok.isEditorPlaceholder())
1952 Diag(Tok.getLocation(), diag::err_expected_qualified_after_typename);
1956 bool TemplateKWPresent =
false;
1957 if (Tok.is(tok::kw_template)) {
1959 TemplateKWPresent =
true;
1963 if (Tok.is(tok::identifier)) {
1965 Diag(Tok.getLocation(),
1966 diag::missing_template_arg_list_after_template_kw);
1969 Ty = Actions.ActOnTypenameType(
getCurScope(), TypenameLoc, SS,
1970 *Tok.getIdentifierInfo(),
1972 }
else if (Tok.is(tok::annot_template_id)) {
1975 Diag(Tok, diag::err_typename_refers_to_non_type_template)
1976 << Tok.getAnnotationRange();
1985 : Actions.ActOnTypenameType(
1989 TemplateArgsPtr, TemplateId->
RAngleLoc);
1991 Diag(Tok, diag::err_expected_type_name_after_typename)
1997 Tok.setKind(tok::annot_typename);
1998 setTypeAnnotation(Tok, Ty);
1999 Tok.setAnnotationEndLoc(EndLoc);
2000 Tok.setLocation(TypenameLoc);
2001 PP.AnnotateCachedTokens(Tok);
2006 bool WasScopeAnnotation = Tok.is(tok::annot_cxxscope);
2010 if (ParseOptionalCXXScopeSpecifier(SS,
nullptr,
2016 AllowImplicitTypename);
2022 if (Tok.is(tok::identifier)) {
2025 *Tok.getIdentifierInfo(), Tok.getLocation(),
getCurScope(), &SS,
2029 true, AllowImplicitTypename)) {
2034 QualType T = Actions.GetTypeFromParser(Ty);
2039 (
T->isObjCObjectType() ||
T->isObjCObjectPointerType())) {
2049 else if (Tok.is(tok::eof))
2055 Tok.setKind(tok::annot_typename);
2056 setTypeAnnotation(Tok, Ty);
2057 Tok.setAnnotationEndLoc(Tok.getLocation());
2058 Tok.setLocation(BeginLoc);
2062 PP.AnnotateCachedTokens(Tok);
2079 TemplateName.setIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
2080 bool MemberOfUnknownSpecialization;
2085 MemberOfUnknownSpecialization)) {
2089 isTemplateArgumentList(1) != TPResult::False) {
2109 if (Tok.is(tok::annot_template_id)) {
2116 AnnotateTemplateIdTokenAsType(SS, AllowImplicitTypename);
2123 Tok.is(tok::coloncolon)) {
2132 AnnotateScopeToken(SS, IsNewScope);
2138 "Call sites of this function should be guarded by checking for C++");
2142 if (ParseOptionalCXXScopeSpecifier(SS,
nullptr,
2149 AnnotateScopeToken(SS,
true);
2153bool Parser::isTokenEqualOrEqualTypo() {
2159 case tok::starequal:
2160 case tok::plusequal:
2161 case tok::minusequal:
2162 case tok::exclaimequal:
2163 case tok::slashequal:
2164 case tok::percentequal:
2165 case tok::lessequal:
2166 case tok::lesslessequal:
2167 case tok::greaterequal:
2168 case tok::greatergreaterequal:
2169 case tok::caretequal:
2170 case tok::pipeequal:
2171 case tok::equalequal:
2172 Diag(
Tok, diag::err_invalid_token_after_declarator_suggest_equal)
2181SourceLocation Parser::handleUnexpectedCodeCompletionToken() {
2182 assert(Tok.is(tok::code_completion));
2183 PrevTokLocation = Tok.getLocation();
2186 if (S->isFunctionScope()) {
2188 Actions.CodeCompletion().CodeCompleteOrdinaryName(
2190 return PrevTokLocation;
2193 if (S->isClassScope()) {
2195 Actions.CodeCompletion().CodeCompleteOrdinaryName(
2197 return PrevTokLocation;
2202 Actions.CodeCompletion().CodeCompleteOrdinaryName(
2204 return PrevTokLocation;
2209void Parser::CodeCompleteDirective(
bool InConditional) {
2210 Actions.CodeCompletion().CodeCompletePreprocessorDirective(InConditional);
2214 Actions.CodeCompletion().CodeCompleteInPreprocessorConditionalExclusion(
2218void Parser::CodeCompleteMacroName(
bool IsDefinition) {
2219 Actions.CodeCompletion().CodeCompletePreprocessorMacroName(IsDefinition);
2223 Actions.CodeCompletion().CodeCompletePreprocessorExpression();
2226void Parser::CodeCompleteMacroArgument(IdentifierInfo *
Macro,
2227 MacroInfo *MacroInfo,
2228 unsigned ArgumentIndex) {
2229 Actions.CodeCompletion().CodeCompletePreprocessorMacroArgument(
2233void Parser::CodeCompleteIncludedFile(llvm::StringRef Dir,
bool IsAngled) {
2234 Actions.CodeCompletion().CodeCompleteIncludedFile(Dir, IsAngled);
2238 Actions.CodeCompletion().CodeCompleteNaturalLanguage();
2241bool Parser::ParseMicrosoftIfExistsCondition(IfExistsCondition&
Result) {
2242 assert((Tok.is(tok::kw___if_exists) || Tok.is(tok::kw___if_not_exists)) &&
2243 "Expected '__if_exists' or '__if_not_exists'");
2244 Result.IsIfExists = Tok.is(tok::kw___if_exists);
2248 if (
T.consumeOpen()) {
2249 Diag(Tok, diag::err_expected_lparen_after)
2250 << (
Result.IsIfExists?
"__if_exists" :
"__if_not_exists");
2256 ParseOptionalCXXScopeSpecifier(
Result.SS,
nullptr,
2261 if (
Result.SS.isInvalid()) {
2267 SourceLocation TemplateKWLoc;
2272 false, &TemplateKWLoc,
2278 if (
T.consumeClose())
2306void Parser::ParseMicrosoftIfExistsExternalDeclaration() {
2307 IfExistsCondition
Result;
2308 if (ParseMicrosoftIfExistsCondition(
Result))
2312 if (
Braces.consumeOpen()) {
2313 Diag(Tok, diag::err_expected) << tok::l_brace;
2317 switch (
Result.Behavior) {
2323 llvm_unreachable(
"Cannot have a dependent external declaration");
2332 while (Tok.isNot(tok::r_brace) && !isEofOrEom()) {
2333 ParsedAttributes Attrs(AttrFactory);
2334 MaybeParseCXX11Attributes(Attrs);
2335 ParsedAttributes EmptyDeclSpecAttrs(AttrFactory);
2338 Actions.getASTConsumer().HandleTopLevelDecl(
Result.get());
2345 Token Introducer = Tok;
2346 SourceLocation StartLoc = Introducer.
getLocation();
2353 (Tok.is(tok::kw_module) ||
2354 (Tok.is(tok::identifier) && Tok.getIdentifierInfo() == Ident_module)) &&
2355 "not a module declaration");
2360 DiagnoseAndSkipCXX11Attributes();
2363 if (
getLangOpts().CPlusPlusModules && Tok.is(tok::semi)) {
2367 Diag(StartLoc, diag::err_global_module_introducer_not_at_start)
2368 << SourceRange(StartLoc, SemiLoc);
2372 Diag(StartLoc, diag::err_module_fragment_exported)
2376 return Actions.ActOnGlobalModuleFragmentDecl(ModuleLoc);
2380 if (
getLangOpts().CPlusPlusModules && Tok.is(tok::colon) &&
2383 Diag(StartLoc, diag::err_module_fragment_exported)
2388 DiagnoseAndSkipCXX11Attributes();
2389 ExpectAndConsumeSemi(diag::err_private_module_fragment_expected_semi);
2393 return Actions.ActOnPrivateModuleFragmentDecl(ModuleLoc, PrivateLoc);
2396 SmallVector<IdentifierLoc, 2> Path;
2397 if (ParseModuleName(ModuleLoc, Path,
false))
2401 SmallVector<IdentifierLoc, 2> Partition;
2402 if (Tok.is(tok::colon)) {
2405 Diag(ColonLoc, diag::err_unsupported_module_partition)
2406 << SourceRange(ColonLoc, Partition.back().getLoc());
2408 else if (ParseModuleName(ModuleLoc, Partition,
false))
2413 ParsedAttributes Attrs(AttrFactory);
2414 MaybeParseCXX11Attributes(Attrs);
2415 ProhibitCXX11Attributes(Attrs, diag::err_attribute_not_module_attr,
2416 diag::err_keyword_not_module_attr,
2420 ExpectAndConsumeSemi(diag::err_module_expected_semi);
2422 return Actions.ActOnModuleDecl(StartLoc, ModuleLoc, MDK, Path, Partition,
2427Decl *Parser::ParseModuleImport(SourceLocation AtLoc,
2429 SourceLocation StartLoc = AtLoc.
isInvalid() ? Tok.getLocation() : AtLoc;
2431 SourceLocation ExportLoc;
2434 assert((AtLoc.
isInvalid() ? Tok.isOneOf(tok::kw_import, tok::identifier)
2435 : Tok.isObjCAtKeyword(tok::objc_import)) &&
2436 "Improper start to module import");
2437 bool IsObjCAtImport = Tok.isObjCAtKeyword(tok::objc_import);
2441 SmallVector<IdentifierLoc, 2> Path;
2442 bool IsPartition =
false;
2443 Module *HeaderUnit =
nullptr;
2444 if (Tok.is(tok::header_name)) {
2449 }
else if (Tok.is(tok::annot_header_unit)) {
2451 HeaderUnit =
reinterpret_cast<Module *
>(Tok.getAnnotationValue());
2452 ConsumeAnnotationToken();
2453 }
else if (Tok.is(tok::colon)) {
2456 Diag(ColonLoc, diag::err_unsupported_module_partition)
2457 << SourceRange(ColonLoc, Path.back().getLoc());
2459 else if (ParseModuleName(ColonLoc, Path,
true))
2464 if (ParseModuleName(ImportLoc, Path,
true))
2468 ParsedAttributes Attrs(AttrFactory);
2469 MaybeParseCXX11Attributes(Attrs);
2471 ProhibitCXX11Attributes(Attrs, diag::err_attribute_not_import_attr,
2472 diag::err_keyword_not_import_attr,
2476 if (PP.hadModuleLoaderFatalFailure()) {
2483 bool SeenError =
true;
2484 switch (ImportState) {
2496 Diag(ImportLoc, diag::err_partition_import_outside_module);
2508 if (IsPartition || (HeaderUnit && HeaderUnit->
Kind !=
2510 Diag(ImportLoc, diag::err_import_in_wrong_fragment)
2519 Diag(ImportLoc, diag::err_import_not_allowed_here);
2524 ExpectAndConsumeSemi(diag::err_module_expected_semi);
2533 Actions.ActOnModuleImport(StartLoc, ExportLoc, ImportLoc, HeaderUnit);
2534 else if (!Path.empty())
2535 Import = Actions.ActOnModuleImport(StartLoc, ExportLoc, ImportLoc, Path,
2542 if (IsObjCAtImport && AtLoc.
isValid()) {
2543 auto &SrcMgr = PP.getSourceManager();
2544 auto FE = SrcMgr.getFileEntryRefForID(SrcMgr.getFileID(AtLoc));
2545 if (FE && llvm::sys::path::parent_path(FE->getDir().getName())
2546 .ends_with(
".framework"))
2547 Diags.Report(AtLoc, diag::warn_atimport_in_framework_header);
2553bool Parser::ParseModuleName(SourceLocation UseLoc,
2554 SmallVectorImpl<IdentifierLoc> &Path,
2558 if (!Tok.is(tok::identifier)) {
2559 if (Tok.is(tok::code_completion)) {
2561 Actions.CodeCompletion().CodeCompleteModuleImport(UseLoc, Path);
2565 Diag(Tok, diag::err_module_expected_ident) << IsImport;
2571 Path.emplace_back(Tok.getLocation(), Tok.getIdentifierInfo());
2574 if (Tok.isNot(tok::period))
2581bool Parser::parseMisplacedModuleImport() {
2583 switch (Tok.getKind()) {
2584 case tok::annot_module_end:
2588 if (MisplacedModuleBeginCount) {
2589 --MisplacedModuleBeginCount;
2590 Actions.ActOnAnnotModuleEnd(
2592 reinterpret_cast<Module *
>(Tok.getAnnotationValue()));
2593 ConsumeAnnotationToken();
2600 case tok::annot_module_begin:
2602 Actions.ActOnAnnotModuleBegin(
2604 reinterpret_cast<Module *
>(Tok.getAnnotationValue()));
2605 ConsumeAnnotationToken();
2606 ++MisplacedModuleBeginCount;
2608 case tok::annot_module_include:
2611 Actions.ActOnAnnotModuleInclude(
2613 reinterpret_cast<Module *
>(Tok.getAnnotationValue()));
2614 ConsumeAnnotationToken();
2624void Parser::diagnoseUseOfC11Keyword(
const Token &Tok) {
2629 : diag::ext_c11_feature)
2633bool BalancedDelimiterTracker::diagnoseOverflow() {
2634 P.Diag(P.Tok, diag::err_bracket_depth_exceeded)
2635 << P.getLangOpts().BracketDepth;
2636 P.Diag(P.Tok, diag::note_bracket_depth);
2644 LOpen = P.Tok.getLocation();
2645 if (P.ExpectAndConsume(Kind, DiagID, Msg)) {
2646 if (SkipToTok != tok::unknown)
2651 if (getDepth() < P.getLangOpts().BracketDepth)
2654 return diagnoseOverflow();
2657bool BalancedDelimiterTracker::diagnoseMissingClose() {
2658 assert(!P.Tok.is(Close) &&
"Should have consumed closing delimiter");
2660 if (P.Tok.is(tok::annot_module_end))
2661 P.Diag(P.Tok, diag::err_missing_before_module_end) << Close;
2663 P.Diag(P.Tok, diag::err_expected) << Close;
2664 P.Diag(LOpen, diag::note_matching) << Kind;
2668 if (P.Tok.isNot(tok::r_paren) && P.Tok.isNot(tok::r_brace) &&
2669 P.Tok.isNot(tok::r_square) &&
2670 P.SkipUntil(Close, FinalToken,
2673 LClose = P.ConsumeAnyToken();
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
static Decl::Kind getKind(const Decl *D)
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
static bool IsCommonTypo(tok::TokenKind ExpectedTok, const Token &Tok)
static bool HasFlagsSet(Parser::SkipUntilFlags L, Parser::SkipUntilFlags R)
This file declares facilities that support code completion.
Defines a utilitiy for warning once when close to out of stack space.
bool expectAndConsume(unsigned DiagID=diag::err_expected, const char *Msg="", tok::TokenKind SkipToTok=tok::unknown)
Represents a C++ nested-name-specifier or a global scope specifier.
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
SourceRange getRange() const
SourceLocation getBeginLoc() const
bool isInvalid() const
An error occurred during parsing of the scope specifier.
bool isEmpty() const
No scope specifier.
virtual void CodeCompletePreprocessorExpression()
Callback invoked when performing code completion in a preprocessor expression, such as the condition ...
virtual void CodeCompleteNaturalLanguage()
Callback invoked when performing code completion in a part of the file where we expect natural langua...
virtual void CodeCompleteInConditionalExclusion()
Callback invoked when performing code completion within a block of code that was excluded due to prep...
void ClearStorageClassSpecs()
TST getTypeSpecType() const
SourceLocation getStorageClassSpecLoc() const
SCS getStorageClassSpec() const
bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
SourceRange getSourceRange() const LLVM_READONLY
void SetRangeEnd(SourceLocation Loc)
static const TST TST_interface
void SetRangeStart(SourceLocation Loc)
static const TST TST_union
TSCS getThreadStorageClassSpec() const
ParsedAttributes & getAttributes()
static const TST TST_enum
static bool isDeclRep(TST T)
void takeAttributesAppendingingFrom(ParsedAttributes &attrs)
static const TST TST_class
bool hasTagDefinition() const
unsigned getParsedSpecifiers() const
Return a bitmask of which flavors of specifiers this DeclSpec includes.
static const TSCS TSCS_unspecified
static const char * getSpecifierName(DeclSpec::TST T, const PrintingPolicy &Policy)
Turn a type-specifier-type into a string like "_Bool" or "union".
SourceLocation getThreadStorageClassSpecLoc() const
Decl * getRepAsDecl() const
static const TST TST_unspecified
bool isEmpty() const
isEmpty - Return true if this declaration specifier is completely empty: no tokens were parsed in the...
SourceLocation getTypeSpecTypeLoc() const
@ PQ_StorageClassSpecifier
static const TST TST_struct
Decl - This represents one declaration (or definition), e.g.
virtual Stmt * getBody() const
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
void SetRangeBegin(SourceLocation Loc)
SetRangeBegin - Set the start of the source range to Loc, unless it's invalid.
const ParsedAttributes & getAttributes() const
SourceLocation getIdentifierLoc() const
void setFunctionDefinitionKind(FunctionDefinitionKind Val)
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
A little helper class used to produce diagnostics.
static unsigned getCXXCompatDiagId(const LangOptions &LangOpts, unsigned CompatDiagId)
Get the appropriate diagnostic Id to use for issuing a compatibility diagnostic.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
One of these records is kept for each identifier that is lexed.
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
A simple pair of identifier info and location.
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Describes a module or submodule.
ModuleKind Kind
The kind of this module.
bool isHeaderUnit() const
Is this module a header unit.
@ ModuleHeaderUnit
This is a C++20 header unit.
static OpaquePtr make(TemplateName P)
RAII object that makes sure paren/bracket/brace count is correct after declaration/statement parsing,...
static const ParsedAttributesView & none()
ParsedAttributes - A collection of parsed attributes.
ParseScope - Introduces a new scope for parsing.
Parser - This implements a parser for the C family of languages.
DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
SourceLocation getEndOfPreviousToken() const
bool TryAnnotateTypeOrScopeTokenAfterScopeSpec(CXXScopeSpec &SS, bool IsNewScope, ImplicitTypenameContext AllowImplicitTypename)
Try to annotate a type or scope token, having already parsed an optional scope specifier.
DiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId)
ExprResult ParseStringLiteralExpression(bool AllowUserDefinedLiteral=false)
ParseStringLiteralExpression - This handles the various token types that form string literals,...
SourceLocation ConsumeToken()
ConsumeToken - Consume the current 'peek token' and lex the next one.
Parser(Preprocessor &PP, Sema &Actions, bool SkipFunctionBodies)
void EnterScope(unsigned ScopeFlags)
EnterScope - Start a new scope.
bool ParseUnqualifiedId(CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHadErrors, bool EnteringContext, bool AllowDestructorName, bool AllowConstructorName, bool AllowDeductionGuide, SourceLocation *TemplateKWLoc, UnqualifiedId &Result)
Parse a C++ unqualified-id (or a C identifier), which describes the name of an entity.
DeclGroupPtrTy ParseOpenACCDirectiveDecl(AccessSpecifier &AS, ParsedAttributes &Attrs, DeclSpec::TST TagType, Decl *TagDecl)
Parse OpenACC directive on a declaration.
SourceLocation ConsumeAnyToken(bool ConsumeCodeCompletionTok=false)
ConsumeAnyToken - Dispatch to the right Consume* method based on the current token type.
const Token & GetLookAheadToken(unsigned N)
GetLookAheadToken - This peeks ahead N tokens and returns that token without consuming any tokens.
bool TryConsumeToken(tok::TokenKind Expected)
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
Scope * getCurScope() const
OpaquePtr< TemplateName > TemplateTy
bool SkipUntil(tok::TokenKind T, SkipUntilFlags Flags=static_cast< SkipUntilFlags >(0))
SkipUntil - Read tokens until we get to the specified token, then consume it (unless StopBeforeMatch ...
void SkipMalformedDecl()
SkipMalformedDecl - Read tokens until we get to some likely good stopping point for skipping past a s...
friend class PoisonSEHIdentifiersRAIIObject
void ExitScope()
ExitScope - Pop a scope off the scope stack.
const LangOptions & getLangOpts() const
bool ParseFirstTopLevelDecl(DeclGroupPtrTy &Result, Sema::ModuleImportState &ImportState)
Parse the first top-level declaration in a translation unit.
SkipUntilFlags
Control flags for SkipUntil functions.
@ StopBeforeMatch
Stop skipping at specified token, but don't skip the token itself.
@ StopAtCodeCompletion
Stop at code completion.
@ StopAtSemi
Stop skipping at semicolon.
bool TryAnnotateTypeOrScopeToken(ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No)
TryAnnotateTypeOrScopeToken - If the current token position is on a typename (possibly qualified in C...
bool MightBeCXXScopeToken()
const Token & NextToken()
NextToken - This peeks ahead one token and returns it without consuming it.
friend class BalancedDelimiterTracker
SmallVector< TemplateParameterList *, 4 > TemplateParameterLists
void Initialize()
Initialize - Warm up the parser.
bool TryAnnotateCXXScopeToken(bool EnteringContext=false)
TryAnnotateScopeToken - Like TryAnnotateTypeOrScopeToken but only annotates C++ scope specifiers and ...
A class for parsing a DeclSpec.
const ParsingDeclSpec & getDeclSpec() const
ParsingDeclSpec & getMutableDeclSpec() const
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
StringRef getSpelling(SourceLocation loc, SmallVectorImpl< char > &buffer, bool *invalid=nullptr) const
Return the 'spelling' of the token at the given location; does not go up to the spelling location or ...
bool isCodeCompletionEnabled() const
Determine if we are performing code completion.
bool isCodeCompletionReached() const
Returns true if code-completion is enabled and we have hit the code-completion point.
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Computes the source location just past the end of the token at this source location.
A (possibly-)qualified type.
Scope - A scope is a transient data structure that is used while parsing the program.
void Init(Scope *parent, unsigned flags)
Init - This is used by the parser to implement scope caching.
const Scope * getParent() const
getParent - Return the scope that this is nested in.
@ FunctionPrototypeScope
This is a scope that corresponds to the parameters within a function prototype.
@ CompoundStmtScope
This is a compound statement scope.
@ FunctionDeclarationScope
This is a scope that corresponds to the parameters within a function prototype for a function declara...
@ FnScope
This indicates that the scope corresponds to a function, which means that labels are set here.
@ DeclScope
This is a scope that can contain a declaration.
ParserCompletionContext
Describes the context in which code completion occurs.
@ PCC_TopLevelOrExpression
Code completion occurs at top-level in a REPL session.
@ PCC_Class
Code completion occurs within a class, struct, or union.
@ PCC_ObjCImplementation
Code completion occurs within an Objective-C implementation or category implementation.
@ PCC_Namespace
Code completion occurs at top-level or namespace context.
@ PCC_RecoveryInFunction
Code completion occurs within the body of a function on a recovery path, where we do not have a speci...
ExprResult getExpression() const
NameClassificationKind getKind() const
NamedDecl * getNonTypeDecl() const
TemplateName getTemplateName() const
ParsedType getType() const
TemplateNameKind getTemplateNameKind() const
Sema - This implements semantic analysis and AST building for C.
@ Interface
'export module X;'
@ Implementation
'module X;'
@ Other
C++26 [dcl.fct.def.general]p1 function-body: ctor-initializer[opt] compound-statement function-try-bl...
@ Delete
deleted-function-body
ModuleImportState
An enumeration to represent the transition of states in parsing module fragments and imports.
@ PrivateFragmentImportFinished
after 'module :private;' but a non-import decl has already been seen.
@ ImportFinished
after any non-import decl.
@ PrivateFragmentImportAllowed
after 'module :private;' but before any non-import decl.
@ FirstDecl
Parsing the first decl in a TU.
@ GlobalFragment
after 'module;' but before 'module X;'
@ NotACXX20Module
Not a C++20 TU, or an invalid state was found.
@ ImportAllowed
after 'module X;' but before any non-import decl.
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Represents a C++ template name within the type system.
Token - This structure provides full information about a lexed token.
IdentifierInfo * getIdentifierInfo() const
SourceLocation getLocation() const
Return a source location identifier for the specified offset in the current file.
void setKind(tok::TokenKind K)
bool is(tok::TokenKind K) const
is/isNot - Predicates to check if this token is a specific kind, as in "if (Tok.is(tok::l_brace)) {....
void * getAnnotationValue() const
tok::TokenKind getKind() const
bool hasSeenNoTrivialPPDirective() const
bool isObjCObjectType() const
bool isObjCObjectPointerType() const
Represents a C++ unqualified-id that has been parsed.
void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Specify that this unqualified-id was parsed as an identifier.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
const char * getPunctuatorSpelling(TokenKind Kind) LLVM_READNONE
Determines the spelling of simple punctuation tokens like '!
The JSON file list parser is used to communicate input to InstallAPI.
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
@ Unresolved
The identifier can't be resolved.
@ Success
Annotation was successful.
@ Error
Annotation has failed and emitted an error.
@ TentativeDecl
The identifier is a tentatively-declared name.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
ActionResult< Decl * > DeclResult
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
@ Skip
Skip the block entirely; this code is never used.
@ Parse
Parse the block; this code is always used.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
ActionResult< ParsedType > TypeResult
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
@ FunctionTemplate
The name was classified as a function template name.
@ Keyword
The name has been typo-corrected to a keyword.
@ DependentNonType
The name denotes a member of a dependent type that could not be resolved.
@ UndeclaredTemplate
The name was classified as an ADL-only function template name.
@ NonType
The name was classified as a specific non-type, non-template declaration.
@ Unknown
This name is not a type or template in this context, but might be something else.
@ Error
Classification failed; an error has been produced.
@ Type
The name was classified as a type.
@ TypeTemplate
The name was classified as a template whose specializations are types.
@ Concept
The name was classified as a concept name.
@ OverloadSet
The name was classified as an overload set, and an expression representing that overload set has been...
@ UndeclaredNonType
The name was classified as an ADL-only function name.
@ VarTemplate
The name was classified as a variable template name.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
ExtraSemiKind
The kind of extra semi diagnostic to emit.
@ AfterMemberFunctionDefinition
TemplateNameKind
Specifies the kind of template name that an identifier refers to.
@ TNK_Type_template
The name refers to a template whose specialization produces a type.
@ TNK_Undeclared_template
Lookup for the name failed, but we're assuming it was a template name anyway.
@ Dependent
The name is a dependent name, so the results will differ from one instantiation to the next.
@ Exists
The symbol exists.
@ Error
An error occurred.
@ DoesNotExist
The symbol does not exist.
U cast(CodeGen::Address addr)
SmallVector< Token, 4 > CachedTokens
A set of tokens that has been cached for later parsing.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
ParenParseOption
ParenParseOption - Control what ParseParenExpression will parse.
ActionResult< Expr * > ExprResult
@ Braces
New-expression has a C++11 list-initializer.
ParamInfo * Params
Params - This is a pointer to a new[]'d array of ParamInfo objects that describe the parameters speci...
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
bool isKNRPrototype() const
isKNRPrototype - Return true if this is a K&R style identifier list, like "void foo(a,...
const IdentifierInfo * Ident
Information about a template-id annotation token.
const IdentifierInfo * Name
FIXME: Temporarily stores the name of a specialization.
TemplateNameKind Kind
The kind of template that Template refers to.
unsigned NumArgs
NumArgs - The number of template arguments.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
SourceLocation TemplateKWLoc
TemplateKWLoc - The location of the template keyword.
bool mightBeType() const
Determine whether this might be a type template.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.