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; 8typedef 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 18void f(A *a) { 19 [a init]; 20} 21 22@class A; 23 24B *f1() { 25 return [B create_a_B]; 26} 27 28@class B; 29 30void testProtoMerge(id<P1> p1, id<P2> p2) { 31 [p1 protoMethod1]; 32 [p2 protoMethod2]; 33} 34 35struct S1 { 36 int s1_field; 37}; 38 39struct S3 { 40 int s3_field; 41}; 42 43void 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 58void 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 68void 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 75void 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. 86void 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. 97void test_C(C *c) { 98 c = get_a_C(); 99 accept_a_C(c); 100} 101 102void test_C2(C2 *c2) { 103 c2 = get_a_C2(); 104 accept_a_C2(c2); 105} 106 107void test_C3(C3 *c3) { 108 c3 = get_a_C3(); 109 accept_a_C3(c3); 110} 111 112C4 *global_C4; 113 114ClassWithDef *cwd1; 115 116@__experimental_modules_import redecl_merge_left_left; 117 118void test_C4a(C4 *c4) { 119 global_C4 = c4 = get_a_C4(); 120 accept_a_C4(c4); 121} 122 123void test_ClassWithDef(ClassWithDef *cwd) { 124 [cwd method]; 125} 126 127@__experimental_modules_import redecl_merge_bottom; 128 129void test_C4b() { 130 if (&refers_to_C4) { 131 } 132} 133 134@implementation B 135+ (B*)create_a_B { return 0; } 136@end 137 138void g(A *a) { 139 [a init]; 140} 141 142@protocol P3 143- (void)p3_method; 144@end 145 146id<P4> p4; 147id<P3> p3; 148 149#ifdef __cplusplus 150void 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'. 157funcptr_with_id fid; 158id id_global; 159