]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/SemaObjC/message.m
Vendor import of clang release_34 branch r197841 (effectively, 3.4 RC3):
[FreeBSD/FreeBSD.git] / test / SemaObjC / message.m
1 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
2
3 typedef struct objc_object {
4   Class isa;
5 } *id;
6
7
8 @interface foo
9 - (void)meth;
10 @end
11
12 @implementation foo
13 - (void) contents {}                    // No declaration in @interface!
14 - (void) meth { [self contents]; } 
15 @end
16
17 typedef struct _NSPoint {
18     float x;
19     float y;
20 } NSPoint;
21
22 typedef struct _NSSize {
23     float width; 
24     float height;
25 } NSSize;
26
27 typedef struct _NSRect {
28     NSPoint origin;
29     NSSize size;
30 } NSRect;
31
32 @interface AnyClass
33 - (NSRect)rect;
34 @end
35
36 @class Helicopter;
37
38 static void func(Helicopter *obj) {
39   // Note that the proto for "rect" is found in the global pool even when
40   // a statically typed object's class interface isn't in scope! This 
41   // behavior isn't very desirable, however wee need it for GCC compatibility.
42   NSRect r = [obj rect];
43 }
44
45 @interface NSObject @end
46
47 extern Class NSClassFromObject(id object);
48
49 @interface XX : NSObject 
50 @end
51
52 @implementation XX
53
54 + _privateMethod {
55   return self;
56 }
57
58 - (void) xx {
59   [NSClassFromObject(self) _privateMethod];
60 }
61 @end
62
63 @implementation XX (Private)
64 - (void) yy {
65   [NSClassFromObject(self) _privateMethod];
66 }
67 @end
68
69 @interface I0
70 -(void) nonVararg: (int) x;
71 @end
72
73 int f0(I0 *ob) {
74   [ ob nonVararg: 0, 1, 2]; // expected-error {{too many arguments to method call}}
75 }
76
77 int f2() {
78     const id foo;
79     [foo bar];  // expected-warning {{method '-bar' not found (return type defaults to 'id')}}
80     return 0;
81 }
82
83
84 // PR3766
85 struct S { int X; } S;
86
87 int test5(int X) {
88   int a = [X somemsg];  // expected-warning {{receiver type 'int' is not 'id'}} \
89                            expected-warning {{method '-somemsg' not found}} \
90                            expected-warning {{incompatible pointer to integer conversion initializing 'int' with an expression of type 'id'}}
91   int b = [S somemsg];  // expected-error {{bad receiver type 'struct S'}}
92 }
93
94 // PR4021
95 void foo4() {
96   struct objc_object X[10];
97   
98   [X rect]; // expected-warning {{receiver type 'struct objc_object *' is not 'id' or interface pointer, consider casting it to 'id'}}
99 }
100
101 // rdar://13207886
102 void foo5(id p) {
103   p
104   [(id)(p) bar]; // expected-error {{missing '['}} \
105                  // expected-error {{expected ']'}} \
106                  // expected-note {{to match this '['}} \
107                  // expected-warning {{instance method '-bar' not found}}
108 }
109
110 @interface I1 // expected-note {{receiver is instance of class declared here}}
111 -(void)unavail_meth  __attribute__((unavailable)); // expected-note {{marked unavailable here}}
112 @end
113
114 // rdar://13620447
115 void foo6(I1 *p) {
116   [p
117     bar]; // expected-warning {{instance method '-bar' not found}}
118   [p
119     unavail_meth]; // expected-error {{unavailable}}
120 }