1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++03 %s
3 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
5 template<typename FromCl
>
8 static void isa(const FromCl
&Val
) { }
11 template<class X
, class Y
>
12 void isa(const Y
&Val
) { return isa_impl_cl
<Y
>::template isa
<X
>(Val
); }
15 void f0(const Value
&Val
) { isa
<Value
>(Val
); }
17 // Implicit template-ids.
29 void test_X0_int(X0
<int> xi
, float f
) {
33 // Not template-id expressions, but they almost look like it.
44 Y
<X
<I
> >(::X
<I
>(0, 0));
50 // 'template' as a disambiguator.
59 void f3(int); // expected-note 2{{declared as a non-template here}}
67 Y0::template f1
<U
>(0);
71 Y0::template f2
<U
>(0);
74 Y0::template f3(0); // expected-error {{'f3' following the 'template' keyword does not refer to a template}}
75 Y0::template f3(); // expected-error {{'f3' following the 'template' keyword does not refer to a template}}
79 x
= Y0::f4
<int>(0); // expected-error {{assigning to 'int' from incompatible type 'void'}}
80 x
= Y0::template f4(0); // expected-error {{assigning to 'int' from incompatible type 'void'}}
83 x
= this->f4
<int>(0); // expected-error {{assigning to 'int' from incompatible type 'void'}}
84 x
= this->template f4(0); // expected-error {{assigning to 'int' from incompatible type 'void'}}
88 template<typename U
> void Y0
89 ::template // expected-error {{expected unqualified-id}}
92 // FIXME: error recovery is awful without this.
103 void f3(int); // expected-note 4{{declared as a non-template here}}
111 Y1::template f1
<U
>(0);
113 this->template f1(0);
115 Y1::template f2
<U
>(0);
118 Y1::template f3(0); // expected-error {{'f3' following the 'template' keyword does not refer to a template}}
119 Y1::template f3(); // expected-error {{'f3' following the 'template' keyword does not refer to a template}}
123 x
= Y1::f4
<int>(0); // expected-error {{assigning to 'int' from incompatible type 'void'}}
124 x
= Y1::template f4(0); // expected-error {{assigning to 'int' from incompatible type 'void'}}
127 x
= this->f4
<int>(0); // expected-error {{assigning to 'int' from incompatible type 'void'}}
128 x
= this->template f4(0); // expected-error {{assigning to 'int' from incompatible type 'void'}}
132 void use_Y1(Y1
<int> y1
) { y1
.f
<int>(); } // expected-note {{in instantiation of}}
140 Y1::template f1
<U
>(0);
144 Y1::template f2
<U
>(0);
147 Y1::template f3(0); // expected-error {{'f3' following the 'template' keyword does not refer to a template}}
148 Y1::template f3(); // expected-error {{'f3' following the 'template' keyword does not refer to a template}}
152 x
= Y1::f4
<int>(0); // expected-error {{use 'template'}} expected-error {{assigning to 'int' from incompatible type 'void'}}
153 x
= Y1::template f4(0); // expected-error {{assigning to 'int' from incompatible type 'void'}}
156 x
= p
->f4
<int>(0); // expected-error {{assigning to 'int' from incompatible type 'void'}} expected-error {{use 'template'}}
157 x
= p
->template f4(0); // expected-error {{assigning to 'int' from incompatible type 'void'}}
161 void use_Y2(Y2
<int> y2
) { y2
.f
<int>(0); } // expected-note {{in instantiation of}}
166 static void b1(); // expected-note {{declared as a non-template here}}
172 A::template B
<I
>::template b1(); // expected-error {{'b1' following the 'template' keyword does not refer to a template}}
175 template void f5
<0>(); // expected-note {{in instantiation of function template specialization 'f5<0>' requested here}}
178 template <template <typename
> class D
>
180 template class D
<C
>; // expected-error {{expected '<' after 'template'}}
181 template<> class D
<C
>; // expected-error {{cannot specialize a template template parameter}}
182 friend class D
<C
>; // expected-error {{type alias template 'D' cannot be referenced with a class specifier}}
184 #if __cplusplus <= 199711L
185 // expected-warning@+2 {{extension}}
187 template<typename T
> using D
= int; // expected-note {{declared here}}
188 E
<D
> ed
; // expected-note {{instantiation of}}