1 | // RUN: %clang_cc1 -funknown-anytype -fsyntax-only -verify %s |
2 | |
3 | namespace test0 { |
4 | extern __unknown_anytype test0; |
5 | extern __unknown_anytype test1(); |
6 | extern __unknown_anytype test2(int); |
7 | } |
8 | |
9 | namespace test1 { |
10 | extern __unknown_anytype foo; |
11 | int test() { |
12 | // TODO: it would be great if the 'cannot initialize' errors |
13 | // turned into something more interesting. It's just a matter of |
14 | // making sure that these locations check for placeholder types |
15 | // properly. |
16 | |
17 | int x = foo; // expected-error {{'foo' has unknown type}} |
18 | int y = 0 + foo; // expected-error {{'foo' has unknown type}} |
19 | return foo; // expected-error {{'foo' has unknown type}} |
20 | } |
21 | } |
22 | |
23 | namespace test2 { |
24 | extern __unknown_anytype foo(); |
25 | void test() { |
26 | foo(); // expected-error {{'foo' has unknown return type}} |
27 | } |
28 | } |
29 | |
30 | namespace test3 { |
31 | extern __unknown_anytype foo; |
32 | void test() { |
33 | foo(); // expected-error {{call to unsupported expression with unknown type}} |
34 | ((void(void)) foo)(); // expected-error {{variable 'foo' with unknown type cannot be given a function type}} |
35 | } |
36 | } |
37 | |
38 | // rdar://problem/9899447 |
39 | namespace test4 { |
40 | extern __unknown_anytype test0(...); |
41 | extern __unknown_anytype test1(...); |
42 | |
43 | void test() { |
44 | void (*fn)(int) = (void(*)(int)) test0; |
45 | int x = (int) test1; // expected-error {{function 'test1' with unknown type must be given a function type}} |
46 | } |
47 | } |
48 | |
49 | // rdar://problem/23959960 |
50 | namespace test5 { |
51 | template<typename T> struct X; // expected-note{{template is declared here}} |
52 | |
53 | extern __unknown_anytype test0(...); |
54 | |
55 | void test() { |
56 | (X<int>)test0(); // expected-error{{implicit instantiation of undefined template 'test5::X<int>'}} |
57 | } |
58 | } |
59 | |
60 | namespace test6 { |
61 | extern __unknown_anytype func(); |
62 | extern __unknown_anytype var; |
63 | double *d; |
64 | |
65 | void test() { |
66 | d = (double*)&func(); // expected-error{{address-of operator cannot be applied to a call to a function with unknown return type}} |
67 | d = (double*)&var; |
68 | } |
69 | |
70 | } |
71 | |