• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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