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