Home | History | Annotate | Download | only in SemaCXX
      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