Home | History | Annotate | Download | only in SemaObjC
      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 }
    121