xref: /aosp_15_r20/external/clang/test/Modules/macro-ambiguity.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: rm -rf %t
2*67e74705SXin Li // RUN: cd %S
3*67e74705SXin Li //
4*67e74705SXin Li // RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
5*67e74705SXin Li // RUN:   -v \
6*67e74705SXin Li // RUN:   -iquote Inputs/macro-ambiguity/a/quote \
7*67e74705SXin Li // RUN:   -isystem Inputs/macro-ambiguity/a/system \
8*67e74705SXin Li // RUN:   -fno-implicit-modules \
9*67e74705SXin Li // RUN:   -fmodule-map-file-home-is-cwd \
10*67e74705SXin Li // RUN:   -emit-module -fmodule-name=a -o %t/a.pcm \
11*67e74705SXin Li // RUN:   Inputs/macro-ambiguity/module.modulemap
12*67e74705SXin Li //
13*67e74705SXin Li // RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
14*67e74705SXin Li // RUN:   -v \
15*67e74705SXin Li // RUN:   -iquote Inputs/macro-ambiguity/b/quote \
16*67e74705SXin Li // RUN:   -isystem Inputs/macro-ambiguity/b/system \
17*67e74705SXin Li // RUN:   -fno-implicit-modules \
18*67e74705SXin Li // RUN:   -fmodule-map-file-home-is-cwd \
19*67e74705SXin Li // RUN:   -emit-module -fmodule-name=b -o %t/b.pcm \
20*67e74705SXin Li // RUN:   Inputs/macro-ambiguity/module.modulemap
21*67e74705SXin Li //
22*67e74705SXin Li // RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
23*67e74705SXin Li // RUN:   -v \
24*67e74705SXin Li // RUN:   -iquote Inputs/macro-ambiguity/c/quote \
25*67e74705SXin Li // RUN:   -isystem Inputs/macro-ambiguity/c/system \
26*67e74705SXin Li // RUN:   -fno-implicit-modules \
27*67e74705SXin Li // RUN:   -fmodule-map-file-home-is-cwd \
28*67e74705SXin Li // RUN:   -emit-module -fmodule-name=c -o %t/c.pcm \
29*67e74705SXin Li // RUN:   Inputs/macro-ambiguity/module.modulemap
30*67e74705SXin Li //
31*67e74705SXin Li // RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
32*67e74705SXin Li // RUN:   -v \
33*67e74705SXin Li // RUN:   -iquote Inputs/macro-ambiguity/d/quote \
34*67e74705SXin Li // RUN:   -isystem Inputs/macro-ambiguity/d/system \
35*67e74705SXin Li // RUN:   -fno-implicit-modules \
36*67e74705SXin Li // RUN:   -fmodule-map-file-home-is-cwd \
37*67e74705SXin Li // RUN:   -emit-module -fmodule-name=d -o %t/d.pcm \
38*67e74705SXin Li // RUN:   Inputs/macro-ambiguity/module.modulemap
39*67e74705SXin Li //
40*67e74705SXin Li // RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
41*67e74705SXin Li // RUN:   -v \
42*67e74705SXin Li // RUN:   -iquote Inputs/macro-ambiguity/a/quote \
43*67e74705SXin Li // RUN:   -isystem Inputs/macro-ambiguity/a/system \
44*67e74705SXin Li // RUN:   -iquote Inputs/macro-ambiguity/b/quote \
45*67e74705SXin Li // RUN:   -isystem Inputs/macro-ambiguity/b/system \
46*67e74705SXin Li // RUN:   -iquote Inputs/macro-ambiguity/c/quote \
47*67e74705SXin Li // RUN:   -isystem Inputs/macro-ambiguity/c/system \
48*67e74705SXin Li // RUN:   -iquote Inputs/macro-ambiguity/d/quote \
49*67e74705SXin Li // RUN:   -isystem Inputs/macro-ambiguity/d/system \
50*67e74705SXin Li // RUN:   -iquote Inputs/macro-ambiguity/e/quote \
51*67e74705SXin Li // RUN:   -isystem Inputs/macro-ambiguity/e/system \
52*67e74705SXin Li // RUN:   -fno-implicit-modules \
53*67e74705SXin Li // RUN:   -fmodule-map-file-home-is-cwd \
54*67e74705SXin Li // RUN:   -fmodule-map-file=Inputs/macro-ambiguity/module.modulemap \
55*67e74705SXin Li // RUN:   -fmodule-file=%t/a.pcm \
56*67e74705SXin Li // RUN:   -fmodule-file=%t/b.pcm \
57*67e74705SXin Li // RUN:   -fmodule-file=%t/c.pcm \
58*67e74705SXin Li // RUN:   -fmodule-file=%t/d.pcm \
59*67e74705SXin Li // RUN:   -Wambiguous-macro -verify macro-ambiguity.cpp
60*67e74705SXin Li //
61*67e74705SXin Li // RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
62*67e74705SXin Li // RUN:   -v -fmodules-local-submodule-visibility \
63*67e74705SXin Li // RUN:   -iquote Inputs/macro-ambiguity/a/quote \
64*67e74705SXin Li // RUN:   -isystem Inputs/macro-ambiguity/a/system \
65*67e74705SXin Li // RUN:   -iquote Inputs/macro-ambiguity/b/quote \
66*67e74705SXin Li // RUN:   -isystem Inputs/macro-ambiguity/b/system \
67*67e74705SXin Li // RUN:   -iquote Inputs/macro-ambiguity/c/quote \
68*67e74705SXin Li // RUN:   -isystem Inputs/macro-ambiguity/c/system \
69*67e74705SXin Li // RUN:   -iquote Inputs/macro-ambiguity/d/quote \
70*67e74705SXin Li // RUN:   -isystem Inputs/macro-ambiguity/d/system \
71*67e74705SXin Li // RUN:   -iquote Inputs/macro-ambiguity/e/quote \
72*67e74705SXin Li // RUN:   -isystem Inputs/macro-ambiguity/e/system \
73*67e74705SXin Li // RUN:   -fno-implicit-modules \
74*67e74705SXin Li // RUN:   -fmodule-map-file-home-is-cwd \
75*67e74705SXin Li // RUN:   -fmodule-map-file=Inputs/macro-ambiguity/module.modulemap \
76*67e74705SXin Li // RUN:   -fmodule-file=%t/a.pcm \
77*67e74705SXin Li // RUN:   -fmodule-file=%t/b.pcm \
78*67e74705SXin Li // RUN:   -fmodule-file=%t/c.pcm \
79*67e74705SXin Li // RUN:   -fmodule-file=%t/d.pcm \
80*67e74705SXin Li // RUN:   -Wambiguous-macro -verify macro-ambiguity.cpp
81*67e74705SXin Li 
82*67e74705SXin Li // Include the textual headers first to maximize the ways in which things can
83*67e74705SXin Li // become ambiguous.
84*67e74705SXin Li #include "e_quote.h"
85*67e74705SXin Li #include <e_system.h>
86*67e74705SXin Li 
87*67e74705SXin Li #include "a_quote.h"
88*67e74705SXin Li #include <a_system.h>
89*67e74705SXin Li #include "b_quote.h"
90*67e74705SXin Li #include <b_system.h>
91*67e74705SXin Li #include "c_quote.h"
92*67e74705SXin Li #include <c_system.h>
93*67e74705SXin Li #include "d_quote.h"
94*67e74705SXin Li #include <d_system.h>
95*67e74705SXin Li 
test(int x)96*67e74705SXin Li int test(int x) {
97*67e74705SXin Li   // We expect to get warnings for all of the quoted includes but none of the
98*67e74705SXin Li   // system includes here because the first module is a non-system module and
99*67e74705SXin Li   // the quote macros come from non-system-headers.
100*67e74705SXin Li   x = FOO1_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
101*67e74705SXin Li   // expected-note@Inputs/macro-ambiguity/c/quote/c_quote.h:4 {{expanding this definition}}
102*67e74705SXin Li   // expected-note@Inputs/macro-ambiguity/a/quote/a_quote.h:4 {{other definition}}
103*67e74705SXin Li 
104*67e74705SXin Li   x = FOO1_SYSTEM(x);
105*67e74705SXin Li 
106*67e74705SXin Li   x = BAR1_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
107*67e74705SXin Li   // expected-note@Inputs/macro-ambiguity/d/quote/d_quote.h:4 {{expanding this definition}}
108*67e74705SXin Li   // expected-note@Inputs/macro-ambiguity/a/quote/a_quote.h:5 {{other definition}}
109*67e74705SXin Li 
110*67e74705SXin Li   x = BAR1_SYSTEM(x);
111*67e74705SXin Li 
112*67e74705SXin Li   x = BAZ1_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
113*67e74705SXin Li   // expected-note@Inputs/macro-ambiguity/a/quote/a_quote.h:6 {{expanding this definition}}
114*67e74705SXin Li   // expected-note@Inputs/macro-ambiguity/e/quote/e_quote.h:4 {{other definition}}
115*67e74705SXin Li 
116*67e74705SXin Li   x = BAZ1_SYSTEM(x);
117*67e74705SXin Li 
118*67e74705SXin Li   // Here, we don't even warn on bar because in that cas both b and d are
119*67e74705SXin Li   // system modules and so the use of non-system headers is irrelevant.
120*67e74705SXin Li   x = FOO2_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
121*67e74705SXin Li   // expected-note@Inputs/macro-ambiguity/c/quote/c_quote.h:5 {{expanding this definition}}
122*67e74705SXin Li   // expected-note@Inputs/macro-ambiguity/b/quote/b_quote.h:4 {{other definition}}
123*67e74705SXin Li 
124*67e74705SXin Li   x = FOO2_SYSTEM(x);
125*67e74705SXin Li 
126*67e74705SXin Li   x = BAR2_QUOTE(x);
127*67e74705SXin Li 
128*67e74705SXin Li   x = BAR2_SYSTEM(x);
129*67e74705SXin Li 
130*67e74705SXin Li   x = BAZ2_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
131*67e74705SXin Li   // expected-note@Inputs/macro-ambiguity/b/quote/b_quote.h:6 {{expanding this definition}}
132*67e74705SXin Li   // expected-note@Inputs/macro-ambiguity/e/quote/e_quote.h:5 {{other definition}}
133*67e74705SXin Li 
134*67e74705SXin Li   x = BAZ2_SYSTEM(x);
135*67e74705SXin Li   return x;
136*67e74705SXin Li }
137