1 // RUN: %clang_cc1 -verify %s -fcxx-exceptions -std=c++1y
2
3 template<typename T, // expected-note {{declared here}}
4 typename T> struct X {}; // expected-error {{declaration of 'T' shadows template parameter}}
5
6 template<typename T> struct Y { // expected-note 15{{declared here}}
7 template<typename T> struct A {}; // expected-error {{declaration of 'T' shadows template parameter}}
8
9 struct B {
10 template<typename> struct T {}; // FIXME: desired-error {{declaration of 'T' shadows template parameter}}
11 };
12 struct C {
13 template<typename> void T(); // expected-error {{declaration of 'T' shadows template parameter}}
14 };
15 struct D {
16 struct T {}; // expected-error {{declaration of 'T' shadows template parameter}}
17 };
18 struct E {
19 typedef int T; // expected-error {{declaration of 'T' shadows template parameter}}
20 };
21 struct F {
22 using T = int; // expected-error {{declaration of 'T' shadows template parameter}}
23 };
24 struct G {
25 int T; // expected-error {{declaration of 'T' shadows template parameter}}
26 };
27 struct H {
28 static int T; // expected-error {{declaration of 'T' shadows template parameter}}
29 };
30 struct I {
31 void T(); // expected-error {{declaration of 'T' shadows template parameter}}
32 };
33 struct J {
34 enum T { e }; // expected-error {{declaration of 'T' shadows template parameter}}
35 };
36 struct K {
37 enum E { T }; // expected-error {{declaration of 'T' shadows template parameter}}
38 };
39
aY40 void a() {
41 extern int T; // expected-error {{declaration of 'T' shadows template parameter}}
42 }
bY43 void b() {
44 int T; // expected-error {{declaration of 'T' shadows template parameter}}
45 }
cY46 void c() {
47 try {}
48 catch (int T) {} // expected-error {{declaration of 'T' shadows template parameter}}
49 }
dY50 void d() {
51 void T(); // expected-error {{declaration of 'T' shadows template parameter}}
52 }
53
54 friend struct T; // expected-error {{declaration of 'T' shadows template parameter}}
55 };
56
57 template<typename T> // expected-note {{declared here}}
f(int T)58 void f(int T) {} // expected-error {{declaration of 'T' shadows template parameter}}
59
60 // FIXME: These are ill-formed: a template-parameter shall not have the same name as the template name.
61 namespace A {
62 template<typename T> struct T {};
63 }
64 namespace B {
T()65 template<typename T> void T() {}
66 }
67 namespace C {
68 template<typename T> int T;
69 }
70