Home | History | Annotate | Download | only in SemaObjCXX
      1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -fobjc-arc -verify -fblocks -fobjc-exceptions %s
      2 
      3 // "Move" semantics, trivial version.
      4 void move_it(__strong id &&from) {
      5   id to = static_cast<__strong id&&>(from);
      6 }
      7 
      8 // Deduction with 'auto'.
      9 @interface A
     10 + alloc;
     11 - init;
     12 @end
     13 
     14 // <rdar://problem/12031870>: don't warn about this
     15 extern "C" A* MakeA();
     16 
     17 // Ensure that deduction works with lifetime qualifiers.
     18 void deduction(id obj) {
     19   auto a = [[A alloc] init];
     20   __strong A** aPtr = &a;
     21 
     22   auto a2([[A alloc] init]);
     23   __strong A** aPtr2 = &a2;
     24 
     25   __strong id *idp = new auto(obj);
     26 
     27   __strong id array[17];
     28   for (auto x : array) { // expected-warning{{'auto' deduced as 'id' in declaration of 'x'}}
     29     __strong id *xPtr = &x;
     30   }
     31 
     32   @try {
     33   } @catch (auto e) { // expected-error {{'auto' not allowed in exception declaration}}
     34   }
     35 }
     36 
     37 // rdar://problem/11068137
     38 void test1a() {
     39   __autoreleasing id p; // expected-note 2 {{'p' declared here}}
     40   (void) [&p] {};
     41   (void) [p] {}; // expected-error {{cannot capture __autoreleasing variable in a lambda by copy}}
     42   (void) [=] { (void) p; }; // expected-error {{cannot capture __autoreleasing variable in a lambda by copy}}
     43 }
     44 void test1b() {
     45   __autoreleasing id v;
     46   __autoreleasing id &p = v; // expected-note 2 {{'p' declared here}}
     47   (void) [&p] {};
     48   (void) [p] {}; // expected-error {{cannot capture __autoreleasing variable in a lambda by copy}}
     49   (void) [=] { (void) p; }; // expected-error {{cannot capture __autoreleasing variable in a lambda by copy}}
     50 }
     51 void test1c() {
     52   __autoreleasing id v; // expected-note {{'v' declared here}}
     53   __autoreleasing id &p = v;
     54   (void) ^{ (void) p; };
     55   (void) ^{ (void) v; }; // expected-error {{cannot capture __autoreleasing variable in a block}}
     56 }
     57 
     58 
     59 // <rdar://problem/11319689>
     60 // warn when initializing an 'auto' variable with an 'id' initializer expression
     61 
     62 void testAutoId(id obj) {
     63   auto x = obj; // expected-warning{{'auto' deduced as 'id' in declaration of 'x'}}
     64 }
     65 
     66 @interface Array
     67 + (instancetype)new;
     68 - (id)objectAtIndex:(int)index;
     69 @end
     70 
     71 // ...but don't warn if it's coming from a template parameter.
     72 template<typename T, int N>
     73 void autoTemplateFunction(T param, id obj, Array *arr) {
     74   auto x = param; // no-warning
     75   auto y = obj; // expected-warning{{'auto' deduced as 'id' in declaration of 'y'}}
     76   auto z = [arr objectAtIndex:N]; // expected-warning{{'auto' deduced as 'id' in declaration of 'z'}}
     77 }
     78 
     79 void testAutoIdTemplate(id obj) {
     80   autoTemplateFunction<id, 2>(obj, obj, [Array new]); // no-warning
     81 }
     82 
     83 // rdar://12229679
     84 @interface NSObject @end
     85 typedef __builtin_va_list va_list;
     86 @interface MyClass : NSObject
     87 @end
     88 
     89 @implementation MyClass
     90 + (void)fooMethod:(id)firstArg, ... {
     91     va_list args;
     92 
     93     __builtin_va_arg(args, id);
     94 }
     95 @end
     96 
     97 namespace rdar12078752 {
     98   void f() {
     99     NSObject* o =0;
    100     __autoreleasing decltype(o) o2 = o;
    101     __autoreleasing auto o3 = o;
    102   }
    103 }
    104