Home | History | Annotate | Download | only in SemaObjCXX
      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