diff options
Diffstat (limited to 'test/SemaObjCXX/unknown-anytype.mm')
-rw-r--r-- | test/SemaObjCXX/unknown-anytype.mm | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/test/SemaObjCXX/unknown-anytype.mm b/test/SemaObjCXX/unknown-anytype.mm index b28b135..e89dee1 100644 --- a/test/SemaObjCXX/unknown-anytype.mm +++ b/test/SemaObjCXX/unknown-anytype.mm @@ -7,3 +7,48 @@ namespace test0 { [x foo]; // expected-error {{no known method '-foo'; cast the message send to the method's return type}} } } + +// rdar://problem/12565338 +@interface Test1 +- (void) test_a: (__unknown_anytype)foo; +- (void) test_b: (__unknown_anytype)foo; +- (void) test_c: (__unknown_anytype)foo; +@end +namespace test1 { + struct POD { + int x; + }; + + void a(Test1 *obj) { + POD v; + [obj test_a: v]; + } + + struct Uncopyable { + Uncopyable(); + private: + Uncopyable(const Uncopyable &); // expected-note {{declared private here}} + }; + + void b(Test1 *obj) { + Uncopyable v; + [obj test_b: v]; // expected-error {{calling a private constructor}} + } + + void c(Test1 *obj) { + Uncopyable v; + [obj test_c: (const Uncopyable&) v]; + } +} + +// Just test that we can declare a function taking __unknown_anytype. +// For now, we don't actually need to make calling something like this +// work; if that changes, here's what's required: +// - get this call through overload resolution somehow, +// - update the function-call argument-passing code like the +// message-send code, and +// - rewrite the function expression to have a type that doesn't +// involving __unknown_anytype. +namespace test2 { + void foo(__unknown_anytype x); +} |