xref: /aosp_15_r20/external/clang/test/Modules/macros2.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: rm -rf %t
2*67e74705SXin Li // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s
3*67e74705SXin Li // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-local-submodule-visibility -x objective-c++ -verify -fmodules-cache-path=%t -I %S/Inputs %s -DLOCAL_VISIBILITY
4*67e74705SXin Li 
5*67e74705SXin Li // This test checks some of the same things as macros.c, but imports modules in
6*67e74705SXin Li // a different order.
7*67e74705SXin Li 
8*67e74705SXin Li @import macros_other;
9*67e74705SXin Li 
10*67e74705SXin Li int n0 = TOP_OTHER_DEF_RIGHT_UNDEF; // ok
11*67e74705SXin Li 
12*67e74705SXin Li @import macros_top;
13*67e74705SXin Li 
14*67e74705SXin Li TOP_OTHER_DEF_RIGHT_UNDEF *n0b; // expected-warning{{ambiguous expansion of macro 'TOP_OTHER_DEF_RIGHT_UNDEF'}}
15*67e74705SXin Li // expected-note@macros_top.h:22 {{expanding this definition of 'TOP_OTHER_DEF_RIGHT_UNDEF'}}
16*67e74705SXin Li // expected-note@macros_other.h:6 {{other definition of 'TOP_OTHER_DEF_RIGHT_UNDEF'}}
17*67e74705SXin Li 
18*67e74705SXin Li @import macros_right;
19*67e74705SXin Li @import macros_left;
20*67e74705SXin Li 
21*67e74705SXin Li #ifdef TOP_LEFT_UNDEF
22*67e74705SXin Li #  error TOP_LEFT_UNDEF should not be defined
23*67e74705SXin Li #endif
24*67e74705SXin Li 
25*67e74705SXin Li #ifndef TOP_RIGHT_UNDEF
26*67e74705SXin Li #  error TOP_RIGHT_UNDEF should still be defined
27*67e74705SXin Li #endif
28*67e74705SXin Li 
test()29*67e74705SXin Li void test() {
30*67e74705SXin Li   float f;
31*67e74705SXin Li   TOP_RIGHT_REDEF *fp = &f; // ok, right's definition overrides top's definition
32*67e74705SXin Li 
33*67e74705SXin Li   // Note, left's definition wins here, whereas right's definition wins in
34*67e74705SXin Li   // macros.c.
35*67e74705SXin Li   int i;
36*67e74705SXin Li   LEFT_RIGHT_IDENTICAL *ip = &i;
37*67e74705SXin Li   LEFT_RIGHT_DIFFERENT *ip2 = &f; // expected-warning{{ambiguous expansion of macro 'LEFT_RIGHT_DIFFERENT'}}
38*67e74705SXin Li   // expected-note@macros_left.h:14 {{expanding this}}
39*67e74705SXin Li   // expected-note@macros_right.h:12 {{other}}
40*67e74705SXin Li   LEFT_RIGHT_DIFFERENT2 *ip3 = &f; // expected-warning{{ambiguous expansion of macro 'LEFT_RIGHT_DIFFERENT2}}
41*67e74705SXin Li   // expected-note@macros_left.h:11 {{expanding this}}
42*67e74705SXin Li   // expected-note@macros_right.h:13 {{other}}
43*67e74705SXin Li #undef LEFT_RIGHT_DIFFERENT3
44*67e74705SXin Li   int LEFT_RIGHT_DIFFERENT3;
45*67e74705SXin Li }
46*67e74705SXin Li 
47*67e74705SXin Li @import macros_right.undef;
48*67e74705SXin Li 
49*67e74705SXin Li // See macros.c.
50*67e74705SXin Li #ifdef LOCAL_VISIBILITY
51*67e74705SXin Li # ifndef TOP_RIGHT_UNDEF
52*67e74705SXin Li #  error TOP_RIGHT_UNDEF should still be defined
53*67e74705SXin Li # endif
54*67e74705SXin Li #else
55*67e74705SXin Li # ifdef TOP_RIGHT_UNDEF
56*67e74705SXin Li #  error TOP_RIGHT_UNDEF should not be defined
57*67e74705SXin Li # endif
58*67e74705SXin Li #endif
59*67e74705SXin Li 
60*67e74705SXin Li #ifndef TOP_OTHER_UNDEF1
61*67e74705SXin Li # error TOP_OTHER_UNDEF1 should still be defined
62*67e74705SXin Li #endif
63*67e74705SXin Li 
64*67e74705SXin Li #ifndef TOP_OTHER_UNDEF2
65*67e74705SXin Li # error TOP_OTHER_UNDEF2 should still be defined
66*67e74705SXin Li #endif
67*67e74705SXin Li 
68*67e74705SXin Li #ifndef TOP_OTHER_REDEF1
69*67e74705SXin Li # error TOP_OTHER_REDEF1 should still be defined
70*67e74705SXin Li #endif
71*67e74705SXin Li int n1 = TOP_OTHER_REDEF1; // expected-warning{{ambiguous expansion of macro 'TOP_OTHER_REDEF1'}}
72*67e74705SXin Li // expected-note@macros_top.h:19 {{expanding this definition}}
73*67e74705SXin Li // expected-note@macros_other.h:4 {{other definition}}
74*67e74705SXin Li 
75*67e74705SXin Li #ifndef TOP_OTHER_REDEF2
76*67e74705SXin Li # error TOP_OTHER_REDEF2 should still be defined
77*67e74705SXin Li #endif
78*67e74705SXin Li int n2 = TOP_OTHER_REDEF2; // ok
79*67e74705SXin Li 
80*67e74705SXin Li int n3 = TOP_OTHER_DEF_RIGHT_UNDEF; // ok
81*67e74705SXin Li 
82*67e74705SXin Li int top_redef_in_submodules = TOP_REDEF_IN_SUBMODULES;
83*67e74705SXin Li @import macros_top.c;
test2()84*67e74705SXin Li void test2() {
85*67e74705SXin Li   int TOP_REDEF_IN_SUBMODULES = top_redef_in_submodules;
86*67e74705SXin Li }
87