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