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