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;
test()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();
test()25   void test() {
26     foo(); // expected-error {{'foo' has unknown return type}}
27   }
28 }
29 
30 namespace test3 {
31   extern __unknown_anytype foo;
test()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 
test()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 
test()55   void test() {
56     (X<int>)test0(); // expected-error{{implicit instantiation of undefined template 'test5::X<int>'}}
57   }
58 }
59