blob: dfbc25fe9e7bfbb6f47c7b5cfb71eb0760b10ea3 [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 Gregor2ccd89c2011-12-20 18:11:52 +000035// Test redeclarations of entities in explicit submodules, to make
36// sure we're maintaining the declaration chains even when normal name
37// lookup can't see what we're looking for.
38void testExplicit() {
39 Explicit *e;
40 int *(*fp)(void) = &explicit_func;
41 int *ip = explicit_func();
42
43 // FIXME: Should complain about definition not having been imported.
44 struct explicit_struct es = { 0 };
45}
46
Douglas Gregor0f753232011-12-22 01:48:48 +000047// Test resolution of declarations from multiple modules with no
48// common original declaration.
49void test_C(C *c) {
50 c = get_a_C();
51 accept_a_C(c);
52}
53
54void test_C2(C2 *c2) {
55 c2 = get_a_C2();
56 accept_a_C2(c2);
57}
58
59void test_C3(C3 *c3) {
60 c3 = get_a_C3();
61 accept_a_C3(c3);
62}
63
Douglas Gregorcce54aa2011-12-22 19:44:59 +000064C4 *global_C4;
Douglas Gregor5948ae12012-01-03 18:04:46 +000065@import redecl_merge_left_left;
Douglas Gregorcce54aa2011-12-22 19:44:59 +000066
Douglas Gregorc3cfd2a2011-12-22 21:40:42 +000067void test_C4a(C4 *c4) {
Douglas Gregorcce54aa2011-12-22 19:44:59 +000068 global_C4 = c4 = get_a_C4();
69 accept_a_C4(c4);
70}
71
Douglas Gregor5948ae12012-01-03 18:04:46 +000072@import redecl_merge_bottom;
Douglas Gregora1be2782011-12-17 23:38:30 +000073
Douglas Gregorc3cfd2a2011-12-22 21:40:42 +000074void test_C4b() {
75 if (&refers_to_C4) {
76 }
77}
78
Douglas Gregorecb19382011-12-19 15:27:36 +000079@implementation B
Douglas Gregoradafc2e2011-12-19 16:14:14 +000080+ (B*)create_a_B { return 0; }
Douglas Gregorecb19382011-12-19 15:27:36 +000081@end
82
Douglas Gregora1be2782011-12-17 23:38:30 +000083void g(A *a) {
84 [a init];
85}
Douglas Gregorf63b0a52011-12-19 18:19:24 +000086
Douglas Gregordba93612012-01-01 21:47:52 +000087@protocol P3
88- (void)p3_method;
89@end
90
91id<P4> p4;
92id<P3> p3;
93
Douglas Gregorf63b0a52011-12-19 18:19:24 +000094#ifdef __cplusplus
95void testVector() {
Douglas Gregorfc529f72011-12-19 19:00:47 +000096 Vector<int> vec_int;
97 vec_int.push_back(0);
Douglas Gregorf63b0a52011-12-19 18:19:24 +000098}
99#endif
Douglas Gregor0f753232011-12-22 01:48:48 +0000100