diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h index cd0878d708251..7b1d9e8be6c59 100644 --- a/clang/include/clang/AST/Decl.h +++ b/clang/include/clang/AST/Decl.h @@ -4440,7 +4440,8 @@ class TopLevelStmtDecl : public Decl { virtual void anchor(); public: - static TopLevelStmtDecl *Create(ASTContext &C, Stmt *Statement); + static TopLevelStmtDecl *Create(ASTContext &C, DeclContext *DC, + Stmt *Statement); static TopLevelStmtDecl *CreateDeserialized(ASTContext &C, unsigned ID); SourceRange getSourceRange() const override LLVM_READONLY; diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 527ea6042daa0..5c0f4f5b6b4ca 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -5513,13 +5513,13 @@ FileScopeAsmDecl *FileScopeAsmDecl::CreateDeserialized(ASTContext &C, void TopLevelStmtDecl::anchor() {} -TopLevelStmtDecl *TopLevelStmtDecl::Create(ASTContext &C, Stmt *Statement) { +TopLevelStmtDecl *TopLevelStmtDecl::Create(ASTContext &C, DeclContext *DC, + Stmt *Statement) { assert(Statement); assert(C.getLangOpts().IncrementalExtensions && "Must be used only in incremental mode"); SourceLocation BeginLoc = Statement->getBeginLoc(); - DeclContext *DC = C.getTranslationUnitDecl(); return new (C, DC) TopLevelStmtDecl(DC, BeginLoc, Statement); } diff --git a/clang/lib/Interpreter/IncrementalParser.cpp b/clang/lib/Interpreter/IncrementalParser.cpp index 370bcbfee8b01..feeca0b6c7cd1 100644 --- a/clang/lib/Interpreter/IncrementalParser.cpp +++ b/clang/lib/Interpreter/IncrementalParser.cpp @@ -374,7 +374,17 @@ std::unique_ptr IncrementalParser::GenModule() { void IncrementalParser::CleanUpPTU(PartialTranslationUnit &PTU) { TranslationUnitDecl *MostRecentTU = PTU.TUPart; TranslationUnitDecl *FirstTU = MostRecentTU->getFirstDecl(); - if (StoredDeclsMap *Map = FirstTU->getPrimaryContext()->getLookupPtr()) { + if (!FirstTU) { + return; + } + + SmallVector contexts; + FirstTU->collectAllContexts(contexts); + if (contexts.empty()) { + return; + } + + if (StoredDeclsMap *Map = contexts.back()->getLookupPtr()) { for (auto I = Map->begin(); I != Map->end(); ++I) { StoredDeclsList &List = I->second; DeclContextLookupResult R = List.getLookupResult(); diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index be6a136ef37bc..ae73c0ba02377 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -20287,8 +20287,9 @@ Decl *Sema::ActOnFileScopeAsmDecl(Expr *expr, } Decl *Sema::ActOnTopLevelStmtDecl(Stmt *Statement) { - auto *New = TopLevelStmtDecl::Create(Context, Statement); - Context.getTranslationUnitDecl()->addDecl(New); + DeclContext *NamespaceContext = CurContext->getEnclosingNamespaceContext(); + auto *New = TopLevelStmtDecl::Create(Context, NamespaceContext, Statement); + NamespaceContext->addDecl(New); return New; }