diff options
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/Modules/Inputs/preprocess/file2.h | 2 | ||||
| -rw-r--r-- | clang/test/Modules/Inputs/preprocess/module.modulemap | 2 | ||||
| -rw-r--r-- | clang/test/Modules/preprocess-module.cpp | 57 | ||||
| -rw-r--r-- | clang/test/Preprocessor/pragma_module.c | 58 |
4 files changed, 107 insertions, 12 deletions
diff --git a/clang/test/Modules/Inputs/preprocess/file2.h b/clang/test/Modules/Inputs/preprocess/file2.h new file mode 100644 index 00000000000..04bf796d1e9 --- /dev/null +++ b/clang/test/Modules/Inputs/preprocess/file2.h @@ -0,0 +1,2 @@ +#include "file.h" +extern int file2; diff --git a/clang/test/Modules/Inputs/preprocess/module.modulemap b/clang/test/Modules/Inputs/preprocess/module.modulemap index a5c5b61dddc..943435a953d 100644 --- a/clang/test/Modules/Inputs/preprocess/module.modulemap +++ b/clang/test/Modules/Inputs/preprocess/module.modulemap @@ -1,2 +1,2 @@ module fwd { header "fwd.h" export * } -module file { header "file.h" export * } +module file { header "file.h" header "file2.h" export * } diff --git a/clang/test/Modules/preprocess-module.cpp b/clang/test/Modules/preprocess-module.cpp index 99fe8cf8c30..337cafbf65b 100644 --- a/clang/test/Modules/preprocess-module.cpp +++ b/clang/test/Modules/preprocess-module.cpp @@ -3,10 +3,63 @@ // RUN: not %clang_cc1 -fmodules -fmodule-name=file -I%S/Inputs/preprocess -x c++-module-map %S/Inputs/preprocess/module.modulemap -E 2>&1 | FileCheck %s --check-prefix=MISSING-FWD // MISSING-FWD: module 'fwd' is needed -// RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodules-cache-path=%t -I%S/Inputs/preprocess -x c++-module-map %S/Inputs/preprocess/module.modulemap -E | FileCheck %s +// RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodules-cache-path=%t -I%S/Inputs/preprocess -x c++-module-map %S/Inputs/preprocess/module.modulemap -E | FileCheck %s --check-prefix=CHECK --check-prefix=NO-REWRITE +// RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodules-cache-path=%t -I%S/Inputs/preprocess -x c++-module-map %S/Inputs/preprocess/module.modulemap -E -frewrite-includes | FileCheck %s --check-prefix=CHECK --check-prefix=REWRITE + +// == file.h // CHECK: # 1 "<module-includes>" +// REWRITE: #if 0 +// REWRITE: #include "file.h" +// REWRITE: #endif +// +// FIXME: It would be preferable to consistently put the module begin/end in +// the same file, but the relative ordering of PP callbacks and module +// begin/end tokens makes that difficult. +// +// REWRITE: #pragma clang module begin file // CHECK: # 1 "{{.*}}file.h" 1 +// NO-REWRITE: #pragma clang module begin file +// NO-REWRITE: # 1 "{{.*}}file.h"{{$}} +// // CHECK: struct __FILE; -// CHECK: #pragma clang module import fwd /* clang -E: implicit import for #include "fwd.h" */ +// CHECK: #pragma clang module import fwd /* clang {{-E|-frewrite-includes}}: implicit import // CHECK: typedef struct __FILE FILE; +// +// REWRITE: #pragma clang module end // CHECK: # 2 "<module-includes>" 2 +// NO-REWRITE: #pragma clang module end + +// == file2.h +// REWRITE: #if 0 +// REWRITE: #include "file2.h" +// REWRITE: #endif +// +// REWRITE: #pragma clang module begin file +// CHECK: # 1 "{{.*}}file2.h" 1 +// NO-REWRITE: #pragma clang module begin file +// +// ==== recursively re-enter file.h +// REWRITE: #if 0 +// REWRITE: #include "file.h" +// REWRITE: #endif +// +// REWRITE: #pragma clang module begin file +// CHECK: # 1 "{{.*}}file.h" 1 +// NO-REWRITE: #pragma clang module begin file +// NO-REWRITE: # 1 "{{.*}}file.h"{{$}} +// +// CHECK: struct __FILE; +// CHECK: #pragma clang module import fwd /* clang {{-E|-frewrite-includes}}: implicit import +// CHECK: typedef struct __FILE FILE; +// +// REWRITE: #pragma clang module end +// CHECK: # 2 "{{.*}}file2.h" 2 +// NO-REWRITE: #pragma clang module end +// NO-REWRITE: # 2 "{{.*}}file2.h"{{$}} +// ==== return to file2.h +// +// CHECK: extern int file2; +// +// REWRITE: #pragma clang module end +// CHECK: # 3 "<module-includes>" 2 +// NO-REWRITE: #pragma clang module end diff --git a/clang/test/Preprocessor/pragma_module.c b/clang/test/Preprocessor/pragma_module.c index d734f66efce..3763ca333c1 100644 --- a/clang/test/Preprocessor/pragma_module.c +++ b/clang/test/Preprocessor/pragma_module.c @@ -1,11 +1,51 @@ -// RUN: %clang -cc1 -E -fmodules %s -verify +// RUN: rm -rf %t +// RUN: mkdir %t +// RUN: echo 'module foo { module a {} module b {} } module bar {}' > %t/module.map +// RUN: %clang -cc1 -E -fmodules %s -verify -fmodule-name=foo -fmodule-map-file=%t/module.map +// RUN: %clang -cc1 -E -fmodules %s -verify -fmodule-name=foo -fmodule-map-file=%t/module.map -fmodules-local-submodule-visibility -DLOCAL_VIS // Just checking the syntax here; the semantics are tested elsewhere. -#pragma clang module import // expected-error {{expected identifier in module name}} -#pragma clang module import ! // expected-error {{expected identifier in module name}} -#pragma clang module import if // expected-error {{expected identifier in module name}} -#pragma clang module import foo ? bar // expected-error {{expected '.' or end of directive after module name}} -#pragma clang module import foo. // expected-error {{expected identifier}} -#pragma clang module import foo.bar.baz.quux // expected-error {{module 'foo' not found}} - -#error here // expected-error {{here}} +#pragma clang module import // expected-error {{expected module name}} +#pragma clang module import ! // expected-error {{expected module name}} +#pragma clang module import if // expected-error {{expected module name}} +#pragma clang module import foo ? bar // expected-warning {{extra tokens at end of #pragma}} +#pragma clang module import foo. // expected-error {{expected identifier after '.' in module name}} +#pragma clang module import foo.bar.baz.quux // expected-error {{no submodule named 'bar' in module 'foo'}} + +#pragma clang module begin ! // expected-error {{expected module name}} + +#pragma clang module begin foo.a blah // expected-warning {{extra tokens}} + #pragma clang module begin foo.a // nesting is OK + #define X 1 // expected-note 0-1{{previous}} + #ifndef X + #error X should be defined here + #endif + #pragma clang module end + + #ifndef X + #error X should still be defined + #endif +#pragma clang module end foo.a // expected-warning {{extra tokens}} + +// #pragma clang module begin/end also import the module into the enclosing context +#ifndef X +#error X should still be defined +#endif + +#pragma clang module begin foo.b + #if defined(X) && defined(LOCAL_VIS) + #error under -fmodules-local-submodule-visibility, X should not be defined + #endif + + #if !defined(X) && !defined(LOCAL_VIS) + #error without -fmodules-local-submodule-visibility, X should still be defined + #endif + + #pragma clang module import foo.a + #ifndef X + #error X should be defined here + #endif +#pragma clang module end + +#pragma clang module end // expected-error {{no matching '#pragma clang module begin'}} +#pragma clang module begin foo.a // expected-error {{no matching '#pragma clang module end'}} |

