| 1 | // RUN: %clang_cc1 -fdebugger-support -funknown-anytype -fsyntax-only -verify %s |
| 2 | |
| 3 | // rdar://problem/9416370 |
| 4 | namespace test0 { |
| 5 | void test(id x) { |
| 6 | if ([x foo]) {} // expected-error {{no known method '-foo'; cast the message send to the method's return type}} |
| 7 | [x foo]; // expected-error {{no known method '-foo'; cast the message send to the method's return type}} |
| 8 | } |
| 9 | } |
| 10 | |
| 11 | // rdar://problem/12565338 |
| 12 | @interface Test1 |
| 13 | - (void) test_a: (__unknown_anytype)foo; |
| 14 | - (void) test_b: (__unknown_anytype)foo; |
| 15 | - (void) test_c: (__unknown_anytype)foo; |
| 16 | @end |
| 17 | namespace test1 { |
| 18 | struct POD { |
| 19 | int x; |
| 20 | }; |
| 21 | |
| 22 | void a(Test1 *obj) { |
| 23 | POD v; |
| 24 | [obj test_a: v]; |
| 25 | } |
| 26 | |
| 27 | struct Uncopyable { |
| 28 | Uncopyable(); |
| 29 | private: |
| 30 | Uncopyable(const Uncopyable &); // expected-note {{declared private here}} |
| 31 | }; |
| 32 | |
| 33 | void b(Test1 *obj) { |
| 34 | Uncopyable v; |
| 35 | [obj test_b: v]; // expected-error {{calling a private constructor}} |
| 36 | } |
| 37 | |
| 38 | void c(Test1 *obj) { |
| 39 | Uncopyable v; |
| 40 | [obj test_c: (const Uncopyable&) v]; |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | // Just test that we can declare a function taking __unknown_anytype. |
| 45 | // For now, we don't actually need to make calling something like this |
| 46 | // work; if that changes, here's what's required: |
| 47 | // - get this call through overload resolution somehow, |
| 48 | // - update the function-call argument-passing code like the |
| 49 | // message-send code, and |
| 50 | // - rewrite the function expression to have a type that doesn't |
| 51 | // involving __unknown_anytype. |
| 52 | namespace test2 { |
| 53 | void foo(__unknown_anytype x); |
| 54 | } |
| 55 | |