annotate clang/test/SemaTemplate/default-arguments.cpp @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents c4bab56944e8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // RUN: %clang_cc1 -fsyntax-only -verify %s
anatofuz
parents:
diff changeset
2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
anatofuz
parents:
diff changeset
3 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
anatofuz
parents:
diff changeset
4 template<typename T, int N = 2> struct X; // expected-note{{template is declared here}}
anatofuz
parents:
diff changeset
5
anatofuz
parents:
diff changeset
6 X<int, 1> *x1;
anatofuz
parents:
diff changeset
7 X<int> *x2;
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 X<> *x3; // expected-error{{too few template arguments for class template 'X'}}
anatofuz
parents:
diff changeset
10
anatofuz
parents:
diff changeset
11 template<typename U = float, int M> struct X;
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 X<> *x4;
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 template<typename T = int> struct Z { };
anatofuz
parents:
diff changeset
16 template struct Z<>;
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 // PR4362
anatofuz
parents:
diff changeset
19 template<class T> struct a { };
anatofuz
parents:
diff changeset
20 template<> struct a<int> { static const bool v = true; };
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 template<class T, bool = a<T>::v> struct p { }; // expected-error {{no member named 'v'}}
anatofuz
parents:
diff changeset
23
anatofuz
parents:
diff changeset
24 template struct p<bool>; // expected-note {{in instantiation of default argument for 'p<bool>' required here}}
anatofuz
parents:
diff changeset
25 template struct p<int>;
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 // PR5187
anatofuz
parents:
diff changeset
28 template<typename T, typename U>
anatofuz
parents:
diff changeset
29 struct A;
anatofuz
parents:
diff changeset
30
anatofuz
parents:
diff changeset
31 template<typename T, typename U = T>
anatofuz
parents:
diff changeset
32 struct A;
anatofuz
parents:
diff changeset
33
anatofuz
parents:
diff changeset
34 template<typename T, typename U>
anatofuz
parents:
diff changeset
35 struct A {
anatofuz
parents:
diff changeset
36 void f(A<T>);
anatofuz
parents:
diff changeset
37 };
anatofuz
parents:
diff changeset
38
anatofuz
parents:
diff changeset
39 template<typename T>
anatofuz
parents:
diff changeset
40 struct B { };
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 template<>
anatofuz
parents:
diff changeset
43 struct B<void> {
anatofuz
parents:
diff changeset
44 typedef B<void*> type;
anatofuz
parents:
diff changeset
45 };
anatofuz
parents:
diff changeset
46
anatofuz
parents:
diff changeset
47 // Nested default arguments for template parameters.
anatofuz
parents:
diff changeset
48 template<typename T> struct X1 { };
anatofuz
parents:
diff changeset
49
anatofuz
parents:
diff changeset
50 template<typename T>
anatofuz
parents:
diff changeset
51 struct X2 {
anatofuz
parents:
diff changeset
52 template<typename U = typename X1<T>::type> // expected-error{{no type named 'type' in 'X1<int>'}} \
anatofuz
parents:
diff changeset
53 // expected-error{{no type named 'type' in 'X1<char>'}}
anatofuz
parents:
diff changeset
54 struct Inner1 { }; // expected-note{{template is declared here}}
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 template<T Value = X1<T>::value> // expected-error{{no member named 'value' in 'X1<int>'}} \
anatofuz
parents:
diff changeset
57 // expected-error{{no member named 'value' in 'X1<char>'}}
anatofuz
parents:
diff changeset
58 struct NonType1 { }; // expected-note{{template is declared here}}
anatofuz
parents:
diff changeset
59
anatofuz
parents:
diff changeset
60 template<T Value>
anatofuz
parents:
diff changeset
61 struct Inner2 { };
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 template<typename U>
anatofuz
parents:
diff changeset
64 struct Inner3 {
anatofuz
parents:
diff changeset
65 template<typename X = T, typename V = U>
anatofuz
parents:
diff changeset
66 struct VeryInner { };
anatofuz
parents:
diff changeset
67
anatofuz
parents:
diff changeset
68 template<T Value1 = sizeof(T), T Value2 = sizeof(U),
anatofuz
parents:
diff changeset
69 T Value3 = Value1 + Value2>
anatofuz
parents:
diff changeset
70 struct NonType2 { };
anatofuz
parents:
diff changeset
71 };
anatofuz
parents:
diff changeset
72 };
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74 X2<int> x2i; // expected-note{{in instantiation of template class 'X2<int>' requested here}}
anatofuz
parents:
diff changeset
75 X2<int>::Inner1<float> x2iif;
anatofuz
parents:
diff changeset
76
anatofuz
parents:
diff changeset
77 X2<int>::Inner1<> x2bad; // expected-error{{too few template arguments for class template 'Inner1'}}
anatofuz
parents:
diff changeset
78
anatofuz
parents:
diff changeset
79 X2<int>::NonType1<'a'> x2_nontype1;
anatofuz
parents:
diff changeset
80 X2<int>::NonType1<> x2_nontype1_bad; // expected-error{{too few template arguments for class template 'NonType1'}}
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 // Check multi-level substitution into template type arguments
anatofuz
parents:
diff changeset
83 X2<int>::Inner3<float>::VeryInner<> vi;
anatofuz
parents:
diff changeset
84 X2<char>::Inner3<int>::NonType2<> x2_deep_nontype; // expected-note{{in instantiation of template class 'X2<char>' requested here}}
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86 template<typename T, typename U>
anatofuz
parents:
diff changeset
87 struct is_same { static const bool value = false; };
anatofuz
parents:
diff changeset
88
anatofuz
parents:
diff changeset
89 template<typename T>
anatofuz
parents:
diff changeset
90 struct is_same<T, T> { static const bool value = true; };
anatofuz
parents:
diff changeset
91
anatofuz
parents:
diff changeset
92 int array1[is_same<__typeof__(vi),
anatofuz
parents:
diff changeset
93 X2<int>::Inner3<float>::VeryInner<int, float> >::value? 1 : -1];
anatofuz
parents:
diff changeset
94
anatofuz
parents:
diff changeset
95 int array2[is_same<__typeof(x2_deep_nontype),
anatofuz
parents:
diff changeset
96 X2<char>::Inner3<int>::NonType2<sizeof(char), sizeof(int),
anatofuz
parents:
diff changeset
97 sizeof(char)+sizeof(int)> >::value? 1 : -1];
anatofuz
parents:
diff changeset
98
anatofuz
parents:
diff changeset
99 // Template template parameter defaults
anatofuz
parents:
diff changeset
100 template<template<typename T> class X = X2> struct X3 { };
anatofuz
parents:
diff changeset
101 int array3[is_same<X3<>, X3<X2> >::value? 1 : -1];
anatofuz
parents:
diff changeset
102
anatofuz
parents:
diff changeset
103 struct add_pointer {
anatofuz
parents:
diff changeset
104 template<typename T>
anatofuz
parents:
diff changeset
105 struct apply {
anatofuz
parents:
diff changeset
106 typedef T* type;
anatofuz
parents:
diff changeset
107 };
anatofuz
parents:
diff changeset
108 };
anatofuz
parents:
diff changeset
109
anatofuz
parents:
diff changeset
110 template<typename T, template<typename> class X = T::template apply>
anatofuz
parents:
diff changeset
111 struct X4;
anatofuz
parents:
diff changeset
112 int array4[is_same<X4<add_pointer>,
anatofuz
parents:
diff changeset
113 X4<add_pointer, add_pointer::apply> >::value? 1 : -1];
anatofuz
parents:
diff changeset
114
anatofuz
parents:
diff changeset
115 template<int> struct X5 {}; // expected-note{{has a different type 'int'}}
anatofuz
parents:
diff changeset
116 template<long> struct X5b {};
anatofuz
parents:
diff changeset
117 template<typename T,
anatofuz
parents:
diff changeset
118 template<T> class B = X5> // expected-error{{template template argument has different}} \
anatofuz
parents:
diff changeset
119 // expected-note{{previous non-type template parameter}}
anatofuz
parents:
diff changeset
120 struct X6 {};
anatofuz
parents:
diff changeset
121
anatofuz
parents:
diff changeset
122 X6<int> x6a;
anatofuz
parents:
diff changeset
123 X6<long> x6b; // expected-note{{while checking a default template argument}}
anatofuz
parents:
diff changeset
124 X6<long, X5b> x6c;
anatofuz
parents:
diff changeset
125
anatofuz
parents:
diff changeset
126
anatofuz
parents:
diff changeset
127 template<template<class> class X = B<int> > struct X7; // expected-error{{must be a class template}}
anatofuz
parents:
diff changeset
128
anatofuz
parents:
diff changeset
129 namespace PR9643 {
anatofuz
parents:
diff changeset
130 template<typename T> class allocator {};
anatofuz
parents:
diff changeset
131 template<typename T, typename U = allocator<T> > class vector {};
anatofuz
parents:
diff changeset
132
anatofuz
parents:
diff changeset
133 template<template<typename U, typename = allocator<U> > class container,
anatofuz
parents:
diff changeset
134 typename DT>
anatofuz
parents:
diff changeset
135 container<DT> initializer(const DT& d) {
anatofuz
parents:
diff changeset
136 return container<DT>();
anatofuz
parents:
diff changeset
137 }
anatofuz
parents:
diff changeset
138
anatofuz
parents:
diff changeset
139 void f() {
anatofuz
parents:
diff changeset
140 vector<int, allocator<int> > v = initializer<vector>(5);
anatofuz
parents:
diff changeset
141 }
anatofuz
parents:
diff changeset
142 }
anatofuz
parents:
diff changeset
143
anatofuz
parents:
diff changeset
144 namespace PR16288 {
anatofuz
parents:
diff changeset
145 template<typename X>
anatofuz
parents:
diff changeset
146 struct S {
anatofuz
parents:
diff changeset
147 template<typename T = int, typename U>
anatofuz
parents:
diff changeset
148 #if __cplusplus <= 199711L // C++03 or earlier modes
anatofuz
parents:
diff changeset
149 // expected-warning@-2 {{default template arguments for a function template are a C++11 extension}}
anatofuz
parents:
diff changeset
150 #endif
anatofuz
parents:
diff changeset
151 void f();
anatofuz
parents:
diff changeset
152 };
anatofuz
parents:
diff changeset
153 template<typename X>
anatofuz
parents:
diff changeset
154 template<typename T, typename U>
anatofuz
parents:
diff changeset
155 void S<X>::f() {}
anatofuz
parents:
diff changeset
156 }
anatofuz
parents:
diff changeset
157
anatofuz
parents:
diff changeset
158 namespace DR1635 {
anatofuz
parents:
diff changeset
159 template <class T> struct X {
anatofuz
parents:
diff changeset
160 template <class U = typename T::type> static void f(int) {} // expected-error {{type 'int' cannot be used prior to '::' because it has no members}}
anatofuz
parents:
diff changeset
161 #if __cplusplus <= 199711L // C++03 or earlier modes
anatofuz
parents:
diff changeset
162 // expected-warning@-2 {{default template arguments for a function template are a C++11 extension}}
anatofuz
parents:
diff changeset
163 #endif
anatofuz
parents:
diff changeset
164 static void f(...) {}
anatofuz
parents:
diff changeset
165 };
anatofuz
parents:
diff changeset
166
anatofuz
parents:
diff changeset
167 int g() { X<int>::f(0); } // expected-note {{in instantiation of template class 'DR1635::X<int>' requested here}}
anatofuz
parents:
diff changeset
168 }
anatofuz
parents:
diff changeset
169
anatofuz
parents:
diff changeset
170 namespace NondefDecls {
anatofuz
parents:
diff changeset
171 template<typename T> void f1() {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
172 int g1(int defarg = T::error); // expected-error{{type 'int' cannot be used prior to '::' because it has no members}} \
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
173 // expected-note {{in instantiation of default function argument expression for 'g1<int>' required here}}
150
anatofuz
parents:
diff changeset
174 }
anatofuz
parents:
diff changeset
175 template void f1<int>(); // expected-note{{in instantiation of function template specialization 'NondefDecls::f1<int>' requested here}}
anatofuz
parents:
diff changeset
176 }
anatofuz
parents:
diff changeset
177
anatofuz
parents:
diff changeset
178 template <typename T>
anatofuz
parents:
diff changeset
179 struct C {
anatofuz
parents:
diff changeset
180 C(T t = ); // expected-error {{expected expression}}
anatofuz
parents:
diff changeset
181 };
anatofuz
parents:
diff changeset
182 C<int> obj;
anatofuz
parents:
diff changeset
183
anatofuz
parents:
diff changeset
184 namespace PR26134 {
anatofuz
parents:
diff changeset
185 // Make sure when substituting default template arguments we do it in the current context.
anatofuz
parents:
diff changeset
186 template<class T, bool Val = T::value>
anatofuz
parents:
diff changeset
187 struct X {};
anatofuz
parents:
diff changeset
188
anatofuz
parents:
diff changeset
189 template<bool B> struct Y {
anatofuz
parents:
diff changeset
190 void f() { X<Y> xy; }
anatofuz
parents:
diff changeset
191 static const bool value = B;
anatofuz
parents:
diff changeset
192 };
anatofuz
parents:
diff changeset
193
anatofuz
parents:
diff changeset
194 namespace ns1 {
anatofuz
parents:
diff changeset
195 template<class T0>
anatofuz
parents:
diff changeset
196 struct X {
anatofuz
parents:
diff changeset
197 template<bool B = T0::value> struct XInner { static const bool value = B; };
anatofuz
parents:
diff changeset
198 };
anatofuz
parents:
diff changeset
199 template<bool B> struct S { static const bool value = B; };
anatofuz
parents:
diff changeset
200 #if __cplusplus > 199711L
anatofuz
parents:
diff changeset
201 template<bool B> struct Y {
anatofuz
parents:
diff changeset
202 static constexpr bool f() { return typename X<S<B>>::template XInner<>{}.value; }
anatofuz
parents:
diff changeset
203 static_assert(f() == B, "");
anatofuz
parents:
diff changeset
204 };
anatofuz
parents:
diff changeset
205 Y<true> y;
anatofuz
parents:
diff changeset
206 Y<false> y2;
anatofuz
parents:
diff changeset
207 #endif
anatofuz
parents:
diff changeset
208
anatofuz
parents:
diff changeset
209 } // end ns1
anatofuz
parents:
diff changeset
210 } // end ns PR26134
anatofuz
parents:
diff changeset
211
anatofuz
parents:
diff changeset
212 namespace friends {
anatofuz
parents:
diff changeset
213 namespace ns {
anatofuz
parents:
diff changeset
214 template<typename> struct A {
anatofuz
parents:
diff changeset
215 template<typename> friend void f();
anatofuz
parents:
diff changeset
216 template<typename> friend struct X;
anatofuz
parents:
diff changeset
217 };
anatofuz
parents:
diff changeset
218 template<typename = int> void f(); // expected-warning 0-1{{extension}}
anatofuz
parents:
diff changeset
219 template<typename = int> struct X;
anatofuz
parents:
diff changeset
220 A<int> a;
anatofuz
parents:
diff changeset
221 }
anatofuz
parents:
diff changeset
222 namespace ns {
anatofuz
parents:
diff changeset
223 void g() { f(); }
anatofuz
parents:
diff changeset
224 X<int> *p;
anatofuz
parents:
diff changeset
225 }
anatofuz
parents:
diff changeset
226 }
anatofuz
parents:
diff changeset
227
anatofuz
parents:
diff changeset
228 namespace unevaluated {
anatofuz
parents:
diff changeset
229 int a;
anatofuz
parents:
diff changeset
230 template<int = 0> int f(int = a); // expected-warning 0-1{{extension}}
anatofuz
parents:
diff changeset
231 int k = sizeof(f());
anatofuz
parents:
diff changeset
232 }