blob: 6ea245c2d4e4260a44c7bd3fd20fc417bddebbae [file] [log] [blame]
Douglas Gregor1edf5762012-06-28 21:43:01 +00001// RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify -std=c++11 %s
Chandler Carruth03b77b32011-04-25 06:34:35 +00002
3template <class T>
4class A {
5 void foo() {
6 undeclared();
7 }
Francois Pichet81345182011-09-22 22:14:56 +00008 void foo2();
Chandler Carruth03b77b32011-04-25 06:34:35 +00009};
10
11template <class T>
12class B {
Nico Weber71e377d2015-01-17 02:33:17 +000013 void foo4() { } // expected-note {{previous definition is here}}
14 void foo4() { } // expected-error {{class member cannot be redeclared}}
David Majnemerea5092a2013-07-07 23:49:50 +000015 void foo5() { } // expected-note {{previous definition is here}}
Francois Pichet6dc4c162011-11-18 23:47:17 +000016
17 friend void foo3() {
18 undeclared();
19 }
Chandler Carruth03b77b32011-04-25 06:34:35 +000020};
21
22
23template <class T>
David Majnemerea5092a2013-07-07 23:49:50 +000024void B<T>::foo5() { // expected-error {{redefinition of 'foo5'}}
Chandler Carruth03b77b32011-04-25 06:34:35 +000025}
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'}}
Francois Pichet81345182011-09-22 22:14:56 +000048
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
Francois Pichete6664762012-02-22 08:25:53 +000067
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}
Douglas Gregor1edf5762012-06-28 21:43:01 +000094
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
David Majnemerc185aa72013-09-27 04:14:12 +0000105namespace 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
David Majnemerc85ed7e2013-10-23 21:31:20 +0000117namespace PR17661 {
118template <typename T>
119constexpr T Fun(T A) { return T(0); }
120
121constexpr int Var = Fun(20);
122}
123
Richard Smith8e6002f2014-03-12 23:14:33 +0000124template <typename T>
125auto invalidTrailingRetType() -> Bogus {} // expected-error {{unknown type name 'Bogus'}}
Hans Wennborgb6d4e8c2014-05-02 02:01:07 +0000126
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}