| // RUN: rm -rf %t |
| // RUN: mkdir -p %t |
| // RUN: split-file %s %t |
| |
| // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/import-diags-tu1.cpp \ |
| // RUN: -o %t/B.pcm |
| |
| // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/import-diags-tu2.cpp \ |
| // RUN: -o %t/C.pcm |
| |
| // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/import-diags-tu3.cpp \ |
| // RUN: -fmodule-file=B=%t/B.pcm -fmodule-file=C=%t/C.pcm -o %t/AOK1.pcm |
| |
| // RUN: %clang_cc1 -std=c++20 -S %t/import-diags-tu4.cpp \ |
| // RUN: -fmodule-file=AOK1=%t/AOK1.pcm -fmodule-file=B=%t/B.pcm \ |
| // RUN: -fmodule-file=C=%t/C.pcm -o %t/tu_3.s -verify |
| |
| // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/import-diags-tu5.cpp \ |
| // RUN: -fmodule-file=B=%t/B.pcm -fmodule-file=C=%t/C.pcm -o %t/BC.pcm -verify |
| |
| // RUN: %clang_cc1 -std=c++20 -S %t/import-diags-tu6.cpp \ |
| // RUN: -fmodule-file=B=%t/B.pcm -fmodule-file=C=%t/C.pcm -o %t/tu_5.s -verify |
| |
| // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/import-diags-tu7.cpp \ |
| // RUN: -fmodule-file=B=%t/B.pcm -o %t/D.pcm -verify |
| |
| // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/import-diags-tu8.cpp \ |
| // RUN: -fmodule-file=B=%t/B.pcm -o %t/D.pcm -verify |
| |
| // RUN: %clang_cc1 -std=c++20 -S %t/import-diags-tu9.cpp \ |
| // RUN: -fmodule-file=B=%t/B.pcm -o %t/tu_8.s -verify |
| |
| // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/import-diags-tu10.cpp \ |
| // RUN: -o %t/B.pcm -verify |
| |
| // RUN: %clang_cc1 -std=c++20 -emit-obj %t/import-diags-tu11.cpp \ |
| // RUN: -fmodule-file=C=%t/C.pcm -o %t/impl.o |
| |
| // Test diagnostics for incorrect module import sequences. |
| |
| //--- import-diags-tu1.cpp |
| |
| export module B; |
| |
| int foo (); |
| |
| // expected-no-diagnostics |
| |
| //--- import-diags-tu2.cpp |
| |
| export module C; |
| |
| int bar (); |
| |
| // expected-no-diagnostics |
| |
| //--- import-diags-tu3.cpp |
| |
| export module AOK1; |
| |
| import B; |
| export import C; |
| |
| export int theAnswer (); |
| |
| // expected-no-diagnostics |
| |
| //--- import-diags-tu4.cpp |
| |
| module; |
| |
| module AOK1; |
| |
| export import C; // expected-error {{export declaration can only be used within a module purview}} |
| |
| int theAnswer () { return 42; } |
| |
| //--- import-diags-tu5.cpp |
| |
| export module BC; |
| |
| export import B; |
| |
| int foo () { return 10; } |
| |
| import C; // expected-error {{imports must immediately follow the module declaration}} |
| |
| //--- import-diags-tu6.cpp |
| |
| module B; // implicitly imports B. |
| |
| int foo () { return 10; } |
| |
| import C; // expected-error {{imports must immediately follow the module declaration}} |
| |
| //--- import-diags-tu7.cpp |
| |
| module; |
| // We can only have preprocessor directives here, which permits |
| // header units (include-translated or not) and named modules. |
| import B; |
| export module D; |
| |
| int delta (); |
| // expected-no-diagnostics |
| |
| //--- import-diags-tu8.cpp |
| |
| export module D; |
| |
| int delta (); |
| |
| module :private; |
| |
| import B; // expected-error {{imports must immediately follow the module declaration}} |
| |
| //--- import-diags-tu9.cpp |
| |
| module B; |
| |
| import B; // expected-error {{import of module 'B' appears within its own implementation}} |
| |
| //--- import-diags-tu10.cpp |
| |
| export module B; |
| |
| import B; // expected-error {{import of module 'B' appears within its own interface}} |
| |
| //--- import-diags-tu11.cpp |
| |
| int x; |
| |
| import C; |
| |
| int baz() { return 6174; } |
| |
| // expected-no-diagnostics |