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