blob: 44d427c4c7551d6ee115b257267cdacf9ef3bba9 [file] [log] [blame]
Douglas Gregora1be2782011-12-17 23:38:30 +00001// RUN: rm -rf %t
Douglas Gregor674949f2012-01-03 17:31:38 +00002// 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 Gregor0f753232011-12-22 01:48:48 +00004@class C2;
5@class C3;
6@class C3;
Douglas Gregor5948ae12012-01-03 18:04:46 +00007@import redecl_merge_left;
Douglas Gregor0f753232011-12-22 01:48:48 +00008
Douglas Gregordba93612012-01-01 21:47:52 +00009@protocol P4;
Douglas Gregor0f753232011-12-22 01:48:48 +000010@class C3;
11@class C3;
Douglas Gregor5948ae12012-01-03 18:04:46 +000012@import redecl_merge_right;
Douglas Gregora1be2782011-12-17 23:38:30 +000013
14@implementation A
15- (Super*)init { return self; }
16@end
17
18void f(A *a) {
19 [a init];
20}
21
22@class A;
23
Douglas Gregoradafc2e2011-12-19 16:14:14 +000024B *f1() {
25 return [B create_a_B];
26}
27
Douglas Gregorecb19382011-12-19 15:27:36 +000028@class B;
29
Douglas Gregor27c6da22012-01-01 20:30:41 +000030void testProtoMerge(id<P1> p1, id<P2> p2) {
31 [p1 protoMethod1];
32 [p2 protoMethod2];
33}
34
Douglas Gregor1ca4a5c2012-01-03 22:46:00 +000035struct 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
Douglas Gregor7a537402012-01-03 23:26:26 +000058void 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 Gregor2ccd89c2011-12-20 18:11:52 +000067// 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.
70void 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 Gregor0f753232011-12-22 01:48:48 +000079// Test resolution of declarations from multiple modules with no
80// common original declaration.
81void test_C(C *c) {
82 c = get_a_C();
83 accept_a_C(c);
84}
85
86void test_C2(C2 *c2) {
87 c2 = get_a_C2();
88 accept_a_C2(c2);
89}
90
91void test_C3(C3 *c3) {
92 c3 = get_a_C3();
93 accept_a_C3(c3);
94}
95
Douglas Gregorcce54aa2011-12-22 19:44:59 +000096C4 *global_C4;
Douglas Gregor5948ae12012-01-03 18:04:46 +000097@import redecl_merge_left_left;
Douglas Gregorcce54aa2011-12-22 19:44:59 +000098
Douglas Gregorc3cfd2a2011-12-22 21:40:42 +000099void test_C4a(C4 *c4) {
Douglas Gregorcce54aa2011-12-22 19:44:59 +0000100 global_C4 = c4 = get_a_C4();
101 accept_a_C4(c4);
102}
103
Douglas Gregor5948ae12012-01-03 18:04:46 +0000104@import redecl_merge_bottom;
Douglas Gregora1be2782011-12-17 23:38:30 +0000105
Douglas Gregorc3cfd2a2011-12-22 21:40:42 +0000106void test_C4b() {
107 if (&refers_to_C4) {
108 }
109}
110
Douglas Gregorecb19382011-12-19 15:27:36 +0000111@implementation B
Douglas Gregoradafc2e2011-12-19 16:14:14 +0000112+ (B*)create_a_B { return 0; }
Douglas Gregorecb19382011-12-19 15:27:36 +0000113@end
114
Douglas Gregora1be2782011-12-17 23:38:30 +0000115void g(A *a) {
116 [a init];
117}
Douglas Gregorf63b0a52011-12-19 18:19:24 +0000118
Douglas Gregordba93612012-01-01 21:47:52 +0000119@protocol P3
120- (void)p3_method;
121@end
122
123id<P4> p4;
124id<P3> p3;
125
Douglas Gregorf63b0a52011-12-19 18:19:24 +0000126#ifdef __cplusplus
127void testVector() {
Douglas Gregorfc529f72011-12-19 19:00:47 +0000128 Vector<int> vec_int;
129 vec_int.push_back(0);
Douglas Gregorf63b0a52011-12-19 18:19:24 +0000130}
131#endif
Douglas Gregor0f753232011-12-22 01:48:48 +0000132