1 | // RUN: %clang_cc1 -verify %s -fcxx-exceptions -std=c++1y |
2 | |
3 | namespace N {} |
4 | |
5 | template<typename T, // expected-note {{declared here}} |
6 | typename T> struct X {}; // expected-error {{declaration of 'T' shadows template parameter}} |
7 | |
8 | template<typename T> struct Y { // expected-note 18{{declared here}} |
9 | template<typename T> struct A {}; // expected-error {{declaration of 'T' shadows template parameter}} |
10 | |
11 | struct B { |
12 | template<typename> struct T {}; // expected-error {{declaration of 'T' shadows template parameter}} |
13 | }; |
14 | struct C { |
15 | template<typename> void T(); // expected-error {{declaration of 'T' shadows template parameter}} |
16 | }; |
17 | struct D { |
18 | struct T {}; // expected-error {{declaration of 'T' shadows template parameter}} |
19 | }; |
20 | struct E { |
21 | typedef int T; // expected-error {{declaration of 'T' shadows template parameter}} |
22 | }; |
23 | struct F { |
24 | using T = int; // expected-error {{declaration of 'T' shadows template parameter}} |
25 | }; |
26 | struct G { |
27 | int T; // expected-error {{declaration of 'T' shadows template parameter}} |
28 | }; |
29 | struct H { |
30 | static int T; // expected-error {{declaration of 'T' shadows template parameter}} |
31 | }; |
32 | struct I { |
33 | void T(); // expected-error {{declaration of 'T' shadows template parameter}} |
34 | }; |
35 | struct J { |
36 | enum T { e }; // expected-error {{declaration of 'T' shadows template parameter}} |
37 | }; |
38 | struct K { |
39 | enum E { T }; // expected-error {{declaration of 'T' shadows template parameter}} |
40 | }; |
41 | |
42 | void a() { |
43 | extern int T; // expected-error {{declaration of 'T' shadows template parameter}} |
44 | } |
45 | void b() { |
46 | int T; // expected-error {{declaration of 'T' shadows template parameter}} |
47 | } |
48 | void c() { |
49 | try {} |
50 | catch (int T) {} // expected-error {{declaration of 'T' shadows template parameter}} |
51 | } |
52 | void d() { |
53 | void T(); // expected-error {{declaration of 'T' shadows template parameter}} |
54 | } |
55 | void e() { |
56 | namespace T = N; // expected-error {{declaration of 'T' shadows template parameter}} |
57 | } |
58 | |
59 | // FIXME: These diagnostics are poorly worded. Lookup for the elaborated type |
60 | // specifier finds the template parameter in this case, which is ill-formed |
61 | // because it's not a struct. |
62 | void f() { |
63 | struct T *p; // expected-error {{declaration of 'T' shadows template parameter}} |
64 | } |
65 | friend struct T; // expected-error {{declaration of 'T' shadows template parameter}} |
66 | }; |
67 | |
68 | template<int T> struct Z { // expected-note 16{{declared here}} |
69 | template<typename T> struct A {}; // expected-error {{declaration of 'T' shadows template parameter}} |
70 | |
71 | struct B { |
72 | template<typename> struct T {}; // expected-error {{declaration of 'T' shadows template parameter}} |
73 | }; |
74 | struct C { |
75 | template<typename> void T(); // expected-error {{declaration of 'T' shadows template parameter}} |
76 | }; |
77 | struct D { |
78 | struct T {}; // expected-error {{declaration of 'T' shadows template parameter}} |
79 | }; |
80 | struct E { |
81 | typedef int T; // expected-error {{declaration of 'T' shadows template parameter}} |
82 | }; |
83 | struct F { |
84 | using T = int; // expected-error {{declaration of 'T' shadows template parameter}} |
85 | }; |
86 | struct G { |
87 | int T; // expected-error {{declaration of 'T' shadows template parameter}} |
88 | }; |
89 | struct H { |
90 | static int T; // expected-error {{declaration of 'T' shadows template parameter}} |
91 | }; |
92 | struct I { |
93 | void T(); // expected-error {{declaration of 'T' shadows template parameter}} |
94 | }; |
95 | struct J { |
96 | enum T { e }; // expected-error {{declaration of 'T' shadows template parameter}} |
97 | }; |
98 | struct K { |
99 | enum E { T }; // expected-error {{declaration of 'T' shadows template parameter}} |
100 | }; |
101 | |
102 | void a() { |
103 | extern int T; // expected-error {{declaration of 'T' shadows template parameter}} |
104 | } |
105 | void b() { |
106 | int T; // expected-error {{declaration of 'T' shadows template parameter}} |
107 | } |
108 | void c() { |
109 | try {} |
110 | catch (int T) {} // expected-error {{declaration of 'T' shadows template parameter}} |
111 | } |
112 | void d() { |
113 | void T(); // expected-error {{declaration of 'T' shadows template parameter}} |
114 | } |
115 | void e() { |
116 | namespace T = N; // expected-error {{declaration of 'T' shadows template parameter}} |
117 | } |
118 | |
119 | // These cases are valid when 'T' is a non-type template parameter, as T |
120 | // names an injected struct ::T, which doesn't shadow the template parameter. |
121 | void f() { |
122 | struct T *p; |
123 | } |
124 | friend struct T; |
125 | }; |
126 | |
127 | template<typename T> // expected-note {{declared here}} |
128 | void f(int T) {} // expected-error {{declaration of 'T' shadows template parameter}} |
129 | |
130 | // FIXME: These are ill-formed: a template-parameter shall not have the same name as the template name. |
131 | namespace A { |
132 | template<typename T> struct T {}; // expected-error{{declaration of 'T' shadows template parameter}} |
133 | // expected-note@-1{{template parameter is declared here}} |
134 | } |
135 | namespace B { |
136 | template<typename T> void T() {} |
137 | } |
138 | namespace C { |
139 | template<typename T> int T; |
140 | } |
141 | |
142 | namespace PR28023 { |
143 | template<int V> // expected-note{{template parameter is declared here}} |
144 | struct A { |
145 | struct B { |
146 | template <int> friend struct V; // expected-error{{declaration of 'V' shadows template parameter}} |
147 | }; |
148 | }; |
149 | A<0>::B a; |
150 | } |
151 | |