xref: /aosp_15_r20/external/clang/test/SemaObjCXX/arc-0x.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
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