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,
1380 Stmt *GeneratedBody = Res ? Res->
getBody() :
nullptr;
1381 Actions.ActOnFinishFunctionBody(Res, GeneratedBody,
false);
1387 if (
const auto *
Template = dyn_cast_if_present<FunctionTemplateDecl>(Res);
1389 Template->getTemplateParameters()->getParam(0)->isImplicit())
1392 CurTemplateDepthTracker.addDepth(1);
1395 if (LateParsedAttrs)
1396 ParseLexedAttributeList(*LateParsedAttrs, Res,
false,
1399 if (SkipFunctionBodies && (!Res || Actions.canSkipFunctionBody(Res)) &&
1400 trySkippingFunctionBody()) {
1402 Actions.ActOnSkippedFunctionBody(Res);
1403 return Actions.ActOnFinishFunctionBody(Res,
nullptr,
false);
1406 return ParseFunctionBody(Res, BodyScope);
1410 if (Tok.is(tok::kw_try))
1411 return ParseFunctionTryBlock(D, BodyScope);
1415 if (Tok.is(tok::colon)) {
1416 ParseConstructorInitializer(D);
1419 if (!Tok.is(tok::l_brace)) {
1423 Actions.ActOnFinishFunctionBody(D,
nullptr);
1427 Actions.ActOnDefaultCtorInitializers(D);
1429 return ParseFunctionStatementBody(D, BodyScope);
1432void Parser::SkipFunctionBody() {
1433 if (Tok.is(tok::equal)) {
1438 bool IsFunctionTryBlock = Tok.is(tok::kw_try);
1439 if (IsFunctionTryBlock)
1443 if (ConsumeAndStoreFunctionPrologue(Skipped))
1447 while (IsFunctionTryBlock && Tok.is(tok::kw_catch)) {
1454void Parser::ParseKNRParamDeclarations(Declarator &D) {
1465 SourceLocation DSStart = Tok.getLocation();
1468 DeclSpec DS(AttrFactory);
1469 ParsedTemplateInfo TemplateInfo;
1470 ParseDeclarationSpecifiers(DS, TemplateInfo);
1478 Diag(DSStart, diag::err_declaration_does_not_declare_param);
1487 diag::err_invalid_storage_class_in_func_decl);
1492 diag::err_invalid_storage_class_in_func_decl);
1499 ParseDeclarator(ParmDeclarator);
1504 MaybeParseGNUAttributes(ParmDeclarator);
1508 Actions.ActOnParamDeclarator(
getCurScope(), ParmDeclarator);
1512 ParmDeclarator.getIdentifier()) {
1516 for (
unsigned i = 0; ; ++i) {
1520 Diag(ParmDeclarator.getIdentifierLoc(), diag::err_no_matching_param)
1521 << ParmDeclarator.getIdentifier();
1525 if (FTI.
Params[i].
Ident == ParmDeclarator.getIdentifier()) {
1528 Diag(ParmDeclarator.getIdentifierLoc(),
1529 diag::err_param_redefinition)
1530 << ParmDeclarator.getIdentifier();
1541 if (Tok.isNot(tok::comma))
1544 ParmDeclarator.clear();
1550 ParseDeclarator(ParmDeclarator);
1554 if (!ExpectAndConsumeSemi(diag::err_expected_semi_declaration))
1564 Actions.ActOnFinishKNRParamDeclarations(
getCurScope(), D, Tok.getLocation());
1567ExprResult Parser::ParseAsmStringLiteral(
bool ForAsmLabel) {
1570 if (isTokenStringLiteral()) {
1576 if (!SL->isOrdinary()) {
1577 Diag(Tok, diag::err_asm_operand_wide_string_literal)
1578 << SL->isWide() << SL->getSourceRange();
1582 Tok.is(tok::l_paren)) {
1584 SourceLocation RParenLoc;
1587 EnterExpressionEvaluationContext ConstantEvaluated(
1589 AsmString = ParseParenExpression(
1593 AsmString = Actions.ActOnConstantExpression(AsmString);
1598 Diag(Tok, diag::err_asm_expected_string) << (
1599 (
getLangOpts().CPlusPlus11 && !ForAsmLabel) ? 0 : 1);
1602 return Actions.ActOnGCCAsmStmtString(AsmString.
get(), ForAsmLabel);
1605ExprResult Parser::ParseSimpleAsm(
bool ForAsmLabel, SourceLocation *EndLoc) {
1606 assert(Tok.is(tok::kw_asm) &&
"Not an asm!");
1609 if (isGNUAsmQualifier(Tok)) {
1611 SourceRange RemovalRange(PP.getLocForEndOfToken(Loc),
1612 PP.getLocForEndOfToken(Tok.getLocation()));
1613 Diag(Tok, diag::err_global_asm_qualifier_ignored)
1614 << GNUAsmQualifiers::getQualifierName(getGNUAsmQualifier(Tok))
1620 if (
T.consumeOpen()) {
1621 Diag(Tok, diag::err_expected_lparen_after) <<
"asm";
1627 if (!
Result.isInvalid()) {
1631 *EndLoc =
T.getCloseLocation();
1634 *EndLoc = Tok.getLocation();
1641TemplateIdAnnotation *Parser::takeTemplateIdAnnotation(
const Token &tok) {
1642 assert(tok.
is(tok::annot_template_id) &&
"Expected template-id token");
1643 TemplateIdAnnotation *
1648void Parser::AnnotateScopeToken(CXXScopeSpec &SS,
bool IsNewAnnotation) {
1651 if (PP.isBacktrackEnabled())
1652 PP.RevertCachedTokens(1);
1654 PP.EnterToken(Tok,
true);
1655 Tok.setKind(tok::annot_cxxscope);
1656 Tok.setAnnotationValue(Actions.SaveNestedNameSpecifierAnnotation(SS));
1657 Tok.setAnnotationRange(SS.
getRange());
1662 if (IsNewAnnotation)
1663 PP.AnnotateCachedTokens(Tok);
1667Parser::TryAnnotateName(CorrectionCandidateCallback *CCC,
1669 assert(Tok.is(tok::identifier) || Tok.is(tok::annot_cxxscope));
1671 const bool EnteringContext =
false;
1672 const bool WasScopeAnnotation = Tok.is(tok::annot_cxxscope);
1676 ParseOptionalCXXScopeSpecifier(SS,
nullptr,
1681 if (Tok.isNot(tok::identifier) || SS.
isInvalid()) {
1683 AllowImplicitTypename))
1688 IdentifierInfo *Name = Tok.getIdentifierInfo();
1689 SourceLocation NameLoc = Tok.getLocation();
1693 if (isTentativelyDeclared(Name) && SS.
isEmpty()) {
1697 AllowImplicitTypename))
1709 Sema::NameClassification Classification = Actions.ClassifyName(
1717 isTemplateArgumentList(1) == TPResult::False) {
1719 Token FakeNext =
Next;
1720 FakeNext.
setKind(tok::unknown);
1722 Actions.ClassifyName(
getCurScope(), SS, Name, NameLoc, FakeNext,
1723 SS.
isEmpty() ? CCC :
nullptr);
1726 switch (Classification.
getKind()) {
1732 Tok.setIdentifierInfo(Name);
1734 PP.TypoCorrectToken(Tok);
1736 AnnotateScopeToken(SS, !WasScopeAnnotation);
1745 if (TryAltiVecVectorToken())
1750 SourceLocation BeginLoc = NameLoc;
1757 QualType
T = Actions.GetTypeFromParser(Ty);
1762 SourceLocation NewEndLoc;
1764 = parseObjCTypeArgsAndProtocolQualifiers(IdentifierLoc, Ty,
1769 else if (Tok.is(tok::eof))
1773 Tok.setKind(tok::annot_typename);
1774 setTypeAnnotation(Tok, Ty);
1775 Tok.setAnnotationEndLoc(Tok.getLocation());
1776 Tok.setLocation(BeginLoc);
1777 PP.AnnotateCachedTokens(Tok);
1782 Tok.setKind(tok::annot_overload_set);
1784 Tok.setAnnotationEndLoc(NameLoc);
1787 PP.AnnotateCachedTokens(Tok);
1791 if (TryAltiVecVectorToken())
1796 Tok.setKind(tok::annot_non_type);
1798 Tok.setLocation(NameLoc);
1799 Tok.setAnnotationEndLoc(NameLoc);
1800 PP.AnnotateCachedTokens(Tok);
1802 AnnotateScopeToken(SS, !WasScopeAnnotation);
1807 Tok.setKind(Classification.
getKind() ==
1809 ? tok::annot_non_type_undeclared
1810 : tok::annot_non_type_dependent);
1811 setIdentifierAnnotation(Tok, Name);
1812 Tok.setLocation(NameLoc);
1813 Tok.setAnnotationEndLoc(NameLoc);
1814 PP.AnnotateCachedTokens(Tok);
1816 AnnotateScopeToken(SS, !WasScopeAnnotation);
1820 if (
Next.isNot(tok::less)) {
1824 AnnotateScopeToken(SS, !WasScopeAnnotation);
1832 bool IsConceptName =
1838 if (
Next.is(tok::less))
1840 if (AnnotateTemplateIdToken(
1847 AnnotateScopeToken(SS, !WasScopeAnnotation);
1854 AnnotateScopeToken(SS, !WasScopeAnnotation);
1859 SourceLocation TokenEndLoc = PP.getLocForEndOfToken(PrevTokLocation);
1860 return TokenEndLoc.
isValid() ? TokenEndLoc : Tok.getLocation();
1863bool Parser::TryKeywordIdentFallback(
bool DisableKeyword) {
1864 assert(
Tok.isNot(tok::identifier));
1870 Tok.setKind(tok::identifier);
1874 Diag(
Tok, diag::ext_keyword_as_ident)
1879 Tok.setKind(tok::identifier);
1885 assert((Tok.is(tok::identifier) || Tok.is(tok::coloncolon) ||
1886 Tok.is(tok::kw_typename) || Tok.is(tok::annot_cxxscope) ||
1887 Tok.is(tok::kw_decltype) || Tok.is(tok::annot_template_id) ||
1888 Tok.is(tok::kw___super) || Tok.is(tok::kw_auto) ||
1889 Tok.is(tok::annot_pack_indexing_type)) &&
1890 "Cannot be a type or scope token!");
1892 if (Tok.is(tok::kw_typename)) {
1901 PP.Lex(TypedefToken);
1903 PP.EnterToken(Tok,
true);
1906 Diag(Tok.getLocation(), diag::warn_expected_qualified_after_typename);
1918 if (ParseOptionalCXXScopeSpecifier(SS,
nullptr,
1924 if (Tok.is(tok::identifier) || Tok.is(tok::annot_template_id) ||
1925 Tok.is(tok::annot_decltype)) {
1927 if (Tok.is(tok::annot_decltype) ||
1929 Tok.isAnnotation())) {
1930 unsigned DiagID = diag::err_expected_qualified_after_typename;
1934 DiagID = diag::warn_expected_qualified_after_typename;
1935 Diag(Tok.getLocation(), DiagID);
1939 if (Tok.isEditorPlaceholder())
1942 Diag(Tok.getLocation(), diag::err_expected_qualified_after_typename);
1946 bool TemplateKWPresent =
false;
1947 if (Tok.is(tok::kw_template)) {
1949 TemplateKWPresent =
true;
1953 if (Tok.is(tok::identifier)) {
1955 Diag(Tok.getLocation(),
1956 diag::missing_template_arg_list_after_template_kw);
1959 Ty = Actions.ActOnTypenameType(
getCurScope(), TypenameLoc, SS,
1960 *Tok.getIdentifierInfo(),
1962 }
else if (Tok.is(tok::annot_template_id)) {
1965 Diag(Tok, diag::err_typename_refers_to_non_type_template)
1966 << Tok.getAnnotationRange();
1975 : Actions.ActOnTypenameType(
1979 TemplateArgsPtr, TemplateId->
RAngleLoc);
1981 Diag(Tok, diag::err_expected_type_name_after_typename)
1987 Tok.setKind(tok::annot_typename);
1988 setTypeAnnotation(Tok, Ty);
1989 Tok.setAnnotationEndLoc(EndLoc);
1990 Tok.setLocation(TypenameLoc);
1991 PP.AnnotateCachedTokens(Tok);
1996 bool WasScopeAnnotation = Tok.is(tok::annot_cxxscope);
2000 if (ParseOptionalCXXScopeSpecifier(
2004 IsAddressOfOperand))
2008 AllowImplicitTypename);
2014 if (Tok.is(tok::identifier)) {
2017 *Tok.getIdentifierInfo(), Tok.getLocation(),
getCurScope(), &SS,
2021 true, AllowImplicitTypename)) {
2026 QualType T = Actions.GetTypeFromParser(Ty);
2031 (
T->isObjCObjectType() ||
T->isObjCObjectPointerType())) {
2041 else if (Tok.is(tok::eof))
2047 Tok.setKind(tok::annot_typename);
2048 setTypeAnnotation(Tok, Ty);
2049 Tok.setAnnotationEndLoc(Tok.getLocation());
2050 Tok.setLocation(BeginLoc);
2054 PP.AnnotateCachedTokens(Tok);
2071 TemplateName.setIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
2072 bool MemberOfUnknownSpecialization;
2077 MemberOfUnknownSpecialization)) {
2081 isTemplateArgumentList(1) != TPResult::False) {
2101 if (Tok.is(tok::annot_template_id)) {
2108 AnnotateTemplateIdTokenAsType(SS, AllowImplicitTypename);
2115 Tok.is(tok::coloncolon)) {
2124 AnnotateScopeToken(SS, IsNewScope);
2130 "Call sites of this function should be guarded by checking for C++");
2134 if (ParseOptionalCXXScopeSpecifier(SS,
nullptr,
2141 AnnotateScopeToken(SS,
true);
2145bool Parser::isTokenEqualOrEqualTypo() {
2151 case tok::starequal:
2152 case tok::plusequal:
2153 case tok::minusequal:
2154 case tok::exclaimequal:
2155 case tok::slashequal:
2156 case tok::percentequal:
2157 case tok::lessequal:
2158 case tok::lesslessequal:
2159 case tok::greaterequal:
2160 case tok::greatergreaterequal:
2161 case tok::caretequal:
2162 case tok::pipeequal:
2163 case tok::equalequal:
2164 Diag(
Tok, diag::err_invalid_token_after_declarator_suggest_equal)
2173SourceLocation Parser::handleUnexpectedCodeCompletionToken() {
2174 assert(Tok.is(tok::code_completion));
2175 PrevTokLocation = Tok.getLocation();
2178 if (S->isFunctionScope()) {
2180 Actions.CodeCompletion().CodeCompleteOrdinaryName(
2182 return PrevTokLocation;
2185 if (S->isClassScope()) {
2187 Actions.CodeCompletion().CodeCompleteOrdinaryName(
2189 return PrevTokLocation;
2194 Actions.CodeCompletion().CodeCompleteOrdinaryName(
2196 return PrevTokLocation;
2201void Parser::CodeCompleteDirective(
bool InConditional) {
2202 Actions.CodeCompletion().CodeCompletePreprocessorDirective(InConditional);
2206 Actions.CodeCompletion().CodeCompleteInPreprocessorConditionalExclusion(
2210void Parser::CodeCompleteMacroName(
bool IsDefinition) {
2211 Actions.CodeCompletion().CodeCompletePreprocessorMacroName(IsDefinition);
2215 Actions.CodeCompletion().CodeCompletePreprocessorExpression();
2218void Parser::CodeCompleteMacroArgument(IdentifierInfo *
Macro,
2219 MacroInfo *MacroInfo,
2220 unsigned ArgumentIndex) {
2221 Actions.CodeCompletion().CodeCompletePreprocessorMacroArgument(
2225void Parser::CodeCompleteIncludedFile(llvm::StringRef Dir,
bool IsAngled) {
2226 Actions.CodeCompletion().CodeCompleteIncludedFile(Dir, IsAngled);
2230 Actions.CodeCompletion().CodeCompleteNaturalLanguage();
2233void Parser::CodeCompleteModuleImport(SourceLocation ImportLoc,
2235 Actions.CodeCompletion().CodeCompleteModuleImport(ImportLoc, Path);
2238bool Parser::ParseMicrosoftIfExistsCondition(IfExistsCondition&
Result) {
2239 assert((Tok.is(tok::kw___if_exists) || Tok.is(tok::kw___if_not_exists)) &&
2240 "Expected '__if_exists' or '__if_not_exists'");
2241 Result.IsIfExists = Tok.is(tok::kw___if_exists);
2245 if (
T.consumeOpen()) {
2246 Diag(Tok, diag::err_expected_lparen_after)
2247 << (
Result.IsIfExists?
"__if_exists" :
"__if_not_exists");
2253 ParseOptionalCXXScopeSpecifier(
Result.SS,
nullptr,
2258 if (
Result.SS.isInvalid()) {
2264 SourceLocation TemplateKWLoc;
2269 false, &TemplateKWLoc,
2275 if (
T.consumeClose())
2303void Parser::ParseMicrosoftIfExistsExternalDeclaration() {
2304 IfExistsCondition
Result;
2305 if (ParseMicrosoftIfExistsCondition(
Result))
2309 if (
Braces.consumeOpen()) {
2310 Diag(Tok, diag::err_expected) << tok::l_brace;
2314 switch (
Result.Behavior) {
2320 llvm_unreachable(
"Cannot have a dependent external declaration");
2329 while (Tok.isNot(tok::r_brace) && !isEofOrEom()) {
2330 ParsedAttributes Attrs(AttrFactory);
2331 MaybeParseCXX11Attributes(Attrs);
2332 ParsedAttributes EmptyDeclSpecAttrs(AttrFactory);
2335 Actions.getASTConsumer().HandleTopLevelDecl(
Result.get());
2342 Token Introducer = Tok;
2343 SourceLocation StartLoc = Introducer.
getLocation();
2349 assert(Tok.is(tok::kw_module) &&
"not a module declaration");
2355 DiagnoseAndSkipCXX11Attributes();
2358 if (
getLangOpts().CPlusPlusModules && Tok.is(tok::semi)) {
2362 Diag(StartLoc, diag::err_global_module_introducer_not_at_start)
2363 << SourceRange(StartLoc, SemiLoc);
2367 Diag(StartLoc, diag::err_module_fragment_exported)
2371 return Actions.ActOnGlobalModuleFragmentDecl(ModuleLoc);
2375 if (
getLangOpts().CPlusPlusModules && Tok.is(tok::colon) &&
2378 Diag(StartLoc, diag::err_module_fragment_exported)
2383 DiagnoseAndSkipCXX11Attributes();
2384 ExpectAndConsumeSemi(diag::err_private_module_fragment_expected_semi);
2385 auto Result = Actions.ActOnPrivateModuleFragmentDecl(ModuleLoc, PrivateLoc);
2394 SmallVector<IdentifierLoc, 2> Path;
2395 if (ParseModuleName(ModuleLoc, Path,
false))
2399 SmallVector<IdentifierLoc, 2> Partition;
2400 if (Tok.is(tok::colon)) {
2403 Diag(ColonLoc, diag::err_unsupported_module_partition)
2404 << SourceRange(ColonLoc, Partition.back().getLoc());
2406 else if (ParseModuleName(ModuleLoc, Partition,
false))
2410 if (Tok.isNoneOf(tok::semi, tok::l_square, tok::eof)) {
2411 Diag(Tok, diag::err_unexpected_tok_after_module_name)
2412 << PP.getSpelling(Tok);
2417 ParsedAttributes Attrs(AttrFactory);
2418 MaybeParseCXX11Attributes(Attrs);
2419 ProhibitCXX11Attributes(Attrs, diag::err_attribute_not_module_attr,
2420 diag::err_keyword_not_module_attr,
2424 if (ExpectAndConsumeSemi(diag::err_expected_semi_after_module_or_import,
2428 return Actions.ActOnModuleDecl(StartLoc, ModuleLoc, MDK, Path, Partition,
2433Decl *Parser::ParseModuleImport(SourceLocation AtLoc,
2435 SourceLocation StartLoc = AtLoc.
isInvalid() ? Tok.getLocation() : AtLoc;
2437 SourceLocation ExportLoc;
2440 assert((AtLoc.
isInvalid() ? Tok.is(tok::kw_import)
2441 : Tok.isObjCAtKeyword(tok::objc_import)) &&
2442 "Improper start to module import");
2443 bool IsObjCAtImport = Tok.isObjCAtKeyword(tok::objc_import);
2447 SmallVector<IdentifierLoc, 2> Path;
2448 bool IsPartition =
false;
2449 Module *HeaderUnit =
nullptr;
2450 if (Tok.is(tok::header_name)) {
2455 }
else if (Tok.is(tok::annot_header_unit)) {
2457 HeaderUnit =
reinterpret_cast<Module *
>(Tok.getAnnotationValue());
2458 ConsumeAnnotationToken();
2459 }
else if (Tok.is(tok::colon)) {
2462 Diag(ColonLoc, diag::err_unsupported_module_partition)
2463 << SourceRange(ColonLoc, Path.back().getLoc());
2465 else if (ParseModuleName(ColonLoc, Path,
true))
2470 if (ParseModuleName(ImportLoc, Path,
true))
2474 ParsedAttributes Attrs(AttrFactory);
2475 MaybeParseCXX11Attributes(Attrs);
2477 ProhibitCXX11Attributes(Attrs, diag::err_attribute_not_import_attr,
2478 diag::err_keyword_not_import_attr,
2485 bool IsCXX20NamedModuleImport =
2486 getLangOpts().CPlusPlusModules && !IsObjCAtImport && !Path.empty();
2488 if (PP.hadModuleLoaderFatalFailure() && !IsCXX20NamedModuleImport) {
2495 bool SeenError =
true;
2496 switch (ImportState) {
2508 Diag(ImportLoc, diag::err_partition_import_outside_module);
2520 if (IsPartition || (HeaderUnit && HeaderUnit->
Kind !=
2522 Diag(ImportLoc, diag::err_import_in_wrong_fragment)
2531 Diag(ImportLoc, diag::err_import_not_allowed_here);
2547 bool LexedSemi =
false;
2550 !ExpectAndConsumeSemi(diag::err_expected_semi_after_module_or_import,
2553 LexedSemi = !ExpectAndConsumeSemi(diag::err_module_expected_semi);
2564 Actions.ActOnModuleImport(StartLoc, ExportLoc, ImportLoc, HeaderUnit);
2565 else if (!Path.empty())
2566 Import = Actions.ActOnModuleImport(StartLoc, ExportLoc, ImportLoc, Path,
2573 if (IsObjCAtImport && AtLoc.
isValid()) {
2574 auto &SrcMgr = PP.getSourceManager();
2575 auto FE = SrcMgr.getFileEntryRefForID(SrcMgr.getFileID(AtLoc));
2576 if (FE && llvm::sys::path::parent_path(FE->getDir().getName())
2577 .ends_with(
".framework"))
2578 Diags.Report(AtLoc, diag::warn_atimport_in_framework_header);
2584bool Parser::ParseModuleName(SourceLocation UseLoc,
2585 SmallVectorImpl<IdentifierLoc> &Path,
2587 if (Tok.isNot(tok::annot_module_name)) {
2591 ModuleNameLoc *NameLoc =
2592 static_cast<ModuleNameLoc *
>(Tok.getAnnotationValue());
2595 ConsumeAnnotationToken();
2599bool Parser::parseMisplacedModuleImport() {
2601 switch (Tok.getKind()) {
2602 case tok::annot_module_end:
2606 if (MisplacedModuleBeginCount) {
2607 --MisplacedModuleBeginCount;
2608 Actions.ActOnAnnotModuleEnd(
2610 reinterpret_cast<Module *
>(Tok.getAnnotationValue()));
2611 ConsumeAnnotationToken();
2618 case tok::annot_module_begin:
2620 Actions.ActOnAnnotModuleBegin(
2622 reinterpret_cast<Module *
>(Tok.getAnnotationValue()));
2623 ConsumeAnnotationToken();
2624 ++MisplacedModuleBeginCount;
2626 case tok::annot_module_include:
2629 Actions.ActOnAnnotModuleInclude(
2631 reinterpret_cast<Module *
>(Tok.getAnnotationValue()));
2632 ConsumeAnnotationToken();
2642void Parser::diagnoseUseOfC11Keyword(
const Token &Tok) {
2647 : diag::ext_c11_feature)
2651bool BalancedDelimiterTracker::diagnoseOverflow() {
2652 P.Diag(P.Tok, diag::err_bracket_depth_exceeded)
2653 << P.getLangOpts().BracketDepth;
2654 P.Diag(P.Tok, diag::note_bracket_depth);
2662 LOpen = P.Tok.getLocation();
2663 if (P.ExpectAndConsume(Kind, DiagID, Msg)) {
2664 if (SkipToTok != tok::unknown)
2669 if (getDepth() < P.getLangOpts().BracketDepth)
2672 return diagnoseOverflow();
2675bool BalancedDelimiterTracker::diagnoseMissingClose() {
2676 assert(!P.Tok.is(Close) &&
"Should have consumed closing delimiter");
2678 if (P.Tok.is(tok::annot_module_end))
2679 P.Diag(P.Tok, diag::err_missing_before_module_end) << Close;
2681 P.Diag(P.Tok, diag::err_expected) << Close;
2682 P.Diag(LOpen, diag::note_matching) << Kind;
2686 if (P.Tok.isNot(tok::r_paren) && P.Tok.isNot(tok::r_brace) &&
2687 P.Tok.isNot(tok::r_square) &&
2688 P.SkipUntil(Close, FinalToken,
2691 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.