forked from OSchip/llvm-project
[C++20] [Coroutines] Mark imported module as imported if not exported
In C++20 Modules, imported module which doesn't get exported wouldn't be recorded. This patch would record such modules to avoid possible incorrect visibility problems. Reviewed By: urnathan Differential Revision: https://reviews.llvm.org/D116098
This commit is contained in:
parent
23f1cd9e63
commit
368318bcce
|
@ -383,11 +383,18 @@ DeclResult Sema::ActOnModuleImport(SourceLocation StartLoc,
|
||||||
if (!ModuleScopes.empty())
|
if (!ModuleScopes.empty())
|
||||||
Context.addModuleInitializer(ModuleScopes.back().Module, Import);
|
Context.addModuleInitializer(ModuleScopes.back().Module, Import);
|
||||||
|
|
||||||
// Re-export the module if needed.
|
|
||||||
if (!ModuleScopes.empty() && ModuleScopes.back().ModuleInterface) {
|
if (!ModuleScopes.empty() && ModuleScopes.back().ModuleInterface) {
|
||||||
|
// Re-export the module if the imported module is exported.
|
||||||
|
// Note that we don't need to add re-exported module to Imports field
|
||||||
|
// since `Exports` implies the module is imported already.
|
||||||
if (ExportLoc.isValid() || getEnclosingExportDecl(Import))
|
if (ExportLoc.isValid() || getEnclosingExportDecl(Import))
|
||||||
getCurrentModule()->Exports.emplace_back(Mod, false);
|
getCurrentModule()->Exports.emplace_back(Mod, false);
|
||||||
|
else
|
||||||
|
getCurrentModule()->Imports.insert(Mod);
|
||||||
} else if (ExportLoc.isValid()) {
|
} else if (ExportLoc.isValid()) {
|
||||||
|
// [module.interface]p1:
|
||||||
|
// An export-declaration shall inhabit a namespace scope and appear in the
|
||||||
|
// purview of a module interface unit.
|
||||||
Diag(ExportLoc, diag::err_export_not_in_module_interface);
|
Diag(ExportLoc, diag::err_export_not_in_module_interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,9 @@
|
||||||
// RUN: %clang_cc1 -std=c++20 %S/Inputs/module-transtive-instantiation/Templ.cppm -emit-module-interface -o %t/Templ.pcm
|
// RUN: %clang_cc1 -std=c++20 %S/Inputs/module-transtive-instantiation/Templ.cppm -emit-module-interface -o %t/Templ.pcm
|
||||||
// RUN: %clang_cc1 -std=c++20 %S/Inputs/module-transtive-instantiation/bar.cppm -emit-module-interface -fprebuilt-module-path=%t -o %t/bar.pcm
|
// RUN: %clang_cc1 -std=c++20 %S/Inputs/module-transtive-instantiation/bar.cppm -emit-module-interface -fprebuilt-module-path=%t -o %t/bar.pcm
|
||||||
// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %s -fsyntax-only -verify
|
// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %s -fsyntax-only -verify
|
||||||
|
// expected-no-diagnostics
|
||||||
|
|
||||||
import bar;
|
import bar;
|
||||||
int foo() {
|
int foo() {
|
||||||
// FIXME: It shouldn't be an error. Since the `G` is already imported in bar.
|
return bar<int>();
|
||||||
return bar<int>(); // expected-error@Inputs/module-transtive-instantiation/bar.cppm:5 {{definition of 'G' must be imported from module 'Templ' before it is required}}
|
|
||||||
// expected-note@-1 {{in instantiation of function template specialization 'bar<int>' requested here}}
|
|
||||||
// expected-note@Inputs/module-transtive-instantiation/Templ.cppm:3 {{definition here is not reachable}}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue