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