diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index 8d4c816bae0a5..457d3644de35a 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -1336,8 +1336,6 @@ def warn_pragma_init_seg_unsupported_target : Warning< def err_pragma_file_or_compound_scope : Error< "'#pragma %0' can only appear at file scope or at the start of a " "compound statement">; -def err_pragma_file_scope : Error< - "'#pragma %0' can only appear at file scope">; // - #pragma stdc unknown def ext_stdc_pragma_ignored : ExtWarn<"unknown pragma in STDC namespace">, InGroup; diff --git a/clang/lib/Parse/ParsePragma.cpp b/clang/lib/Parse/ParsePragma.cpp index 54b96fd2102b5..def2817c930b2 100644 --- a/clang/lib/Parse/ParsePragma.cpp +++ b/clang/lib/Parse/ParsePragma.cpp @@ -1409,10 +1409,11 @@ void Parser::zOSHandlePragmaHelper(tok::TokenKind PragmaKind) { StringRef PragmaName = "export"; using namespace clang::charinfo; - auto *TheTokens = - (std::pair, size_t> *)Tok.getAnnotationValue(); + auto *TheTokens = static_cast, size_t> *>( + Tok.getAnnotationValue()); PP.EnterTokenStream(std::move(TheTokens->first), TheTokens->second, true, - false); + /*IsReinject=*/true); + Tok.setAnnotationValue(nullptr); ConsumeAnnotationToken(); llvm::scope_exit OnReturn([this]() { diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp index 771db0a00091b..1a45ed66950be 100644 --- a/clang/lib/Parse/ParseStmt.cpp +++ b/clang/lib/Parse/ParseStmt.cpp @@ -506,8 +506,7 @@ StmtResult Parser::ParseStatementOrDeclarationAfterAttributes( case tok::annot_pragma_export: ProhibitAttributes(CXX11Attrs); ProhibitAttributes(GNUAttrs); - Diag(Tok, diag::err_pragma_file_scope) << "export"; - ConsumeAnnotationToken(); + HandlePragmaExport(); return StmtEmpty(); } @@ -1039,8 +1038,7 @@ void Parser::ParseCompoundStatementLeadingPragmas() { HandlePragmaDump(); break; case tok::annot_pragma_export: - Diag(Tok, diag::err_pragma_file_scope) << "export"; - ConsumeAnnotationToken(); + HandlePragmaExport(); break; default: checkForPragmas = false; diff --git a/clang/lib/Sema/SemaAttr.cpp b/clang/lib/Sema/SemaAttr.cpp index 738daf2f69290..494cf68db8ee6 100644 --- a/clang/lib/Sema/SemaAttr.cpp +++ b/clang/lib/Sema/SemaAttr.cpp @@ -1346,6 +1346,11 @@ NamedDecl *Sema::lookupExternCFunctionOrVariable(IdentifierInfo *IdentId, void Sema::ActOnPragmaExport(IdentifierInfo *IdentId, SourceLocation NameLoc, Scope *curScope) { + if (!CurContext->getRedeclContext()->isFileContext()) { + Diag(NameLoc, diag::err_pragma_expected_file_scope) << "export"; + return; + } + PendingPragmaInfo Info; Info.NameLoc = NameLoc; Info.Used = false;