2011-10-14 06:29:44 +08:00
|
|
|
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -fobjc-arc -verify -fblocks -fobjc-exceptions %s
|
2011-06-16 07:02:42 +08:00
|
|
|
|
|
|
|
// "Move" semantics, trivial version.
|
|
|
|
void move_it(__strong id &&from) {
|
|
|
|
id to = static_cast<__strong id&&>(from);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Deduction with 'auto'.
|
|
|
|
@interface A
|
|
|
|
+ alloc;
|
|
|
|
- init;
|
|
|
|
@end
|
|
|
|
|
2012-08-07 14:14:34 +08:00
|
|
|
// <rdar://problem/12031870>: don't warn about this
|
|
|
|
extern "C" A* MakeA();
|
|
|
|
|
2011-06-16 07:02:42 +08:00
|
|
|
// Ensure that deduction works with lifetime qualifiers.
|
|
|
|
void deduction(id obj) {
|
|
|
|
auto a = [[A alloc] init];
|
|
|
|
__strong A** aPtr = &a;
|
|
|
|
|
|
|
|
auto a2([[A alloc] init]);
|
|
|
|
__strong A** aPtr2 = &a2;
|
|
|
|
|
|
|
|
__strong id *idp = new auto(obj);
|
|
|
|
|
|
|
|
__strong id array[17];
|
2012-06-09 06:46:07 +08:00
|
|
|
for (auto x : array) { // expected-warning{{'auto' deduced as 'id' in declaration of 'x'}}
|
2011-06-16 07:02:42 +08:00
|
|
|
__strong id *xPtr = &x;
|
|
|
|
}
|
2011-07-02 06:22:40 +08:00
|
|
|
|
|
|
|
@try {
|
|
|
|
} @catch (auto e) { // expected-error {{'auto' not allowed in exception declaration}}
|
|
|
|
}
|
2011-06-16 07:02:42 +08:00
|
|
|
}
|
2012-03-30 13:23:48 +08:00
|
|
|
|
|
|
|
// rdar://problem/11068137
|
|
|
|
void test1a() {
|
|
|
|
__autoreleasing id p; // expected-note 2 {{'p' declared here}}
|
|
|
|
(void) [&p] {};
|
|
|
|
(void) [p] {}; // expected-error {{cannot capture __autoreleasing variable in a lambda by copy}}
|
|
|
|
(void) [=] { (void) p; }; // expected-error {{cannot capture __autoreleasing variable in a lambda by copy}}
|
|
|
|
}
|
|
|
|
void test1b() {
|
|
|
|
__autoreleasing id v;
|
|
|
|
__autoreleasing id &p = v; // expected-note 2 {{'p' declared here}}
|
|
|
|
(void) [&p] {};
|
|
|
|
(void) [p] {}; // expected-error {{cannot capture __autoreleasing variable in a lambda by copy}}
|
|
|
|
(void) [=] { (void) p; }; // expected-error {{cannot capture __autoreleasing variable in a lambda by copy}}
|
|
|
|
}
|
|
|
|
void test1c() {
|
|
|
|
__autoreleasing id v; // expected-note {{'v' declared here}}
|
|
|
|
__autoreleasing id &p = v;
|
|
|
|
(void) ^{ (void) p; };
|
|
|
|
(void) ^{ (void) v; }; // expected-error {{cannot capture __autoreleasing variable in a block}}
|
|
|
|
}
|
2012-06-09 06:46:07 +08:00
|
|
|
|
|
|
|
|
|
|
|
// <rdar://problem/11319689>
|
|
|
|
// warn when initializing an 'auto' variable with an 'id' initializer expression
|
|
|
|
|
|
|
|
void testAutoId(id obj) {
|
|
|
|
auto x = obj; // expected-warning{{'auto' deduced as 'id' in declaration of 'x'}}
|
|
|
|
}
|
|
|
|
|
2012-06-16 02:19:43 +08:00
|
|
|
@interface Array
|
|
|
|
+ (instancetype)new;
|
|
|
|
- (id)objectAtIndex:(int)index;
|
|
|
|
@end
|
|
|
|
|
2012-06-09 06:46:07 +08:00
|
|
|
// ...but don't warn if it's coming from a template parameter.
|
2012-06-16 02:19:43 +08:00
|
|
|
template<typename T, int N>
|
|
|
|
void autoTemplateFunction(T param, id obj, Array *arr) {
|
2012-06-09 06:46:07 +08:00
|
|
|
auto x = param; // no-warning
|
|
|
|
auto y = obj; // expected-warning{{'auto' deduced as 'id' in declaration of 'y'}}
|
2012-06-16 02:19:43 +08:00
|
|
|
auto z = [arr objectAtIndex:N]; // expected-warning{{'auto' deduced as 'id' in declaration of 'z'}}
|
2012-06-09 06:46:07 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void testAutoIdTemplate(id obj) {
|
2012-06-16 02:19:43 +08:00
|
|
|
autoTemplateFunction<id, 2>(obj, obj, [Array new]); // no-warning
|
2012-06-09 06:46:07 +08:00
|
|
|
}
|
|
|
|
|
2012-09-06 03:51:20 +08:00
|
|
|
// rdar://12229679
|
|
|
|
@interface NSObject @end
|
|
|
|
typedef __builtin_va_list va_list;
|
|
|
|
@interface MyClass : NSObject
|
|
|
|
@end
|
|
|
|
|
|
|
|
@implementation MyClass
|
|
|
|
+ (void)fooMethod:(id)firstArg, ... {
|
|
|
|
va_list args;
|
2012-06-09 06:46:07 +08:00
|
|
|
|
2012-09-06 03:51:20 +08:00
|
|
|
__builtin_va_arg(args, id);
|
|
|
|
}
|
|
|
|
@end
|
2013-01-18 07:59:28 +08:00
|
|
|
|
|
|
|
namespace rdar12078752 {
|
|
|
|
void f() {
|
|
|
|
NSObject* o =0;
|
|
|
|
__autoreleasing decltype(o) o2 = o;
|
|
|
|
__autoreleasing auto o3 = o;
|
|
|
|
}
|
|
|
|
}
|