blob: 1081995c586f0f1158499da6580e45d4549e759d [file] [log] [blame]
Richard Smithdd8b5332017-09-04 05:37:53 +00001// RUN: %clang_cc1 -std=c++1z -fmodules-ts -emit-module-interface %s -o %t.0.pcm -verify -DTEST=0
2// RUN: %clang_cc1 -std=c++1z -fmodules-ts -emit-module-interface %s -o %t.1.pcm -verify -DTEST=1
3// RUN: %clang_cc1 -std=c++1z -fmodules-ts -emit-module-interface %s -fmodule-file=%t.0.pcm -o %t.2.pcm -verify -DTEST=2
4// RUN: %clang_cc1 -std=c++1z -fmodules-ts -emit-module-interface %s -fmodule-file=%t.0.pcm -o %t.3.pcm -verify -Dfoo=bar -DTEST=3
Richard Smith8df390f2016-09-08 23:14:54 +00005
6#if TEST == 0
7// expected-no-diagnostics
8#endif
9
Richard Smith81328ac2017-04-21 22:39:18 +000010export module foo;
Richard Smith145e15a2017-04-24 23:12:30 +000011#if TEST == 2
12// expected-error@-2 {{redefinition of module 'foo'}}
13// expected-note@modules-ts.cppm:* {{loaded from}}
Richard Smith8df390f2016-09-08 23:14:54 +000014#endif
15
Richard Smithe03a6542017-07-05 01:42:07 +000016static int m;
Richard Smithbecb92d2017-10-10 22:33:17 +000017#if TEST == 2
Richard Smithe03a6542017-07-05 01:42:07 +000018// expected-error@-2 {{redefinition of '}}
19// expected-note@-3 {{unguarded header; consider using #ifdef guards or #pragma once}}
20// FIXME: We should drop the "header from" in this diagnostic.
21// expected-note-re@modules-ts.cppm:1 {{'{{.*}}modules-ts.cppm' included multiple times, additional include site in header from module 'foo'}}
22#endif
Richard Smith8df390f2016-09-08 23:14:54 +000023int n;
Richard Smithdd8b5332017-09-04 05:37:53 +000024#if TEST == 2
Richard Smith8df390f2016-09-08 23:14:54 +000025// expected-error@-2 {{redefinition of '}}
Bruno Cardoso Lopes0ad31822017-05-11 06:20:07 +000026// expected-note@-3 {{unguarded header; consider using #ifdef guards or #pragma once}}
Richard Smith54f04402017-05-18 02:29:20 +000027// FIXME: We should drop the "header from" in this diagnostic.
28// expected-note-re@modules-ts.cppm:1 {{'{{.*}}modules-ts.cppm' included multiple times, additional include site in header from module 'foo'}}
Richard Smith8df390f2016-09-08 23:14:54 +000029#endif
30
31#if TEST == 0
32export {
33 int a;
34 int b;
35 constexpr int *p = &n;
36}
37export int c;
38
39namespace N {
40 export void f() {}
41}
42
43export struct T {} t;
44#elif TEST == 3
45int use_a = a; // expected-error {{declaration of 'a' must be imported from module 'foo' before it is required}}
46// expected-note@-13 {{previous}}
47
48#undef foo
49import foo;
50
51export {} // expected-error {{export declaration cannot be empty}}
Richard Smithe181de72019-04-22 22:50:11 +000052export { // expected-note {{begins here}}
53 ; // expected-warning {{ISO C++20 does not permit an empty declaration to appear in an export block}}
54}
55export { // expected-note {{begins here}}
56 static_assert(true); // expected-warning {{ISO C++20 does not permit a static_assert declaration to appear in an export block}}
57}
Richard Smith8df390f2016-09-08 23:14:54 +000058
Richard Smith8df390f2016-09-08 23:14:54 +000059int use_b = b;
60int use_n = n; // FIXME: this should not be visible, because it is not exported
61
62extern int n;
Richard Smithdd8b5332017-09-04 05:37:53 +000063static_assert(&n != p);
Richard Smith8df390f2016-09-08 23:14:54 +000064#endif
65
66
67#if TEST == 1
68struct S {
69 export int n; // expected-error {{expected member name or ';'}}
70 export static int n; // expected-error {{expected member name or ';'}}
71};
72#endif
73
74// FIXME: Exports of declarations without external linkage are disallowed.
75// Exports of declarations with non-external-linkage types are disallowed.
Richard Smith3b660562016-09-26 21:27:23 +000076
77// Cannot export within another export. This isn't precisely covered by the
78// language rules right now, but (per personal correspondence between zygoloid
79// and gdr) is the intent.
80#if TEST == 1
Richard Smithe181de72019-04-22 22:50:11 +000081export { // expected-note {{export block begins here}}
Richard Smith3b660562016-09-26 21:27:23 +000082 extern "C++" {
83 namespace NestedExport {
84 export { // expected-error {{appears within another export}}
85 int q;
86 }
87 }
88 }
89}
90#endif