29#include "llvm/ADT/STLForwardCompat.h"
30#include "llvm/Support/Path.h"
31#include "llvm/Support/TimeProfiler.h"
42 explicit ActionCommentHandler(Sema &S) : S(S) { }
44 bool HandleComment(Preprocessor &PP, SourceRange Comment)
override {
45 S.ActOnComment(Comment);
51bool Parser::isTokenSEHExcept() {
52 if (!Tok.is(tok::identifier))
56 Ident__except = PP.getIdentifierInfo(
"__except");
58 const IdentifierInfo *Identifier = Tok.getIdentifierInfo();
59 if (Identifier == Ident__except)
64 Ident_except = PP.getIdentifierInfo(
"_except");
65 if (Identifier == Ident_except)
74 PreferredType(&actions.getASTContext(), pp.isCodeCompletionEnabled()),
75 Actions(actions), Diags(PP.getDiagnostics()), StackHandler(Diags),
76 GreaterThanIsOperator(
true), ColonIsSacred(
false),
77 ParsingGenericAssociationType(
false), InMessageExpression(
false),
78 ParsingInObjCContainer(
false), TemplateParameterDepth(0) {
81 Actions.CurScope =
nullptr;
83 CurParsedObjCImpl =
nullptr;
87 initializePragmaHandlers();
89 CommentSemaHandler.reset(
new ActionCommentHandler(actions));
90 PP.addCommentHandler(CommentSemaHandler.get());
92 PP.setCodeCompletionHandler(*
this);
94 Actions.ParseTypeFromStringCallback =
95 [
this](StringRef TypeStr, StringRef Context,
SourceLocation IncludeLoc) {
96 return this->ParseTypeFromString(TypeStr, Context, IncludeLoc);
101 return Diags.Report(Loc, DiagID);
105 return Diag(Tok.getLocation(), DiagID);
109 unsigned CompatDiagId) {
114 return DiagCompat(Tok.getLocation(), CompatDiagId);
133 switch (ExpectedTok) {
135 return Tok.is(tok::colon) ||
Tok.is(tok::comma);
136 default:
return false;
140bool Parser::ExpectAndConsume(
tok::TokenKind ExpectedTok,
unsigned DiagID,
142 if (Tok.is(ExpectedTok) || Tok.is(tok::code_completion)) {
149 SourceLocation Loc = Tok.getLocation();
151 DiagnosticBuilder DB =
Diag(Loc, DiagID);
154 if (DiagID == diag::err_expected)
156 else if (DiagID == diag::err_expected_after)
157 DB << Msg << ExpectedTok;
167 SourceLocation EndLoc = PP.getLocForEndOfToken(PrevTokLocation);
168 const char *Spelling =
nullptr;
172 DiagnosticBuilder DB =
176 if (DiagID == diag::err_expected)
178 else if (DiagID == diag::err_expected_after)
179 DB << Msg << ExpectedTok;
186bool Parser::ExpectAndConsumeSemi(
unsigned DiagID, StringRef TokenUsed) {
190 if (Tok.is(tok::code_completion)) {
191 handleUnexpectedCodeCompletionToken();
195 if ((Tok.is(tok::r_paren) || Tok.is(tok::r_square)) &&
197 Diag(Tok, diag::err_extraneous_token_before_semi)
198 << PP.getSpelling(Tok)
205 return ExpectAndConsume(tok::semi, DiagID , TokenUsed);
208bool Parser::isLikelyAtStartOfNewDeclaration() {
209 return Tok.isAtStartOfLine() &&
214 if (!Tok.is(tok::semi))
return;
216 bool HadMultipleSemis =
false;
217 SourceLocation StartLoc = Tok.getLocation();
218 SourceLocation EndLoc = Tok.getLocation();
221 while ((Tok.is(tok::semi) && !Tok.isAtStartOfLine())) {
222 HadMultipleSemis =
true;
223 EndLoc = Tok.getLocation();
231 Diag(StartLoc, diag::warn_cxx98_compat_top_level_semi)
234 Diag(StartLoc, diag::ext_extra_semi_cxx11)
240 Diag(StartLoc, diag::ext_extra_semi)
243 TST, Actions.getASTContext().getPrintingPolicy())
247 Diag(StartLoc, diag::warn_extra_semi_after_mem_fn_def)
251bool Parser::expectIdentifier() {
252 if (Tok.is(tok::identifier))
254 if (
const auto *II = Tok.getIdentifierInfo()) {
256 Diag(Tok, diag::err_expected_token_instead_of_objcxx_keyword)
257 << tok::identifier << Tok.getIdentifierInfo();
262 Diag(Tok, diag::err_expected) << tok::identifier;
270 SourceLocation SecondTokLoc = Tok.getLocation();
275 PP.getSourceManager().getFileID(FirstTokLoc) !=
276 PP.getSourceManager().getFileID(SecondTokLoc)) {
277 Diag(FirstTokLoc, diag::warn_compound_token_split_by_macro)
278 << (FirstTokKind == Tok.getKind()) << FirstTokKind << Tok.getKind()
279 <<
static_cast<int>(Op) << SourceRange(FirstTokLoc);
280 Diag(SecondTokLoc, diag::note_compound_token_split_second_token_here)
281 << (FirstTokKind == Tok.getKind()) << Tok.getKind()
282 << SourceRange(SecondTokLoc);
287 if (Tok.hasLeadingSpace() || Tok.isAtStartOfLine()) {
288 SourceLocation SpaceLoc = PP.getLocForEndOfToken(FirstTokLoc);
290 SpaceLoc = FirstTokLoc;
291 Diag(SpaceLoc, diag::warn_compound_token_split_by_whitespace)
292 << (FirstTokKind == Tok.getKind()) << FirstTokKind << Tok.getKind()
293 <<
static_cast<int>(Op) << SourceRange(FirstTokLoc, SecondTokLoc);
303 return (
static_cast<unsigned>(L) &
static_cast<unsigned>(R)) != 0;
309 bool isFirstTokenSkipped =
true;
312 for (
unsigned i = 0, NumToks = Toks.size(); i != NumToks; ++i) {
313 if (Tok.is(Toks[i])) {
326 if (Toks.size() == 1 && Toks[0] == tok::eof &&
329 while (Tok.isNot(tok::eof))
334 switch (Tok.getKind()) {
339 case tok::annot_pragma_openmp:
340 case tok::annot_attr_openmp:
341 case tok::annot_pragma_openmp_end:
343 if (OpenMPDirectiveParsing)
345 ConsumeAnnotationToken();
347 case tok::annot_pragma_openacc:
348 case tok::annot_pragma_openacc_end:
350 if (OpenACCDirectiveParsing)
352 ConsumeAnnotationToken();
354 case tok::annot_module_begin:
355 case tok::annot_module_end:
356 case tok::annot_module_include:
362 case tok::code_completion:
364 handleUnexpectedCodeCompletionToken();
406 if (ParenCount && !isFirstTokenSkipped)
411 if (BracketCount && !isFirstTokenSkipped)
416 if (BraceCount && !isFirstTokenSkipped)
430 isFirstTokenSkipped =
false;
439 if (NumCachedScopes) {
440 Scope *N = ScopeCache[--NumCachedScopes];
442 Actions.CurScope = N;
453 Actions.ActOnPopScope(Tok.getLocation(),
getCurScope());
456 Actions.CurScope = OldScope->
getParent();
458 if (NumCachedScopes == ScopeCacheSize)
461 ScopeCache[NumCachedScopes++] = OldScope;
464Parser::ParseScopeFlags::ParseScopeFlags(
Parser *
Self,
unsigned ScopeFlags,
466 : CurScope(ManageFlags ?
Self->getCurScope() :
nullptr) {
468 OldFlags = CurScope->getFlags();
469 CurScope->setFlags(ScopeFlags);
473Parser::ParseScopeFlags::~ParseScopeFlags() {
475 CurScope->setFlags(OldFlags);
486 Actions.CurScope =
nullptr;
489 for (
unsigned i = 0, e = NumCachedScopes; i != e; ++i)
490 delete ScopeCache[i];
492 resetPragmaHandlers();
494 PP.removeCommentHandler(CommentSemaHandler.get());
496 PP.clearCodeCompletionHandler();
498 DestroyTemplateIds();
503 assert(
getCurScope() ==
nullptr &&
"A scope is already active?");
511 &PP.getIdentifierTable().get(
"in");
513 &PP.getIdentifierTable().get(
"out");
515 &PP.getIdentifierTable().get(
"inout");
517 &PP.getIdentifierTable().get(
"oneway");
519 &PP.getIdentifierTable().get(
"bycopy");
521 &PP.getIdentifierTable().get(
"byref");
523 &PP.getIdentifierTable().get(
"nonnull");
525 &PP.getIdentifierTable().get(
"nullable");
527 &PP.getIdentifierTable().get(
"null_unspecified");
530 Ident_instancetype =
nullptr;
531 Ident_final =
nullptr;
532 Ident_sealed =
nullptr;
533 Ident_abstract =
nullptr;
534 Ident_override =
nullptr;
535 Ident_GNU_final =
nullptr;
537 Ident_super = &PP.getIdentifierTable().get(
"super");
539 Ident_vector =
nullptr;
540 Ident_bool =
nullptr;
541 Ident_Bool =
nullptr;
542 Ident_pixel =
nullptr;
544 Ident_vector = &PP.getIdentifierTable().get(
"vector");
545 Ident_bool = &PP.getIdentifierTable().get(
"bool");
546 Ident_Bool = &PP.getIdentifierTable().get(
"_Bool");
549 Ident_pixel = &PP.getIdentifierTable().get(
"pixel");
551 Ident_introduced =
nullptr;
552 Ident_deprecated =
nullptr;
553 Ident_obsoleted =
nullptr;
554 Ident_unavailable =
nullptr;
555 Ident_strict =
nullptr;
556 Ident_replacement =
nullptr;
558 Ident_language = Ident_defined_in = Ident_generated_declaration = Ident_USR =
561 Ident__except =
nullptr;
562 Ident_except =
nullptr;
564 Ident__exception_code = Ident__exception_info =
nullptr;
565 Ident__abnormal_termination = Ident___exception_code =
nullptr;
566 Ident___exception_info = Ident___abnormal_termination =
nullptr;
567 Ident_GetExceptionCode = Ident_GetExceptionInfo =
nullptr;
568 Ident_AbnormalTermination =
nullptr;
571 Ident__exception_info = PP.getIdentifierInfo(
"_exception_info");
572 Ident___exception_info = PP.getIdentifierInfo(
"__exception_info");
573 Ident_GetExceptionInfo = PP.getIdentifierInfo(
"GetExceptionInformation");
574 Ident__exception_code = PP.getIdentifierInfo(
"_exception_code");
575 Ident___exception_code = PP.getIdentifierInfo(
"__exception_code");
576 Ident_GetExceptionCode = PP.getIdentifierInfo(
"GetExceptionCode");
577 Ident__abnormal_termination = PP.getIdentifierInfo(
"_abnormal_termination");
578 Ident___abnormal_termination = PP.getIdentifierInfo(
"__abnormal_termination");
579 Ident_AbnormalTermination = PP.getIdentifierInfo(
"AbnormalTermination");
581 PP.SetPoisonReason(Ident__exception_code,diag::err_seh___except_block);
582 PP.SetPoisonReason(Ident___exception_code,diag::err_seh___except_block);
583 PP.SetPoisonReason(Ident_GetExceptionCode,diag::err_seh___except_block);
584 PP.SetPoisonReason(Ident__exception_info,diag::err_seh___except_filter);
585 PP.SetPoisonReason(Ident___exception_info,diag::err_seh___except_filter);
586 PP.SetPoisonReason(Ident_GetExceptionInfo,diag::err_seh___except_filter);
587 PP.SetPoisonReason(Ident__abnormal_termination,diag::err_seh___finally_block);
588 PP.SetPoisonReason(Ident___abnormal_termination,diag::err_seh___finally_block);
589 PP.SetPoisonReason(Ident_AbnormalTermination,diag::err_seh___finally_block);
592 Actions.Initialize();
598void Parser::DestroyTemplateIds() {
606 Actions.ActOnStartOfTranslationUnit();
618 if (NoTopLevelDecls && !Actions.getASTContext().getExternalSource() &&
620 Diag(diag::ext_empty_translation_unit);
622 return NoTopLevelDecls;
627 DestroyTemplateIdAnnotationsRAIIObj CleanupRAII(*
this);
630 switch (Tok.getKind()) {
631 case tok::annot_pragma_unused:
632 HandlePragmaUnused();
648 Result = ParseModuleDecl(ImportState);
658 case tok::annot_module_include: {
659 auto Loc = Tok.getLocation();
660 Module *Mod =
reinterpret_cast<Module *
>(Tok.getAnnotationValue());
664 Actions.ActOnAnnotModuleInclude(Loc, Mod);
671 ConsumeAnnotationToken();
675 case tok::annot_module_begin:
676 Actions.ActOnAnnotModuleBegin(
678 reinterpret_cast<Module *
>(Tok.getAnnotationValue()));
679 ConsumeAnnotationToken();
683 case tok::annot_module_end:
684 Actions.ActOnAnnotModuleEnd(
686 reinterpret_cast<Module *
>(Tok.getAnnotationValue()));
687 ConsumeAnnotationToken();
693 if (PP.getMaxTokens() != 0 && PP.getTokenCount() > PP.getMaxTokens()) {
694 PP.Diag(Tok.getLocation(), diag::warn_max_tokens_total)
695 << PP.getTokenCount() << PP.getMaxTokens();
698 PP.Diag(OverrideLoc, diag::note_max_tokens_total_override);
703 Actions.SetLateTemplateParser(LateTemplateParserCallback,
this);
704 Actions.ActOnEndOfTranslationUnit();
717 while (MaybeParseCXX11Attributes(DeclAttrs) ||
718 MaybeParseGNUAttributes(DeclSpecAttrs))
721 Result = ParseExternalDeclaration(DeclAttrs, DeclSpecAttrs);
731 else if (ImportState ==
743 DestroyTemplateIdAnnotationsRAIIObj CleanupRAII(*
this);
751 Decl *SingleDecl =
nullptr;
752 switch (
Tok.getKind()) {
753 case tok::annot_pragma_vis:
754 HandlePragmaVisibility();
756 case tok::annot_pragma_pack:
759 case tok::annot_pragma_msstruct:
760 HandlePragmaMSStruct();
762 case tok::annot_pragma_align:
765 case tok::annot_pragma_weak:
768 case tok::annot_pragma_weakalias:
769 HandlePragmaWeakAlias();
771 case tok::annot_pragma_redefine_extname:
772 HandlePragmaRedefineExtname();
774 case tok::annot_pragma_fp_contract:
775 HandlePragmaFPContract();
777 case tok::annot_pragma_fenv_access:
778 case tok::annot_pragma_fenv_access_ms:
779 HandlePragmaFEnvAccess();
781 case tok::annot_pragma_fenv_round:
782 HandlePragmaFEnvRound();
784 case tok::annot_pragma_cx_limited_range:
785 HandlePragmaCXLimitedRange();
787 case tok::annot_pragma_float_control:
788 HandlePragmaFloatControl();
790 case tok::annot_pragma_fp:
793 case tok::annot_pragma_opencl_extension:
794 HandlePragmaOpenCLExtension();
796 case tok::annot_attr_openmp:
797 case tok::annot_pragma_openmp: {
799 return ParseOpenMPDeclarativeDirectiveWithExtDecl(AS, Attrs);
801 case tok::annot_pragma_openacc: {
806 case tok::annot_pragma_ms_pointers_to_members:
807 HandlePragmaMSPointersToMembers();
809 case tok::annot_pragma_ms_vtordisp:
810 HandlePragmaMSVtorDisp();
812 case tok::annot_pragma_ms_pragma:
813 HandlePragmaMSPragma();
815 case tok::annot_pragma_dump:
818 case tok::annot_pragma_attribute:
819 HandlePragmaAttribute();
821 case tok::annot_pragma_export:
822 HandlePragmaExport();
827 Actions.ActOnEmptyDeclaration(
getCurScope(), Attrs, Tok.getLocation());
831 Diag(Tok, diag::err_extraneous_closing_brace);
835 Diag(Tok, diag::err_expected_external_declaration);
837 case tok::kw___extension__: {
839 ExtensionRAIIObject O(Diags);
841 return ParseExternalDeclaration(Attrs, DeclSpecAttrs);
844 ProhibitAttributes(Attrs);
846 SourceLocation StartLoc = Tok.getLocation();
847 SourceLocation EndLoc;
856 if (!SL->getString().trim().empty())
857 Diag(StartLoc, diag::err_gnu_inline_asm_disabled);
860 ExpectAndConsume(tok::semi, diag::err_expected_after,
861 "top-level asm block");
865 SingleDecl = Actions.ActOnFileScopeAsmDecl(
Result.get(), StartLoc, EndLoc);
869 return ParseObjCAtDirectives(Attrs, DeclSpecAttrs);
873 Diag(Tok, diag::err_expected_external_declaration);
877 SingleDecl = ParseObjCMethodDefinition();
879 case tok::code_completion:
881 if (CurParsedObjCImpl) {
883 Actions.CodeCompletion().CodeCompleteObjCMethodDecl(
890 if (CurParsedObjCImpl) {
892 }
else if (PP.isIncrementalProcessingEnabled()) {
897 Actions.CodeCompletion().CodeCompleteOrdinaryName(
getCurScope(), PCC);
899 case tok::kw_import: {
902 Diag(Tok, diag::err_unexpected_module_or_import_decl)
907 SingleDecl = ParseModuleImport(SourceLocation(), IS);
911 ProhibitAttributes(Attrs);
912 SingleDecl = ParseExportDeclaration();
919 case tok::kw_namespace:
920 case tok::kw_typedef:
921 case tok::kw_template:
922 case tok::kw_static_assert:
923 case tok::kw__Static_assert:
926 SourceLocation DeclEnd;
931 case tok::kw_cbuffer:
932 case tok::kw_tbuffer:
934 SourceLocation DeclEnd;
946 SourceLocation DeclEnd;
957 if (NextKind == tok::kw_namespace) {
958 SourceLocation DeclEnd;
965 if (NextKind == tok::kw_template) {
968 SourceLocation DeclEnd;
977 ProhibitAttributes(Attrs);
978 ProhibitAttributes(DeclSpecAttrs);
982 DiagCompat(ExternLoc, diag_compat::extern_template)
983 << SourceRange(ExternLoc, TemplateLoc);
984 SourceLocation DeclEnd;
986 TemplateLoc, DeclEnd, Attrs);
990 case tok::kw___if_exists:
991 case tok::kw___if_not_exists:
992 ParseMicrosoftIfExistsExternalDeclaration();
996 Diag(Tok, diag::err_unexpected_module_or_import_decl) <<
false;
1002 if (Tok.isEditorPlaceholder()) {
1007 !isDeclarationStatement(
true))
1008 return ParseTopLevelStmtDecl();
1012 return ParseDeclarationOrFunctionDefinition(Attrs, DeclSpecAttrs, DS);
1017 return Actions.ConvertDeclToDeclGroup(SingleDecl);
1020bool Parser::isDeclarationAfterDeclarator() {
1024 if (KW.
is(tok::kw_default) || KW.
is(tok::kw_delete))
1028 return Tok.is(tok::equal) ||
1029 Tok.is(tok::comma) ||
1030 Tok.is(tok::semi) ||
1031 Tok.is(tok::kw_asm) ||
1032 Tok.is(tok::kw___attribute) ||
1034 Tok.is(tok::l_paren));
1037bool Parser::isStartOfFunctionDefinition(
const ParsingDeclarator &Declarator) {
1038 assert(
Declarator.isFunctionDeclarator() &&
"Isn't a function declarator");
1039 if (Tok.is(tok::l_brace))
1044 Declarator.getFunctionTypeInfo().isKNRPrototype())
1049 return KW.
is(tok::kw_default) || KW.
is(tok::kw_delete);
1052 return Tok.is(tok::colon) ||
1053 Tok.is(tok::kw_try);
1057 ParsedAttributes &Attrs, ParsedAttributes &DeclSpecAttrs,
1063 "expected uninitialised source range");
1068 ParsedTemplateInfo TemplateInfo;
1071 ParseDeclarationSpecifiers(DS, TemplateInfo, AS,
1072 DeclSpecContext::DSC_top_level);
1077 DS, AS, DeclSpecContext::DSC_top_level))
1082 if (Tok.is(tok::semi)) {
1085 SourceLocation CorrectLocationForAttributes{};
1089 if (
const auto *ED = dyn_cast_or_null<EnumDecl>(DS.
getRepAsDecl())) {
1090 CorrectLocationForAttributes =
1091 PP.getLocForEndOfToken(ED->getEnumKeyRange().getEnd());
1094 if (CorrectLocationForAttributes.
isInvalid()) {
1095 const auto &Policy = Actions.getASTContext().getPrintingPolicy();
1098 CorrectLocationForAttributes =
1102 ProhibitAttributes(Attrs, CorrectLocationForAttributes);
1104 RecordDecl *AnonRecord =
nullptr;
1105 Decl *TheDecl = Actions.ParsedFreeStandingDeclSpec(
1108 Actions.ActOnDefinedDeclarationSpecifier(TheDecl);
1110 Decl* decls[] = {AnonRecord, TheDecl};
1111 return Actions.BuildDeclaratorGroup(decls);
1113 return Actions.ConvertDeclToDeclGroup(TheDecl);
1117 Actions.ActOnDefinedDeclarationSpecifier(DS.
getRepAsDecl());
1124 if (!Tok.isObjCAtKeyword(tok::objc_interface) &&
1125 !Tok.isObjCAtKeyword(tok::objc_protocol) &&
1126 !Tok.isObjCAtKeyword(tok::objc_implementation)) {
1127 Diag(Tok, diag::err_objc_unexpected_attr);
1135 const char *PrevSpec =
nullptr;
1138 Actions.getASTContext().getPrintingPolicy()))
1139 Diag(AtLoc, DiagID) << PrevSpec;
1141 if (Tok.isObjCAtKeyword(tok::objc_protocol))
1142 return ParseObjCAtProtocolDeclaration(AtLoc, DS.
getAttributes());
1144 if (Tok.isObjCAtKeyword(tok::objc_implementation))
1145 return ParseObjCAtImplementationDeclaration(AtLoc, DS.
getAttributes());
1147 return Actions.ConvertDeclToDeclGroup(
1148 ParseObjCAtInterfaceDeclaration(AtLoc, DS.
getAttributes()));
1157 ProhibitAttributes(Attrs);
1159 return Actions.ConvertDeclToDeclGroup(TheDecl);
1166 ParsedAttributes &Attrs, ParsedAttributes &DeclSpecAttrs,
1170 llvm::TimeTraceScope TimeScope(
"ParseDeclarationOrFunctionDefinition", [&]() {
1171 return Tok.getLocation().printToString(
1172 Actions.getASTContext().getSourceManager());
1176 return ParseDeclOrFunctionDefInternal(Attrs, DeclSpecAttrs, *DS, AS);
1178 ParsingDeclSpec PDS(*
this);
1182 ObjCDeclContextSwitch ObjCDC(*
this);
1184 return ParseDeclOrFunctionDefInternal(Attrs, DeclSpecAttrs, PDS, AS);
1188Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D,
1189 const ParsedTemplateInfo &TemplateInfo,
1190 LateParsedAttrList *LateParsedAttrs) {
1191 llvm::TimeTraceScope TimeScope(
"ParseFunctionDefinition", [&]() {
1192 return Actions.GetNameForDeclarator(D).getName().getAsString();
1198 TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
1207 const char *PrevSpec;
1209 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy();
1221 ParseKNRParamDeclarations(D);
1225 if (Tok.isNot(tok::l_brace) &&
1227 (Tok.isNot(tok::colon) && Tok.isNot(tok::kw_try) &&
1228 Tok.isNot(tok::equal)))) {
1229 Diag(Tok, diag::err_expected_fn_body);
1235 if (Tok.isNot(tok::l_brace))
1241 if (Tok.isNot(tok::equal)) {
1243 if (AL.isKnownToGCC() && !AL.isStandardAttributeSyntax())
1244 Diag(AL.getLoc(), diag::warn_attribute_on_function_definition) << AL;
1249 if (
getLangOpts().DelayedTemplateParsing && Tok.isNot(tok::equal) &&
1251 LateParsedAttrs->empty() && Actions.canDelayFunctionBody(D)) {
1259 Decl *DP = Actions.HandleDeclarator(ParentScope, D,
1264 if (SkipFunctionBodies && (!DP || Actions.canSkipFunctionBody(DP)) &&
1265 trySkippingFunctionBody()) {
1267 return Actions.ActOnSkippedFunctionBody(DP);
1271 LexTemplateFunctionForLateParsing(Toks);
1275 Actions.CheckForFunctionRedefinition(FnD);
1276 Actions.MarkAsLateParsedTemplate(FnD, DP, Toks);
1280 if (CurParsedObjCImpl && !TemplateInfo.TemplateParams &&
1281 (Tok.is(tok::l_brace) || Tok.is(tok::kw_try) || Tok.is(tok::colon)) &&
1282 Actions.CurContext->isTranslationUnit()) {
1288 Decl *FuncDecl = Actions.HandleDeclarator(ParentScope, D,
1294 StashAwayMethodOrFunctionBodyTokens(FuncDecl);
1295 CurParsedObjCImpl->HasCFunction =
true;
1307 StringLiteral *DeletedMessage =
nullptr;
1309 SourceLocation KWLoc;
1314 DiagCompat(KWLoc, diag_compat::defaulted_deleted_function)
1317 DeletedMessage = ParseCXXDeletedFunctionMessage();
1320 DiagCompat(KWLoc, diag_compat::defaulted_deleted_function)
1325 llvm_unreachable(
"function definition after = not 'delete' or 'default'");
1328 if (Tok.is(tok::comma)) {
1329 Diag(KWLoc, diag::err_default_delete_in_multiple_declaration)
1332 }
else if (ExpectAndConsume(tok::semi, diag::err_expected_after,
1340 Sema::FPFeaturesStateRAII SaveFPFeatures(Actions);
1344 SkipBodyInfo SkipBody;
1346 TemplateInfo.TemplateParams
1347 ? *TemplateInfo.TemplateParams
1349 &SkipBody, BodyKind);
1366 Actions.PopExpressionEvaluationContext();
1378 Actions.SetFunctionBodyKind(Res, KWLoc, BodyKind, DeletedMessage);
1379 Stmt *GeneratedBody = Res ? Res->
getBody() :
nullptr;
1380 Actions.ActOnFinishFunctionBody(Res, GeneratedBody,
false);
1386 if (
const auto *
Template = dyn_cast_if_present<FunctionTemplateDecl>(Res);
1388 Template->getTemplateParameters()->getParam(0)->isImplicit())
1391 CurTemplateDepthTracker.addDepth(1);
1394 if (LateParsedAttrs)
1395 ParseLexedAttributeList(*LateParsedAttrs, Res,
false,
1398 if (SkipFunctionBodies && (!Res || Actions.canSkipFunctionBody(Res)) &&
1399 trySkippingFunctionBody()) {
1401 Actions.ActOnSkippedFunctionBody(Res);
1402 return Actions.ActOnFinishFunctionBody(Res,
nullptr,
false);
1405 return ParseFunctionBody(Res, BodyScope);
1409 if (Tok.is(tok::kw_try))
1410 return ParseFunctionTryBlock(D, BodyScope);
1414 if (Tok.is(tok::colon)) {
1415 ParseConstructorInitializer(D);
1418 if (!Tok.is(tok::l_brace)) {
1422 Actions.ActOnFinishFunctionBody(D,
nullptr);
1426 Actions.ActOnDefaultCtorInitializers(D);
1428 return ParseFunctionStatementBody(D, BodyScope);
1431void Parser::SkipFunctionBody() {
1432 if (Tok.is(tok::equal)) {
1437 bool IsFunctionTryBlock = Tok.is(tok::kw_try);
1438 if (IsFunctionTryBlock)
1442 if (ConsumeAndStoreFunctionPrologue(Skipped))
1446 while (IsFunctionTryBlock && Tok.is(tok::kw_catch)) {
1453void Parser::ParseKNRParamDeclarations(Declarator &D) {
1464 SourceLocation DSStart = Tok.getLocation();
1467 DeclSpec DS(AttrFactory);
1468 ParsedTemplateInfo TemplateInfo;
1469 ParseDeclarationSpecifiers(DS, TemplateInfo);
1477 Diag(DSStart, diag::err_declaration_does_not_declare_param);
1486 diag::err_invalid_storage_class_in_func_decl);
1491 diag::err_invalid_storage_class_in_func_decl);
1498 ParseDeclarator(ParmDeclarator);
1503 MaybeParseGNUAttributes(ParmDeclarator);
1507 Actions.ActOnParamDeclarator(
getCurScope(), ParmDeclarator);
1511 ParmDeclarator.getIdentifier()) {
1515 for (
unsigned i = 0; ; ++i) {
1519 Diag(ParmDeclarator.getIdentifierLoc(), diag::err_no_matching_param)
1520 << ParmDeclarator.getIdentifier();
1524 if (FTI.
Params[i].
Ident == ParmDeclarator.getIdentifier()) {
1527 Diag(ParmDeclarator.getIdentifierLoc(),
1528 diag::err_param_redefinition)
1529 << ParmDeclarator.getIdentifier();
1540 if (Tok.isNot(tok::comma))
1543 ParmDeclarator.clear();
1549 ParseDeclarator(ParmDeclarator);
1553 if (!ExpectAndConsumeSemi(diag::err_expected_semi_declaration))
1563 Actions.ActOnFinishKNRParamDeclarations(
getCurScope(), D, Tok.getLocation());
1566ExprResult Parser::ParseAsmStringLiteral(
bool ForAsmLabel) {
1569 if (isTokenStringLiteral()) {
1575 if (!SL->isOrdinary()) {
1576 Diag(Tok, diag::err_asm_operand_wide_string_literal)
1577 << SL->isWide() << SL->getSourceRange();
1581 Tok.is(tok::l_paren)) {
1583 SourceLocation RParenLoc;
1586 EnterExpressionEvaluationContext ConstantEvaluated(
1588 AsmString = ParseParenExpression(
1592 AsmString = Actions.ActOnConstantExpression(AsmString);
1597 Diag(Tok, diag::err_asm_expected_string) << (
1598 (
getLangOpts().CPlusPlus11 && !ForAsmLabel) ? 0 : 1);
1601 return Actions.ActOnGCCAsmStmtString(AsmString.
get(), ForAsmLabel);
1604ExprResult Parser::ParseSimpleAsm(
bool ForAsmLabel, SourceLocation *EndLoc) {
1605 assert(Tok.is(tok::kw_asm) &&
"Not an asm!");
1608 if (isGNUAsmQualifier(Tok)) {
1610 SourceRange RemovalRange(PP.getLocForEndOfToken(Loc),
1611 PP.getLocForEndOfToken(Tok.getLocation()));
1612 Diag(Tok, diag::err_global_asm_qualifier_ignored)
1613 << GNUAsmQualifiers::getQualifierName(getGNUAsmQualifier(Tok))
1619 if (
T.consumeOpen()) {
1620 Diag(Tok, diag::err_expected_lparen_after) <<
"asm";
1626 if (!
Result.isInvalid()) {
1630 *EndLoc =
T.getCloseLocation();
1633 *EndLoc = Tok.getLocation();
1640TemplateIdAnnotation *Parser::takeTemplateIdAnnotation(
const Token &tok) {
1641 assert(tok.
is(tok::annot_template_id) &&
"Expected template-id token");
1642 TemplateIdAnnotation *
1647void Parser::AnnotateScopeToken(CXXScopeSpec &SS,
bool IsNewAnnotation) {
1650 if (PP.isBacktrackEnabled())
1651 PP.RevertCachedTokens(1);
1653 PP.EnterToken(Tok,
true);
1654 Tok.setKind(tok::annot_cxxscope);
1655 Tok.setAnnotationValue(Actions.SaveNestedNameSpecifierAnnotation(SS));
1656 Tok.setAnnotationRange(SS.
getRange());
1661 if (IsNewAnnotation)
1662 PP.AnnotateCachedTokens(Tok);
1666Parser::TryAnnotateName(CorrectionCandidateCallback *CCC,
1668 assert(Tok.is(tok::identifier) || Tok.is(tok::annot_cxxscope));
1670 const bool EnteringContext =
false;
1671 const bool WasScopeAnnotation = Tok.is(tok::annot_cxxscope);
1675 ParseOptionalCXXScopeSpecifier(SS,
nullptr,
1680 if (Tok.isNot(tok::identifier) || SS.
isInvalid()) {
1682 AllowImplicitTypename))
1687 IdentifierInfo *Name = Tok.getIdentifierInfo();
1688 SourceLocation NameLoc = Tok.getLocation();
1692 if (isTentativelyDeclared(Name) && SS.
isEmpty()) {
1696 AllowImplicitTypename))
1708 Sema::NameClassification Classification = Actions.ClassifyName(
1716 isTemplateArgumentList(1) == TPResult::False) {
1718 Token FakeNext =
Next;
1719 FakeNext.
setKind(tok::unknown);
1721 Actions.ClassifyName(
getCurScope(), SS, Name, NameLoc, FakeNext,
1722 SS.
isEmpty() ? CCC :
nullptr);
1725 switch (Classification.
getKind()) {
1731 Tok.setIdentifierInfo(Name);
1733 PP.TypoCorrectToken(Tok);
1735 AnnotateScopeToken(SS, !WasScopeAnnotation);
1744 if (TryAltiVecVectorToken())
1749 SourceLocation BeginLoc = NameLoc;
1756 QualType
T = Actions.GetTypeFromParser(Ty);
1761 SourceLocation NewEndLoc;
1763 = parseObjCTypeArgsAndProtocolQualifiers(IdentifierLoc, Ty,
1768 else if (Tok.is(tok::eof))
1772 Tok.setKind(tok::annot_typename);
1773 setTypeAnnotation(Tok, Ty);
1774 Tok.setAnnotationEndLoc(Tok.getLocation());
1775 Tok.setLocation(BeginLoc);
1776 PP.AnnotateCachedTokens(Tok);
1781 Tok.setKind(tok::annot_overload_set);
1783 Tok.setAnnotationEndLoc(NameLoc);
1786 PP.AnnotateCachedTokens(Tok);
1790 if (TryAltiVecVectorToken())
1795 Tok.setKind(tok::annot_non_type);
1797 Tok.setLocation(NameLoc);
1798 Tok.setAnnotationEndLoc(NameLoc);
1799 PP.AnnotateCachedTokens(Tok);
1801 AnnotateScopeToken(SS, !WasScopeAnnotation);
1806 Tok.setKind(Classification.
getKind() ==
1808 ? tok::annot_non_type_undeclared
1809 : tok::annot_non_type_dependent);
1810 setIdentifierAnnotation(Tok, Name);
1811 Tok.setLocation(NameLoc);
1812 Tok.setAnnotationEndLoc(NameLoc);
1813 PP.AnnotateCachedTokens(Tok);
1815 AnnotateScopeToken(SS, !WasScopeAnnotation);
1819 if (
Next.isNot(tok::less)) {
1823 AnnotateScopeToken(SS, !WasScopeAnnotation);
1831 bool IsConceptName =
1837 if (
Next.is(tok::less))
1839 if (AnnotateTemplateIdToken(
1846 AnnotateScopeToken(SS, !WasScopeAnnotation);
1853 AnnotateScopeToken(SS, !WasScopeAnnotation);
1858 SourceLocation TokenEndLoc = PP.getLocForEndOfToken(PrevTokLocation);
1859 return TokenEndLoc.
isValid() ? TokenEndLoc : Tok.getLocation();
1862bool Parser::TryKeywordIdentFallback(
bool DisableKeyword) {
1863 assert(
Tok.isNot(tok::identifier));
1869 Tok.setKind(tok::identifier);
1873 Diag(
Tok, diag::ext_keyword_as_ident)
1878 Tok.setKind(tok::identifier);
1884 assert((Tok.is(tok::identifier) || Tok.is(tok::coloncolon) ||
1885 Tok.is(tok::kw_typename) || Tok.is(tok::annot_cxxscope) ||
1886 Tok.is(tok::kw_decltype) || Tok.is(tok::annot_template_id) ||
1887 Tok.is(tok::kw___super) || Tok.is(tok::kw_auto) ||
1888 Tok.is(tok::annot_pack_indexing_type)) &&
1889 "Cannot be a type or scope token!");
1891 if (Tok.is(tok::kw_typename)) {
1900 PP.Lex(TypedefToken);
1902 PP.EnterToken(Tok,
true);
1905 Diag(Tok.getLocation(), diag::warn_expected_qualified_after_typename);
1917 if (ParseOptionalCXXScopeSpecifier(SS,
nullptr,
1923 if (Tok.is(tok::identifier) || Tok.is(tok::annot_template_id) ||
1924 Tok.is(tok::annot_decltype)) {
1926 if (Tok.is(tok::annot_decltype) ||
1928 Tok.isAnnotation())) {
1929 unsigned DiagID = diag::err_expected_qualified_after_typename;
1933 DiagID = diag::warn_expected_qualified_after_typename;
1934 Diag(Tok.getLocation(), DiagID);
1938 if (Tok.isEditorPlaceholder())
1941 Diag(Tok.getLocation(), diag::err_expected_qualified_after_typename);
1945 bool TemplateKWPresent =
false;
1946 if (Tok.is(tok::kw_template)) {
1948 TemplateKWPresent =
true;
1952 if (Tok.is(tok::identifier)) {
1954 Diag(Tok.getLocation(),
1955 diag::missing_template_arg_list_after_template_kw);
1958 Ty = Actions.ActOnTypenameType(
getCurScope(), TypenameLoc, SS,
1959 *Tok.getIdentifierInfo(),
1961 }
else if (Tok.is(tok::annot_template_id)) {
1964 Diag(Tok, diag::err_typename_refers_to_non_type_template)
1965 << Tok.getAnnotationRange();
1974 : Actions.ActOnTypenameType(
1978 TemplateArgsPtr, TemplateId->
RAngleLoc);
1980 Diag(Tok, diag::err_expected_type_name_after_typename)
1986 Tok.setKind(tok::annot_typename);
1987 setTypeAnnotation(Tok, Ty);
1988 Tok.setAnnotationEndLoc(EndLoc);
1989 Tok.setLocation(TypenameLoc);
1990 PP.AnnotateCachedTokens(Tok);
1995 bool WasScopeAnnotation = Tok.is(tok::annot_cxxscope);
1999 if (ParseOptionalCXXScopeSpecifier(
2003 IsAddressOfOperand))
2007 AllowImplicitTypename);
2013 if (Tok.is(tok::identifier)) {
2016 *Tok.getIdentifierInfo(), Tok.getLocation(),
getCurScope(), &SS,
2020 true, AllowImplicitTypename)) {
2025 QualType T = Actions.GetTypeFromParser(Ty);
2030 (
T->isObjCObjectType() ||
T->isObjCObjectPointerType())) {
2040 else if (Tok.is(tok::eof))
2046 Tok.setKind(tok::annot_typename);
2047 setTypeAnnotation(Tok, Ty);
2048 Tok.setAnnotationEndLoc(Tok.getLocation());
2049 Tok.setLocation(BeginLoc);
2053 PP.AnnotateCachedTokens(Tok);
2070 TemplateName.setIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
2071 bool MemberOfUnknownSpecialization;
2076 MemberOfUnknownSpecialization)) {
2080 isTemplateArgumentList(1) != TPResult::False) {
2100 if (Tok.is(tok::annot_template_id)) {
2107 AnnotateTemplateIdTokenAsType(SS, AllowImplicitTypename);
2114 Tok.is(tok::coloncolon)) {
2123 AnnotateScopeToken(SS, IsNewScope);
2129 "Call sites of this function should be guarded by checking for C++");
2133 if (ParseOptionalCXXScopeSpecifier(SS,
nullptr,
2140 AnnotateScopeToken(SS,
true);
2144bool Parser::isTokenEqualOrEqualTypo() {
2150 case tok::starequal:
2151 case tok::plusequal:
2152 case tok::minusequal:
2153 case tok::exclaimequal:
2154 case tok::slashequal:
2155 case tok::percentequal:
2156 case tok::lessequal:
2157 case tok::lesslessequal:
2158 case tok::greaterequal:
2159 case tok::greatergreaterequal:
2160 case tok::caretequal:
2161 case tok::pipeequal:
2162 case tok::equalequal:
2163 Diag(
Tok, diag::err_invalid_token_after_declarator_suggest_equal)
2172SourceLocation Parser::handleUnexpectedCodeCompletionToken() {
2173 assert(Tok.is(tok::code_completion));
2174 PrevTokLocation = Tok.getLocation();
2177 if (S->isFunctionScope()) {
2179 Actions.CodeCompletion().CodeCompleteOrdinaryName(
2181 return PrevTokLocation;
2184 if (S->isClassScope()) {
2186 Actions.CodeCompletion().CodeCompleteOrdinaryName(
2188 return PrevTokLocation;
2193 Actions.CodeCompletion().CodeCompleteOrdinaryName(
2195 return PrevTokLocation;
2200void Parser::CodeCompleteDirective(
bool InConditional) {
2201 Actions.CodeCompletion().CodeCompletePreprocessorDirective(InConditional);
2205 Actions.CodeCompletion().CodeCompleteInPreprocessorConditionalExclusion(
2209void Parser::CodeCompleteMacroName(
bool IsDefinition) {
2210 Actions.CodeCompletion().CodeCompletePreprocessorMacroName(IsDefinition);
2214 Actions.CodeCompletion().CodeCompletePreprocessorExpression();
2217void Parser::CodeCompleteMacroArgument(IdentifierInfo *
Macro,
2218 MacroInfo *MacroInfo,
2219 unsigned ArgumentIndex) {
2220 Actions.CodeCompletion().CodeCompletePreprocessorMacroArgument(
2224void Parser::CodeCompleteIncludedFile(llvm::StringRef Dir,
bool IsAngled) {
2225 Actions.CodeCompletion().CodeCompleteIncludedFile(Dir, IsAngled);
2229 Actions.CodeCompletion().CodeCompleteNaturalLanguage();
2232void Parser::CodeCompleteModuleImport(SourceLocation ImportLoc,
2234 Actions.CodeCompletion().CodeCompleteModuleImport(ImportLoc, Path);
2237bool Parser::ParseMicrosoftIfExistsCondition(IfExistsCondition&
Result) {
2238 assert((Tok.is(tok::kw___if_exists) || Tok.is(tok::kw___if_not_exists)) &&
2239 "Expected '__if_exists' or '__if_not_exists'");
2240 Result.IsIfExists = Tok.is(tok::kw___if_exists);
2244 if (
T.consumeOpen()) {
2245 Diag(Tok, diag::err_expected_lparen_after)
2246 << (
Result.IsIfExists?
"__if_exists" :
"__if_not_exists");
2252 ParseOptionalCXXScopeSpecifier(
Result.SS,
nullptr,
2257 if (
Result.SS.isInvalid()) {
2263 SourceLocation TemplateKWLoc;
2268 false, &TemplateKWLoc,
2274 if (
T.consumeClose())
2302void Parser::ParseMicrosoftIfExistsExternalDeclaration() {
2303 IfExistsCondition
Result;
2304 if (ParseMicrosoftIfExistsCondition(
Result))
2308 if (
Braces.consumeOpen()) {
2309 Diag(Tok, diag::err_expected) << tok::l_brace;
2313 switch (
Result.Behavior) {
2319 llvm_unreachable(
"Cannot have a dependent external declaration");
2328 while (Tok.isNot(tok::r_brace) && !isEofOrEom()) {
2329 ParsedAttributes Attrs(AttrFactory);
2330 MaybeParseCXX11Attributes(Attrs);
2331 ParsedAttributes EmptyDeclSpecAttrs(AttrFactory);
2334 Actions.getASTConsumer().HandleTopLevelDecl(
Result.get());
2341 Token Introducer = Tok;
2342 SourceLocation StartLoc = Introducer.
getLocation();
2348 assert(Tok.is(tok::kw_module) &&
"not a module declaration");
2354 DiagnoseAndSkipCXX11Attributes();
2357 if (
getLangOpts().CPlusPlusModules && Tok.is(tok::semi)) {
2361 Diag(StartLoc, diag::err_global_module_introducer_not_at_start)
2362 << SourceRange(StartLoc, SemiLoc);
2366 Diag(StartLoc, diag::err_module_fragment_exported)
2370 return Actions.ActOnGlobalModuleFragmentDecl(ModuleLoc);
2374 if (
getLangOpts().CPlusPlusModules && Tok.is(tok::colon) &&
2377 Diag(StartLoc, diag::err_module_fragment_exported)
2382 DiagnoseAndSkipCXX11Attributes();
2383 ExpectAndConsumeSemi(diag::err_private_module_fragment_expected_semi);
2384 auto Result = Actions.ActOnPrivateModuleFragmentDecl(ModuleLoc, PrivateLoc);
2393 SmallVector<IdentifierLoc, 2> Path;
2394 if (ParseModuleName(ModuleLoc, Path,
false))
2398 SmallVector<IdentifierLoc, 2> Partition;
2399 if (Tok.is(tok::colon)) {
2402 Diag(ColonLoc, diag::err_unsupported_module_partition)
2403 << SourceRange(ColonLoc, Partition.back().getLoc());
2405 else if (ParseModuleName(ModuleLoc, Partition,
false))
2409 if (Tok.isNoneOf(tok::semi, tok::l_square, tok::eof)) {
2410 Diag(Tok, diag::err_unexpected_tok_after_module_name)
2411 << PP.getSpelling(Tok);
2416 ParsedAttributes Attrs(AttrFactory);
2417 MaybeParseCXX11Attributes(Attrs);
2418 ProhibitCXX11Attributes(Attrs, diag::err_attribute_not_module_attr,
2419 diag::err_keyword_not_module_attr,
2423 if (ExpectAndConsumeSemi(diag::err_expected_semi_after_module_or_import,
2427 return Actions.ActOnModuleDecl(StartLoc, ModuleLoc, MDK, Path, Partition,
2432Decl *Parser::ParseModuleImport(SourceLocation AtLoc,
2434 SourceLocation StartLoc = AtLoc.
isInvalid() ? Tok.getLocation() : AtLoc;
2436 SourceLocation ExportLoc;
2439 assert((AtLoc.
isInvalid() ? Tok.is(tok::kw_import)
2440 : Tok.isObjCAtKeyword(tok::objc_import)) &&
2441 "Improper start to module import");
2442 bool IsObjCAtImport = Tok.isObjCAtKeyword(tok::objc_import);
2446 SmallVector<IdentifierLoc, 2> Path;
2447 bool IsPartition =
false;
2448 Module *HeaderUnit =
nullptr;
2449 if (Tok.is(tok::header_name)) {
2454 }
else if (Tok.is(tok::annot_header_unit)) {
2456 HeaderUnit =
reinterpret_cast<Module *
>(Tok.getAnnotationValue());
2457 ConsumeAnnotationToken();
2458 }
else if (Tok.is(tok::colon)) {
2461 Diag(ColonLoc, diag::err_unsupported_module_partition)
2462 << SourceRange(ColonLoc, Path.back().getLoc());
2464 else if (ParseModuleName(ColonLoc, Path,
true))
2469 if (ParseModuleName(ImportLoc, Path,
true))
2473 ParsedAttributes Attrs(AttrFactory);
2474 MaybeParseCXX11Attributes(Attrs);
2476 ProhibitCXX11Attributes(Attrs, diag::err_attribute_not_import_attr,
2477 diag::err_keyword_not_import_attr,
2484 bool IsCXX20NamedModuleImport =
2485 getLangOpts().CPlusPlusModules && !IsObjCAtImport && !Path.empty();
2487 if (PP.hadModuleLoaderFatalFailure() && !IsCXX20NamedModuleImport) {
2494 bool SeenError =
true;
2495 switch (ImportState) {
2507 Diag(ImportLoc, diag::err_partition_import_outside_module);
2519 if (IsPartition || (HeaderUnit && HeaderUnit->
Kind !=
2521 Diag(ImportLoc, diag::err_import_in_wrong_fragment)
2530 Diag(ImportLoc, diag::err_import_not_allowed_here);
2546 bool LexedSemi =
false;
2549 !ExpectAndConsumeSemi(diag::err_expected_semi_after_module_or_import,
2552 LexedSemi = !ExpectAndConsumeSemi(diag::err_module_expected_semi);
2563 Actions.ActOnModuleImport(StartLoc, ExportLoc, ImportLoc, HeaderUnit);
2564 else if (!Path.empty())
2565 Import = Actions.ActOnModuleImport(StartLoc, ExportLoc, ImportLoc, Path,
2572 if (IsObjCAtImport && AtLoc.
isValid()) {
2573 auto &SrcMgr = PP.getSourceManager();
2574 auto FE = SrcMgr.getFileEntryRefForID(SrcMgr.getFileID(AtLoc));
2575 if (FE && llvm::sys::path::parent_path(FE->getDir().getName())
2576 .ends_with(
".framework"))
2577 Diags.Report(AtLoc, diag::warn_atimport_in_framework_header);
2583bool Parser::ParseModuleName(SourceLocation UseLoc,
2584 SmallVectorImpl<IdentifierLoc> &Path,
2586 if (Tok.isNot(tok::annot_module_name)) {
2590 ModuleNameLoc *NameLoc =
2591 static_cast<ModuleNameLoc *
>(Tok.getAnnotationValue());
2594 ConsumeAnnotationToken();
2598bool Parser::parseMisplacedModuleImport() {
2600 switch (Tok.getKind()) {
2601 case tok::annot_module_end:
2605 if (MisplacedModuleBeginCount) {
2606 --MisplacedModuleBeginCount;
2607 Actions.ActOnAnnotModuleEnd(
2609 reinterpret_cast<Module *
>(Tok.getAnnotationValue()));
2610 ConsumeAnnotationToken();
2617 case tok::annot_module_begin:
2619 Actions.ActOnAnnotModuleBegin(
2621 reinterpret_cast<Module *
>(Tok.getAnnotationValue()));
2622 ConsumeAnnotationToken();
2623 ++MisplacedModuleBeginCount;
2625 case tok::annot_module_include:
2628 Actions.ActOnAnnotModuleInclude(
2630 reinterpret_cast<Module *
>(Tok.getAnnotationValue()));
2631 ConsumeAnnotationToken();
2641void Parser::diagnoseUseOfC11Keyword(
const Token &Tok) {
2646 : diag::ext_c11_feature)
2650bool BalancedDelimiterTracker::diagnoseOverflow() {
2651 P.Diag(P.Tok, diag::err_bracket_depth_exceeded)
2652 << P.getLangOpts().BracketDepth;
2653 P.Diag(P.Tok, diag::note_bracket_depth);
2661 LOpen = P.Tok.getLocation();
2662 if (P.ExpectAndConsume(Kind, DiagID, Msg)) {
2663 if (SkipToTok != tok::unknown)
2668 if (getDepth() < P.getLangOpts().BracketDepth)
2671 return diagnoseOverflow();
2674bool BalancedDelimiterTracker::diagnoseMissingClose() {
2675 assert(!P.Tok.is(Close) &&
"Should have consumed closing delimiter");
2677 if (P.Tok.is(tok::annot_module_end))
2678 P.Diag(P.Tok, diag::err_missing_before_module_end) << Close;
2680 P.Diag(P.Tok, diag::err_expected) << Close;
2681 P.Diag(LOpen, diag::note_matching) << Kind;
2685 if (P.Tok.isNot(tok::r_paren) && P.Tok.isNot(tok::r_brace) &&
2686 P.Tok.isNot(tok::r_square) &&
2687 P.SkipUntil(Close, FinalToken,
2690 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)
Defines the clang::Preprocessor interface.
This file declares facilities that support code completion.
Defines a utilitiy for warning once when close to out of stack space.
Defines the clang::TokenKind enum and support functions.
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)
SourceLocation getBeginLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
void SetRangeEnd(SourceLocation Loc)
void SetRangeStart(SourceLocation Loc)
TSCS getThreadStorageClassSpec() const
ParsedAttributes & getAttributes()
static const TST TST_enum
static bool isDeclRep(TST T)
void takeAttributesAppendingingFrom(ParsedAttributes &attrs)
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
Decl - This represents one declaration (or definition), e.g.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
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)
void SetRangeEnd(SourceLocation Loc)
SetRangeEnd - Set the end of the source range to Loc, unless it's invalid.
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
A little helper class used to produce diagnostics.
static unsigned getCompatDiagId(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.
void revertTokenIDToIdentifier()
Revert TokenID to tok::identifier; used for GNU libstdc++ 4.2 compatibility.
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...
ModuleIdPath getModuleIdPath() const
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.
bool TryAnnotateTypeOrScopeToken(ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No, bool IsAddressOfOperand=false)
TryAnnotateTypeOrScopeToken - If the current token position is on a typename (possibly qualified in C...
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.
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 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.
SourceLocation getLocation() const
Return a source location identifier for the specified offset in the current file.
void setKind(tok::TokenKind K)
static Token createEof(SourceLocation Loc=SourceLocation(), const void *Data=nullptr)
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.
const char * getKeywordSpelling(TokenKind Kind) LLVM_READNONE
Determines the spelling of simple keyword and contextual keyword tokens like 'int' and 'dynamic_cast'...
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 '!
Top level wrappers for InstallAPI frontend operations.
TypeSpecifierType
Specifies the kind of type.
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
ArrayRef< IdentifierLoc > ModuleIdPath
A sequence of identifier/location pairs used to describe a particular module or submodule,...
@ 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.