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