Clang Project

clang_source_code/test/CXX/temp/temp.res/temp.local/p6.cpp
1// RUN: %clang_cc1 -verify %s -fcxx-exceptions -std=c++1y
2
3namespace N {}
4
5template<typename T, // expected-note {{declared here}}
6         typename T> struct X {}; // expected-error {{declaration of 'T' shadows template parameter}}
7
8template<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
68template<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
127template<typename T> // expected-note {{declared here}}
128void 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.
131namespace 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}
135namespace B {
136  template<typename T> void T() {}
137}
138namespace C {
139  template<typename T> int T;
140}
141
142namespace PR28023 {
143template<int V>  // expected-note{{template parameter is declared here}}
144struct A {
145  struct B {
146    template <int> friend struct V;  // expected-error{{declaration of 'V' shadows template parameter}}
147  };
148};
149A<0>::B a;
150}
151