1 // RUN: %clang_cc1 -verify -std=c++11 %s
2 // RUN: %clang_cc1 -verify -std=c++11 -fdelayed-template-parsing %s
8 T (X::* f1())(int) { return 0; }
14 template void f0
<int>();
23 Y() { V
= ValueType(); }
37 // Instantiation of local classes with virtual functions.
38 namespace local_class_with_virtual_functions
{
39 template <typename T
> struct X
{ };
40 template <typename T
> struct Y
{ };
44 struct Z
: public X
<Y
<T
>*> {
45 virtual void g(Y
<T
>* y
) { }
46 void g2(int x
) {(void)x
;}
53 void test() { f
<S
>(); }
60 typedef int (X::*pmf_type
)();
61 class X
: public T
{ };
63 pmf_type pmf
= &T::foo
;
66 struct Y
{ int foo(); };
68 template void foo
<Y
>();
71 namespace TemplatePacksAndLambdas
{
72 template <typename
...T
> int g(T
...);
74 template <typename
...T
> static void f(int f
= g([]{ static T t
; return ++t
; }()...)) {}
76 void h() { S::f
<int, int, int>(); }
80 template <class Thing
> void forEach(Thing t
) { t
.func(); }
82 template <typename T
> void doIt() {
84 void func() { (void)i
; }
98 template <typename F
> bool apply(F f
) { return f(); }
101 template <typename
> struct T
{
106 bool operator()() { return x
== 0; }
113 void call() { T
<int>().foo(); }
117 template <class T
> void foo(const T
&t
) { t
.foo(); }
119 template <class F
> void bar(F
*f
) {
122 void foo() const { fn(); }
129 void test() { bar(go
); }
135 template <typename T
> static void foo(T function
);
136 template <typename T
> static void bar(T function
);
137 template <typename T
> static void func(T function
);
140 template <typename T
> void C::foo(T function
) { function(); }
142 template <typename T
> void C::bar(T function
) {
143 foo([&function
]() { function(); });
146 template <typename T
> void C::func(T function
) {
150 Struct(T function
) : mFunction(function
) {};
157 bar(Struct(function
));
167 template <typename _Functor
> function(_Functor __f
) { __f(); }
169 template <typename Func
> function
exec_func(Func f
) {
171 functor(Func f
) : func(f
) {}
172 void operator()() const { func(); }
178 void operator()() const {}
188 class C
: public C
<int> {}; // expected-error{{within its own definition}}
190 template <typename X
>
196 void f() { F
<int>(); }
202 int operator()() const { return 0; }
207 template <bool = true> int make_seed_pair() noexcept
{
215 return make_seed_pair();
220 // Forward declarations
222 template<typename T
> void f1() {
226 template void f1
<int>();
228 template<typename T
> void f1a() {
232 template void f1a
<int>();
234 template<typename T
> void f2() {
235 void g2(enum x2
); // expected-error{{ISO C++ forbids forward references to 'enum' types}}
238 template void f2
<int>();
240 template<typename T
> void f3() {
241 void g3(enum class x3
);
242 enum class x3
{ nothing
};
244 template void f3
<int>();
247 template<typename T
> void f4() {
248 void g4(struct x4
{} x
); // expected-error{{'x4' cannot be defined in a parameter type}}
250 template void f4
<int>();
252 template<typename T
> void f4a() {
253 void g4(union x4
{} x
); // expected-error{{'x4' cannot be defined in a parameter type}}
255 template void f4a
<int>();
258 template <class T
> void f();
259 template <class T
> struct S1
{
265 template struct S1
<int>;
267 template <class T
> struct S2
{
269 f
<enum new_enum
>(); // expected-error{{ISO C++ forbids forward references to 'enum' types}}
272 template struct S2
<int>;
274 template <class T
> struct S3
{
276 f
<enum class new_enum
>();
279 template struct S3
<int>;
281 template <class T
> struct S4
{
287 template struct S4
<int>;
289 template <class T
> struct S4a
{
295 template struct S4a
<int>;
297 template <class T
> struct S5
{
298 enum local
{ nothing
};
303 template struct S5
<int>;
305 template <class T
> struct S7
{
306 enum class local
{ nothing
};
311 template struct S7
<int>;
314 template <class T
> void fff(T
*x
);
315 template <class T
> struct S01
{
322 template struct S01
<int>;
324 template <class T
> struct S01a
{
331 template struct S01a
<int>;
333 template <class T
> struct S02
{
334 enum local
{ nothing
};
340 template struct S02
<int>;
342 template <class T
> struct S03
{
343 enum class local
{ nothing
};
349 template struct S03
<int>;
352 template <class T
> struct S04
{
358 template struct S04
<int>;
360 template <class T
> struct S04a
{
366 template struct S04a
<int>;
368 template <class T
> struct S05
{
374 template struct S05
<int>;
376 template <class T
> struct S06
{
378 class { virtual void mmm() {} } x
;
382 template struct S06
<int>;
386 template <typename T
>
389 static constexpr int get() { return 42; }
391 constexpr int n
= N::get();
392 static_assert(n
== 42, "n == 42");
395 void g() { f
<void>(); }
400 template<typename T
> void f1() {
401 struct S
{ // expected-note{{in instantiation of member class 'S' requested here}}
402 void g1(int n
= T::error
); // expected-error{{type 'int' cannot be used prior to '::' because it has no members}}
405 template void f1
<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f1<int>' requested here}}
407 template<typename T
> void f2() {
408 struct S
{ // expected-note{{in instantiation of member class 'S' requested here}}
409 void g2() noexcept(T::error
); // expected-error{{type 'int' cannot be used prior to '::' because it has no members}}
412 template void f2
<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f2<int>' requested here}}
414 template<typename T
> void f3() {
416 val
= T::error
; // expected-error{{expected '}' or ','}} expected-error{{type 'int' cannot be used prior to '::' because it has no members}}
419 template void f3
<int>(); //expected-note{{in instantiation of function template specialization 'PR21332::f3<int>' requested here}}
421 template<typename T
> void f4() {
423 val
= T::error
; // expected-error{{expected '}' or ','}} expected-error{{type 'int' cannot be used prior to '::' because it has no members}}
426 template void f4
<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f4<int>' requested here}}
428 template<typename T
> void f5() {
429 class S
{ // expected-note {{in instantiation of default member initializer 'PR21332::f5()::S::val' requested here}}
430 int val
= T::error
; // expected-error {{type 'int' cannot be used prior to '::' because it has no members}}
433 template void f5
<int>(); // expected-note {{in instantiation of function template specialization 'PR21332::f5<int>' requested here}}
435 template<typename T
> void f6() {
436 class S
{ // expected-note {{in instantiation of member function 'PR21332::f6()::S::get' requested here}}
438 class S2
{ // expected-note {{in instantiation of member class 'S2' requested here}}
439 void g1(int n
= T::error
); // expected-error {{type 'int' cannot be used prior to '::' because it has no members}}
444 template void f6
<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f6<int>' requested here}}
446 template<typename T
> void f7() {
447 struct S
{ void g() noexcept(undefined_val
); }; // expected-error{{use of undeclared identifier 'undefined_val'}}
449 template void f7
<int>();
452 // rdar://23721638: Ensure that we correctly perform implicit
453 // conversions when instantiating the default arguments of local functions.
454 namespace rdar23721638
{
456 A(const char *) = delete; // expected-note 2 {{explicitly marked deleted here}}
459 template <typename T
> void foo() {
460 struct Inner
{ // expected-note {{in instantiation}}
461 void operator()(T a
= "") {} // expected-error {{conversion function from 'const char [1]' to 'rdar23721638::A' invokes a deleted function}}
462 // expected-note@-1 {{passing argument to parameter 'a' here}}
463 // expected-note@-2 {{candidate function not viable}}
465 Inner()(); // expected-error {{no matching function}}
467 template void foo
<A
>(); // expected-note 2 {{in instantiation}}
469 template <typename T
> void bar() {
470 auto lambda
= [](T a
= "") {}; // expected-error {{conversion function from 'const char [1]' to 'rdar23721638::A' invokes a deleted function}}
471 // expected-note@-1 {{passing argument to parameter 'a' here}}
472 // expected-note@-2 {{candidate function not viable}}
473 // expected-note@-3 {{conversion candidate of type}}
474 lambda(); // expected-error {{no matching function}}
476 template void bar
<A
>(); // expected-note {{in instantiation}}
479 namespace anon_union_default_member_init
{
480 template<typename T
> void f() {
487 void g() { f
<int>(); }