diff options
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaModule.cpp | 6 | ||||
-rw-r--r-- | clang/test/Modules/cxx20-export-import.cpp | 12 | ||||
-rw-r--r-- | clang/test/Modules/diag-flags.cpp | 2 | ||||
-rw-r--r-- | clang/test/Modules/diag-pragma.cpp | 3 | ||||
-rw-r--r-- | clang/test/Modules/pr64755.cppm | 17 |
6 files changed, 38 insertions, 4 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 935fad8..632be32 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11318,6 +11318,8 @@ def err_module_import_in_implementation : Error< "@import of module '%0' in implementation of '%1'; use #import">; // C++ Modules +def err_module_import_non_interface_nor_parition : Error< + "import of module '%0' imported non C++20 importable modules">; def err_module_decl_not_at_start : Error< "module declaration must occur at the start of the translation unit">; def note_global_module_introducer_missing : Note< diff --git a/clang/lib/Sema/SemaModule.cpp b/clang/lib/Sema/SemaModule.cpp index cd38cd4..9b8af60 100644 --- a/clang/lib/Sema/SemaModule.cpp +++ b/clang/lib/Sema/SemaModule.cpp @@ -531,6 +531,12 @@ DeclResult Sema::ActOnModuleImport(SourceLocation StartLoc, if (!Mod) return true; + if (!Mod->isInterfaceOrPartition() && !ModuleName.empty()) { + Diag(ImportLoc, diag::err_module_import_non_interface_nor_parition) + << ModuleName; + return true; + } + return ActOnModuleImport(StartLoc, ExportLoc, ImportLoc, Mod, Path); } diff --git a/clang/test/Modules/cxx20-export-import.cpp b/clang/test/Modules/cxx20-export-import.cpp index c40069e..0b50566 100644 --- a/clang/test/Modules/cxx20-export-import.cpp +++ b/clang/test/Modules/cxx20-export-import.cpp @@ -1,4 +1,14 @@ // RUN: rm -rf %t -// RUN: %clang_cc1 -std=c++20 -fmodules -fmodules-cache-path=%t -fimplicit-module-maps -I%S/Inputs -verify %s +// RUN: mkdir -p %t +// RUN: split-file %s %t +// +// RUN: %clang_cc1 -std=c++20 %t/dummy.cppm -emit-module-interface -o %t/dummy.pcm +// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t -verify %t/test.cpp + + +//--- dummy.cppm +export module dummy; + +//--- test.cpp export import dummy; // expected-error {{export declaration can only be used within a module purview}} diff --git a/clang/test/Modules/diag-flags.cpp b/clang/test/Modules/diag-flags.cpp index 4902cc9..0db8b44 100644 --- a/clang/test/Modules/diag-flags.cpp +++ b/clang/test/Modules/diag-flags.cpp @@ -30,7 +30,7 @@ // RUN: %clang_cc1 -triple %itanium_abi_triple -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s -std=c++20 -DERROR -fmodule-file=%t/werror.pcm -Wno-error // RUN: %clang_cc1 -triple %itanium_abi_triple -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s -std=c++20 -DERROR -fmodule-file=%t/werror.pcm -Wno-padded -import diag_flags; +#include "diag_flags.h" // Diagnostic flags from the module user make no difference to diagnostics // emitted within the module when using an explicitly-loaded module. diff --git a/clang/test/Modules/diag-pragma.cpp b/clang/test/Modules/diag-pragma.cpp index f2e0206f..b1f1036 100644 --- a/clang/test/Modules/diag-pragma.cpp +++ b/clang/test/Modules/diag-pragma.cpp @@ -4,7 +4,7 @@ // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -emit-module -fmodule-name=diag_pragma -x c++ %S/Inputs/module.map -std=c++20 -o %t/explicit.pcm -Werror=string-plus-int // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s -std=c++20 -DEXPLICIT_FLAG -fmodule-file=%t/explicit.pcm -import diag_pragma; +#include "diag_pragma.h" int foo(int x) { // Diagnostics from templates in the module follow the diagnostic state from @@ -42,7 +42,6 @@ int foo(int x) { if (x = DIAG_PRAGMA_MACRO) // expected-warning {{using the result of an assignment as a condition without parentheses}} \ // expected-note {{place parentheses}} expected-note {{use '=='}} - // expected-error@-2 {{use of undeclared identifier 'DIAG_PRAGMA_MACRO'}} return 0; return 1; } diff --git a/clang/test/Modules/pr64755.cppm b/clang/test/Modules/pr64755.cppm new file mode 100644 index 0000000..75ef843 --- /dev/null +++ b/clang/test/Modules/pr64755.cppm @@ -0,0 +1,17 @@ +// RUN: rm -rf %t +// RUN: mkdir -p %t +// RUN: split-file %s %t +// +// RUN: %clang_cc1 -std=c++20 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -I%t -fmodule-name=a0 -x c++ -emit-module %t/module.modulemap -o %t/a0.pcm +// RUN: %clang_cc1 -std=c++20 %t/use.cpp -fmodule-file=%t/a0.pcm -verify -fsyntax-only +// RUN: %clang_cc1 -std=c++20 %t/use.cpp -fmodule-file=a0=%t/a0.pcm -verify -fsyntax-only +// RUN: %clang_cc1 -std=c++20 %t/use.cpp -fprebuilt-module-path=%t -verify -fsyntax-only + +//--- module.modulemap +module a0 { header "a0.h" export * } + +//--- a0.h +void a0() {} + +//--- use.cpp +import a0; // expected-error {{import of module 'a0' imported non C++20 importable modules}} |