1 | // RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-fragile-10.5 -verify -Wno-objc-root-class %s |
2 | // RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-fragile-10.5 -verify -Wno-objc-root-class -std=c++98 %s |
3 | // RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-fragile-10.5 -verify -Wno-objc-root-class -std=c++11 %s |
4 | |
5 | @interface I1 |
6 | - (int*)method; |
7 | @end |
8 | |
9 | @implementation I1 |
10 | - (int*)method { |
11 | struct x { }; |
12 | [x method]; // expected-error{{receiver type 'x' is not an Objective-C class}} |
13 | return 0; |
14 | } |
15 | @end |
16 | |
17 | typedef struct { int x; } ivar; |
18 | |
19 | @interface I2 { |
20 | id ivar; |
21 | } |
22 | - (int*)method; |
23 | + (void)method; |
24 | @end |
25 | |
26 | struct I2_holder { |
27 | I2_holder(); |
28 | |
29 | I2 *get(); |
30 | }; |
31 | |
32 | I2 *operator+(I2_holder, int); |
33 | |
34 | @implementation I2 |
35 | - (int*)method { |
36 | [ivar method]; |
37 | |
38 | // Test instance messages that start with a simple-type-specifier. |
39 | [I2_holder().get() method]; |
40 | [I2_holder().get() + 17 method]; |
41 | return 0; |
42 | } |
43 | + (void)method { |
44 | [ivar method]; // expected-error{{receiver type 'ivar' is not an Objective-C class}} |
45 | } |
46 | @end |
47 | |
48 | // Class message sends |
49 | @interface I3 |
50 | + (int*)method; |
51 | @end |
52 | |
53 | @interface I4 : I3 |
54 | + (int*)otherMethod; |
55 | @end |
56 | |
57 | template<typename T> |
58 | struct identity { |
59 | typedef T type; |
60 | }; |
61 | |
62 | @implementation I4 |
63 | + (int *)otherMethod { |
64 | // Test class messages that use non-trivial simple-type-specifiers |
65 | // or typename-specifiers. |
66 | if (false) { |
67 | if (true) |
68 | return [typename identity<I3>::type method]; |
69 | #if __cplusplus <= 199711L |
70 | // expected-warning@-2 {{'typename' occurs outside of a template}} |
71 | #endif |
72 | |
73 | return [::I3 method]; |
74 | } |
75 | |
76 | int* ip1 = {[super method]}; |
77 | int* ip2 = {[::I3 method]}; |
78 | int* ip3 = {[typename identity<I3>::type method]}; |
79 | #if __cplusplus <= 199711L |
80 | // expected-warning@-2 {{'typename' occurs outside of a template}} |
81 | #endif |
82 | |
83 | int* ip4 = {[typename identity<I2_holder>::type().get() method]}; |
84 | #if __cplusplus <= 199711L |
85 | // expected-warning@-2 {{'typename' occurs outside of a template}} |
86 | #endif |
87 | int array[5] = {[3] = 2}; |
88 | return [super method]; |
89 | } |
90 | @end |
91 | |
92 | struct String { |
93 | String(const char *); |
94 | }; |
95 | |
96 | struct MutableString : public String { }; |
97 | |
98 | // C++-specific parameter types |
99 | @interface I5 |
100 | - method:(const String&)str1 |
101 | other:(String&)str2; // expected-note{{passing argument to parameter 'str2' here}} |
102 | @end |
103 | |
104 | void test_I5(I5 *i5, String s) { |
105 | [i5 method:"hello" other:s]; |
106 | [i5 method:s other:"world"]; // expected-error{{non-const lvalue reference to type 'String' cannot bind to a value of unrelated type 'const char [6]'}} |
107 | } |
108 | |
109 | // <rdar://problem/8483253> |
110 | @interface A |
111 | |
112 | struct X { }; |
113 | |
114 | + (A *)create:(void (*)(void *x, X r, void *data))callback |
115 | callbackData:(void *)callback_data; |
116 | |
117 | @end |
118 | |
119 | |
120 | void foo(void) |
121 | { |
122 | void *fun; |
123 | void *ptr; |
124 | X r; |
125 | A *im = [A create:(void (*)(void *cgl_ctx, X r, void *data)) fun |
126 | callbackData:ptr]; |
127 | } |
128 | |
129 | // <rdar://problem/8807070> |
130 | template<typename T> struct X1; // expected-note{{template is declared here}} |
131 | |
132 | @interface B |
133 | + (X1<int>)blah; |
134 | + (X1<float>&)blarg; |
135 | @end |
136 | |
137 | void f() { |
138 | [B blah]; // expected-error{{implicit instantiation of undefined template 'X1<int>'}} |
139 | [B blarg]; |
140 | } |
141 | |