Clang Project

clang_source_code/test/SemaCXX/unknown-anytype.cpp
1// RUN: %clang_cc1 -funknown-anytype -fsyntax-only -verify %s
2
3namespace test0 {
4  extern __unknown_anytype test0;
5  extern __unknown_anytype test1();
6  extern __unknown_anytype test2(int);
7}
8
9namespace 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
23namespace test2 {
24  extern __unknown_anytype foo();
25  void test() {
26    foo(); // expected-error {{'foo' has unknown return type}}
27  }
28}
29
30namespace 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
39namespace 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
50namespace 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
60namespace 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