mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-07 10:02:22 +00:00
When we enter a module within a linkage specification, switch the linkage
specification and the TU to the new module. This is necessary to get the module ownership correct for entities that we temporarily hang off the TranslationUnitDecl, such as template parameters and function parameters. llvm-svn: 303373
This commit is contained in:
parent
af3b325627
commit
f4f62003f4
@ -16048,8 +16048,10 @@ void Sema::ActOnModuleBegin(SourceLocation DirectiveLoc, Module *Mod) {
|
||||
// FIXME: Consider creating a child DeclContext to hold the entities
|
||||
// lexically within the module.
|
||||
if (getLangOpts().trackLocalOwningModule()) {
|
||||
cast<Decl>(CurContext)->setHidden(true);
|
||||
cast<Decl>(CurContext)->setLocalOwningModule(Mod);
|
||||
for (auto *DC = CurContext; DC; DC = DC->getLexicalParent()) {
|
||||
cast<Decl>(DC)->setHidden(true);
|
||||
cast<Decl>(DC)->setLocalOwningModule(Mod);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -16082,9 +16084,13 @@ void Sema::ActOnModuleEnd(SourceLocation EomLoc, Module *Mod) {
|
||||
|
||||
// Any further declarations are in whatever module we returned to.
|
||||
if (getLangOpts().trackLocalOwningModule()) {
|
||||
cast<Decl>(CurContext)->setLocalOwningModule(getCurrentModule());
|
||||
if (!getCurrentModule())
|
||||
cast<Decl>(CurContext)->setHidden(false);
|
||||
// The parser guarantees that this is the same context that we entered
|
||||
// the module within.
|
||||
for (auto *DC = CurContext; DC; DC = DC->getLexicalParent()) {
|
||||
cast<Decl>(DC)->setLocalOwningModule(getCurrentModule());
|
||||
if (!getCurrentModule())
|
||||
cast<Decl>(DC)->setHidden(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
25
clang/test/Modules/extern_cxx.cpp
Normal file
25
clang/test/Modules/extern_cxx.cpp
Normal file
@ -0,0 +1,25 @@
|
||||
// RUN: %clang_cc1 -x c++-module-map -fmodule-name=A -verify %s -fmodules-local-submodule-visibility
|
||||
module A { module B {} module C {} }
|
||||
|
||||
#pragma clang module contents
|
||||
|
||||
#pragma clang module begin A.B
|
||||
extern "C++" {
|
||||
#pragma clang module begin A.C
|
||||
template<typename T> void f(T t);
|
||||
#pragma clang module end
|
||||
|
||||
void g() { f(0); } // ok
|
||||
}
|
||||
|
||||
extern "C++" {
|
||||
#pragma clang module begin A.C
|
||||
} // expected-error {{extraneous closing brace}}
|
||||
#pragma clang module end
|
||||
|
||||
#pragma clang module begin A.C
|
||||
extern "C++" { // expected-note {{to match this '{'}}
|
||||
#pragma clang module end // expected-error {{expected '}' at end of module}}
|
||||
}
|
||||
|
||||
#pragma clang module end
|
Loading…
x
Reference in New Issue
Block a user