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