xref: /aosp_15_r20/external/clang/test/Modules/redecl-merge.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: rm -rf %t
2*67e74705SXin Li// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -Wreturn-type -fmodules-cache-path=%t -I %S/Inputs %s -verify -Wno-objc-root-class
3*67e74705SXin Li
4*67e74705SXin Li@class C2;
5*67e74705SXin Li@class C3;
6*67e74705SXin Li@class C3;
7*67e74705SXin Li@import redecl_merge_left;
8*67e74705SXin Litypedef struct my_struct_type *my_struct_ref;
9*67e74705SXin Li@protocol P4;
10*67e74705SXin Li@class C3;
11*67e74705SXin Li@class C3;
12*67e74705SXin Li
13*67e74705SXin Liint *call_eventually_noreturn(void) {
14*67e74705SXin Li  eventually_noreturn();
15*67e74705SXin Li} // expected-warning{{control reaches end of non-void function}}
16*67e74705SXin Li
17*67e74705SXin Liint *call_eventually_noreturn2(void) {
18*67e74705SXin Li  eventually_noreturn2();
19*67e74705SXin Li} // expected-warning{{control reaches end of non-void function}}
20*67e74705SXin Li
21*67e74705SXin Li@import redecl_merge_right;
22*67e74705SXin Li
23*67e74705SXin Liint *call_eventually_noreturn_again(void) {
24*67e74705SXin Li  eventually_noreturn();
25*67e74705SXin Li}
26*67e74705SXin Li
27*67e74705SXin Liint *call_eventually_noreturn2_again(void) {
28*67e74705SXin Li  // noreturn and non-noreturn functions have different types
29*67e74705SXin Li  eventually_noreturn2(); // expected-error{{call to 'eventually_noreturn2' is ambiguous}}
30*67e74705SXin Li  // expected-note@Inputs/redecl-merge-left.h:93{{candidate function}}
31*67e74705SXin Li  // expected-note@Inputs/redecl-merge-right.h:90{{candidate function}}
32*67e74705SXin Li}
33*67e74705SXin Li
34*67e74705SXin Li@implementation A
35*67e74705SXin Li- (Super*)init { return self; }
36*67e74705SXin Li@end
37*67e74705SXin Li
38*67e74705SXin Livoid f(A *a) {
39*67e74705SXin Li  [a init];
40*67e74705SXin Li}
41*67e74705SXin Li
42*67e74705SXin Li@class A;
43*67e74705SXin Li
44*67e74705SXin LiB *f1() {
45*67e74705SXin Li  return [B create_a_B];
46*67e74705SXin Li}
47*67e74705SXin Li
48*67e74705SXin Li@class B;
49*67e74705SXin Li
50*67e74705SXin Livoid testProtoMerge(id<P1> p1, id<P2> p2) {
51*67e74705SXin Li  [p1 protoMethod1];
52*67e74705SXin Li  [p2 protoMethod2];
53*67e74705SXin Li}
54*67e74705SXin Li
55*67e74705SXin Listruct S1 {
56*67e74705SXin Li  int s1_field;
57*67e74705SXin Li};
58*67e74705SXin Li
59*67e74705SXin Listruct S3 {
60*67e74705SXin Li  int s3_field;
61*67e74705SXin Li};
62*67e74705SXin Li
63*67e74705SXin Livoid testTagMerge() {
64*67e74705SXin Li  consume_S1(produce_S1());
65*67e74705SXin Li  struct S2 s2;
66*67e74705SXin Li  s2.field = 0;
67*67e74705SXin Li  consume_S2(produce_S2());
68*67e74705SXin Li  struct S1 s1;
69*67e74705SXin Li  s1.s1_field = 0;
70*67e74705SXin Li  consume_S3(produce_S3());
71*67e74705SXin Li  struct S4 s4;
72*67e74705SXin Li  s4.field = 0;
73*67e74705SXin Li  consume_S4(produce_S4());
74*67e74705SXin Li  struct S3 s3;
75*67e74705SXin Li  s3.s3_field = 0;
76*67e74705SXin Li}
77*67e74705SXin Li
78*67e74705SXin Livoid testTypedefMerge(int i, double d) {
79*67e74705SXin Li  T1 *ip = &i;
80*67e74705SXin Li  // FIXME: Typedefs aren't actually merged in the sense of other merges, because
81*67e74705SXin Li  // we should only merge them when the types are identical.
82*67e74705SXin Li  // expected-note@Inputs/redecl-merge-left.h:60{{candidate found by name lookup is 'T2'}}
83*67e74705SXin Li  // expected-note@Inputs/redecl-merge-right.h:63{{candidate found by name lookup is 'T2'}}
84*67e74705SXin Li  T2 *dp = &d; // expected-error{{reference to 'T2' is ambiguous}}
85*67e74705SXin Li}
86*67e74705SXin Li
87*67e74705SXin Livoid testFuncMerge(int i) {
88*67e74705SXin Li  func0(i);
89*67e74705SXin Li  func1(i);
90*67e74705SXin Li  // expected-note@Inputs/redecl-merge-left.h:64{{candidate function}}
91*67e74705SXin Li  // expected-note@Inputs/redecl-merge-right.h:70{{candidate function}}
92*67e74705SXin Li  func2(i); // expected-error{{call to 'func2' is ambiguous}}
93*67e74705SXin Li}
94*67e74705SXin Li
95*67e74705SXin Livoid testVarMerge(int i) {
96*67e74705SXin Li  var1 = i;
97*67e74705SXin Li  // expected-note@Inputs/redecl-merge-left.h:77{{candidate found by name lookup is 'var2'}}
98*67e74705SXin Li  // expected-note@Inputs/redecl-merge-right.h:77{{candidate found by name lookup is 'var2'}}
99*67e74705SXin Li  var2 = i; // expected-error{{reference to 'var2' is ambiguous}}
100*67e74705SXin Li  // expected-note@Inputs/redecl-merge-left.h:79{{candidate found by name lookup is 'var3'}}
101*67e74705SXin Li  // expected-note@Inputs/redecl-merge-right.h:79{{candidate found by name lookup is 'var3'}}
102*67e74705SXin Li  var3 = i; // expected-error{{reference to 'var3' is ambiguous}}
103*67e74705SXin Li}
104*67e74705SXin Li
105*67e74705SXin Li// Test redeclarations of entities in explicit submodules, to make
106*67e74705SXin Li// sure we're maintaining the declaration chains even when normal name
107*67e74705SXin Li// lookup can't see what we're looking for.
108*67e74705SXin Livoid testExplicit() {
109*67e74705SXin Li  Explicit *e;
110*67e74705SXin Li  int *(*fp)(void) = &explicit_func;
111*67e74705SXin Li  int *ip = explicit_func();
112*67e74705SXin Li
113*67e74705SXin Li  // FIXME: Should complain about definition not having been imported.
114*67e74705SXin Li  struct explicit_struct es = { 0 };
115*67e74705SXin Li}
116*67e74705SXin Li
117*67e74705SXin Li// Test resolution of declarations from multiple modules with no
118*67e74705SXin Li// common original declaration.
119*67e74705SXin Livoid test_C(C *c) {
120*67e74705SXin Li  c = get_a_C();
121*67e74705SXin Li  accept_a_C(c);
122*67e74705SXin Li}
123*67e74705SXin Li
124*67e74705SXin Livoid test_C2(C2 *c2) {
125*67e74705SXin Li  c2 = get_a_C2();
126*67e74705SXin Li  accept_a_C2(c2);
127*67e74705SXin Li}
128*67e74705SXin Li
129*67e74705SXin Livoid test_C3(C3 *c3) {
130*67e74705SXin Li  c3 = get_a_C3();
131*67e74705SXin Li  accept_a_C3(c3);
132*67e74705SXin Li}
133*67e74705SXin Li
134*67e74705SXin LiC4 *global_C4;
135*67e74705SXin Li
136*67e74705SXin LiClassWithDef *cwd1;
137*67e74705SXin Li
138*67e74705SXin Li@import redecl_merge_left_left;
139*67e74705SXin Li
140*67e74705SXin Livoid test_C4a(C4 *c4) {
141*67e74705SXin Li  global_C4 = c4 = get_a_C4();
142*67e74705SXin Li  accept_a_C4(c4);
143*67e74705SXin Li}
144*67e74705SXin Li
145*67e74705SXin Livoid test_ClassWithDef(ClassWithDef *cwd) {
146*67e74705SXin Li  [cwd method];
147*67e74705SXin Li}
148*67e74705SXin Li
149*67e74705SXin Li@import redecl_merge_bottom;
150*67e74705SXin Li
151*67e74705SXin Livoid test_C4b() {
152*67e74705SXin Li  if (&refers_to_C4) {
153*67e74705SXin Li  }
154*67e74705SXin Li}
155*67e74705SXin Li
156*67e74705SXin Li@implementation B
157*67e74705SXin Li+ (B*)create_a_B { return 0; }
158*67e74705SXin Li@end
159*67e74705SXin Li
160*67e74705SXin Livoid g(A *a) {
161*67e74705SXin Li  [a init];
162*67e74705SXin Li}
163*67e74705SXin Li
164*67e74705SXin Li@protocol P3
165*67e74705SXin Li- (void)p3_method;
166*67e74705SXin Li@end
167*67e74705SXin Li
168*67e74705SXin Liid<P4> p4;
169*67e74705SXin Liid<P3> p3;
170*67e74705SXin Li
171*67e74705SXin Li// Make sure we don't get conflicts with 'id'.
172*67e74705SXin Lifuncptr_with_id fid;
173*67e74705SXin Liid id_global;
174*67e74705SXin Li
175*67e74705SXin Li
176