Home | History | Annotate | Download | only in Modules
      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