Clang Project

clang_source_code/test/Parser/DelayedTemplateParsing.cpp
1// RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify -std=c++11 %s
2
3template <class T>
4class A {
5   void foo() {
6       undeclared();
7   }
8   void foo2();
9};
10
11template <class T>
12class B {
13   void foo4() { } // expected-note {{previous definition is here}}
14   void foo4() { } // expected-error {{class member cannot be redeclared}}
15   void foo5() { } // expected-note {{previous definition is here}}
16
17   friend void foo3() {
18       undeclared();
19   }
20};
21
22
23template <class T>
24void B<T>::foo5() { // expected-error {{redefinition of 'foo5'}}
25}
26
27template <class T>
28void A<T>::foo2() {
29    undeclared();
30}
31
32
33template <class T>
34void foo3() {
35   undeclared();
36}
37
38template void A<int>::foo2();
39
40
41void undeclared()
42{
43
44}
45
46template <class T> void foo5() {} //expected-note {{previous definition is here}} 
47template <class T> void foo5() {} // expected-error {{redefinition of 'foo5'}}
48
49              
50
51namespace Inner_Outer_same_template_param_name {              
52
53template <class T>
54class Outmost {
55public:
56    template <class T>
57    class Inner {
58    public:
59        void f() {
60            T* var;
61        }
62   };
63};
64
65}
66
67
68namespace PR11931 {
69
70template <typename RunType>
71struct BindState;
72
73  template<>
74struct BindState<void(void*)> {
75  static void Run() { }
76};
77
78class Callback {
79public:
80  typedef void RunType();
81
82  template <typename RunType>
83  Callback(BindState<RunType> bind_state) {
84    BindState<RunType>::Run();
85  }
86};
87
88
89Callback Bind() {
90  return Callback(BindState<void(void*)>());
91}
92
93}
94
95namespace rdar11700604 {
96  template<typename T> void foo() = delete;
97
98  struct X {
99    X() = default;
100
101    template<typename T> void foo() = delete;
102  };
103}
104
105namespace PR17334 {
106
107template <typename = void> struct ArrayRef {
108  constexpr ArrayRef() {}
109};
110template <typename = void> void CreateConstInBoundsGEP2_32() {
111  ArrayRef<> IdxList;
112}
113void LLVMBuildStructGEP() { CreateConstInBoundsGEP2_32(); }
114
115}
116
117namespace PR17661 {
118template <typename T>
119constexpr T Fun(T A) { return T(0); }
120
121constexpr int Var = Fun(20);
122}
123
124template <typename T>
125auto invalidTrailingRetType() -> Bogus {} // expected-error {{unknown type name 'Bogus'}}
126
127namespace PR19613 {
128
129struct HeapTypeConfig {
130  static void from_bitset();
131};
132
133template <class Config>
134struct TypeImpl  {
135  struct BitsetType;
136
137  static void Any() {
138    BitsetType::New();
139  }
140};
141
142template<class Config>
143struct TypeImpl<Config>::BitsetType {
144  static void New() {
145    Config::from_bitset();
146  }
147};
148
149static void f() {
150  TypeImpl<HeapTypeConfig>::Any();
151}
152
153template<typename A> struct S {
154  template<typename B> struct T;
155};
156template<typename A> template<typename B> struct S<A>::T {
157  template<typename C, typename D> struct U;
158  template<typename C> struct U<C, C> {
159    template<typename E> static int f() {
160      return sizeof(A) + sizeof(B) + sizeof(C) + sizeof(E);
161    }
162  };
163};
164
165static void g() {
166  S<int>::T<int>::U<int,int>::f<int>();
167}
168
169template<typename T> struct SS {
170  template<typename U> struct X;
171  template<typename U> struct X<U*>;
172};
173template<typename T> template<typename U> struct SS<T>::X<U*> {
174  static int f() {
175    return sizeof(T) + sizeof(U);
176  }
177};
178
179static void h() {
180  SS<int>::X<int*>::f();
181}
182
183}
184
185struct PR38460 {
186  template <typename>
187  struct T {
188    static void foo() {
189      struct U {
190        void dummy() {
191          use_delayed_identifier();
192        }
193      };
194    }
195  };
196};
197void use_delayed_identifier();
198void trigger_PR38460() {
199  PR38460::T<int>::foo();
200}
201
202template <typename> struct PR38460_2 {
203  struct p {
204    struct G {
205      bool operator()(int) {}
206    };
207  };
208  static void as() {
209    typename p::G g;
210    g(0);
211  }
212};
213template struct PR38460_2<int>;
214