Douglas Gregor | a1be278 | 2011-12-17 23:38:30 +0000 | [diff] [blame] | 1 | // RUN: rm -rf %t |
Douglas Gregor | 674949f | 2012-01-03 17:31:38 +0000 | [diff] [blame] | 2 | // RUN: %clang_cc1 -fmodules -fmodule-cache-path %t -I %S/Inputs %s -verify |
| 3 | // RUN: %clang_cc1 -x objective-c++ -fmodules -fmodule-cache-path %t -I %S/Inputs %s -verify |
Douglas Gregor | 0f75323 | 2011-12-22 01:48:48 +0000 | [diff] [blame] | 4 | @class C2; |
| 5 | @class C3; |
| 6 | @class C3; |
Douglas Gregor | 5948ae1 | 2012-01-03 18:04:46 +0000 | [diff] [blame] | 7 | @import redecl_merge_left; |
Douglas Gregor | 0f75323 | 2011-12-22 01:48:48 +0000 | [diff] [blame] | 8 | |
Douglas Gregor | dba9361 | 2012-01-01 21:47:52 +0000 | [diff] [blame] | 9 | @protocol P4; |
Douglas Gregor | 0f75323 | 2011-12-22 01:48:48 +0000 | [diff] [blame] | 10 | @class C3; |
| 11 | @class C3; |
Douglas Gregor | 5948ae1 | 2012-01-03 18:04:46 +0000 | [diff] [blame] | 12 | @import redecl_merge_right; |
Douglas Gregor | a1be278 | 2011-12-17 23:38:30 +0000 | [diff] [blame] | 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 | |
Douglas Gregor | adafc2e | 2011-12-19 16:14:14 +0000 | [diff] [blame] | 24 | B *f1() { |
| 25 | return [B create_a_B]; |
| 26 | } |
| 27 | |
Douglas Gregor | ecb1938 | 2011-12-19 15:27:36 +0000 | [diff] [blame] | 28 | @class B; |
| 29 | |
Douglas Gregor | 27c6da2 | 2012-01-01 20:30:41 +0000 | [diff] [blame] | 30 | void testProtoMerge(id<P1> p1, id<P2> p2) { |
| 31 | [p1 protoMethod1]; |
| 32 | [p2 protoMethod2]; |
| 33 | } |
| 34 | |
Douglas Gregor | 1ca4a5c | 2012-01-03 22:46:00 +0000 | [diff] [blame] | 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 | |
Douglas Gregor | 7a53740 | 2012-01-03 23:26:26 +0000 | [diff] [blame^] | 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 | T2 *dp = &d; // expected-error{{reference to 'T2' is ambiguous}} |
| 65 | } |
| 66 | |
Douglas Gregor | 2ccd89c | 2011-12-20 18:11:52 +0000 | [diff] [blame] | 67 | // Test redeclarations of entities in explicit submodules, to make |
| 68 | // sure we're maintaining the declaration chains even when normal name |
| 69 | // lookup can't see what we're looking for. |
| 70 | void testExplicit() { |
| 71 | Explicit *e; |
| 72 | int *(*fp)(void) = &explicit_func; |
| 73 | int *ip = explicit_func(); |
| 74 | |
| 75 | // FIXME: Should complain about definition not having been imported. |
| 76 | struct explicit_struct es = { 0 }; |
| 77 | } |
| 78 | |
Douglas Gregor | 0f75323 | 2011-12-22 01:48:48 +0000 | [diff] [blame] | 79 | // Test resolution of declarations from multiple modules with no |
| 80 | // common original declaration. |
| 81 | void test_C(C *c) { |
| 82 | c = get_a_C(); |
| 83 | accept_a_C(c); |
| 84 | } |
| 85 | |
| 86 | void test_C2(C2 *c2) { |
| 87 | c2 = get_a_C2(); |
| 88 | accept_a_C2(c2); |
| 89 | } |
| 90 | |
| 91 | void test_C3(C3 *c3) { |
| 92 | c3 = get_a_C3(); |
| 93 | accept_a_C3(c3); |
| 94 | } |
| 95 | |
Douglas Gregor | cce54aa | 2011-12-22 19:44:59 +0000 | [diff] [blame] | 96 | C4 *global_C4; |
Douglas Gregor | 5948ae1 | 2012-01-03 18:04:46 +0000 | [diff] [blame] | 97 | @import redecl_merge_left_left; |
Douglas Gregor | cce54aa | 2011-12-22 19:44:59 +0000 | [diff] [blame] | 98 | |
Douglas Gregor | c3cfd2a | 2011-12-22 21:40:42 +0000 | [diff] [blame] | 99 | void test_C4a(C4 *c4) { |
Douglas Gregor | cce54aa | 2011-12-22 19:44:59 +0000 | [diff] [blame] | 100 | global_C4 = c4 = get_a_C4(); |
| 101 | accept_a_C4(c4); |
| 102 | } |
| 103 | |
Douglas Gregor | 5948ae1 | 2012-01-03 18:04:46 +0000 | [diff] [blame] | 104 | @import redecl_merge_bottom; |
Douglas Gregor | a1be278 | 2011-12-17 23:38:30 +0000 | [diff] [blame] | 105 | |
Douglas Gregor | c3cfd2a | 2011-12-22 21:40:42 +0000 | [diff] [blame] | 106 | void test_C4b() { |
| 107 | if (&refers_to_C4) { |
| 108 | } |
| 109 | } |
| 110 | |
Douglas Gregor | ecb1938 | 2011-12-19 15:27:36 +0000 | [diff] [blame] | 111 | @implementation B |
Douglas Gregor | adafc2e | 2011-12-19 16:14:14 +0000 | [diff] [blame] | 112 | + (B*)create_a_B { return 0; } |
Douglas Gregor | ecb1938 | 2011-12-19 15:27:36 +0000 | [diff] [blame] | 113 | @end |
| 114 | |
Douglas Gregor | a1be278 | 2011-12-17 23:38:30 +0000 | [diff] [blame] | 115 | void g(A *a) { |
| 116 | [a init]; |
| 117 | } |
Douglas Gregor | f63b0a5 | 2011-12-19 18:19:24 +0000 | [diff] [blame] | 118 | |
Douglas Gregor | dba9361 | 2012-01-01 21:47:52 +0000 | [diff] [blame] | 119 | @protocol P3 |
| 120 | - (void)p3_method; |
| 121 | @end |
| 122 | |
| 123 | id<P4> p4; |
| 124 | id<P3> p3; |
| 125 | |
Douglas Gregor | f63b0a5 | 2011-12-19 18:19:24 +0000 | [diff] [blame] | 126 | #ifdef __cplusplus |
| 127 | void testVector() { |
Douglas Gregor | fc529f7 | 2011-12-19 19:00:47 +0000 | [diff] [blame] | 128 | Vector<int> vec_int; |
| 129 | vec_int.push_back(0); |
Douglas Gregor | f63b0a5 | 2011-12-19 18:19:24 +0000 | [diff] [blame] | 130 | } |
| 131 | #endif |
Douglas Gregor | 0f75323 | 2011-12-22 01:48:48 +0000 | [diff] [blame] | 132 | |