176 lines · cpp
1// RUN: %clang_cc1 -verify %s -fcxx-exceptions -std=c++1y -Wno-error=strict-primary-template-shadow2 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 type60 // specifier finds the template parameter in this case, which is ill-formed61 // 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 T120 // 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 130namespace A {131 template<typename T> struct T {}; // expected-error{{declaration of 'T' shadows template parameter}}132 // expected-note@-1{{template parameter is declared here}}133 template<typename T> struct U {134 template<typename V> struct V {}; // expected-error{{declaration of 'V' shadows template parameter}}135 // expected-note@-1{{template parameter is declared here}}136 };137}138namespace B {139 template<typename T> void T() {} // expected-warning{{declaration of 'T' shadows template parameter}}140 // expected-note@-1{{template parameter is declared here}}141 142 template<typename T> struct U {143 template<typename V> void V(); // expected-warning{{declaration of 'V' shadows template parameter}}144 // expected-note@-1{{template parameter is declared here}}145 };146}147namespace C {148 template<typename T> int T; // expected-warning{{declaration of 'T' shadows template parameter}}149 // expected-note@-1{{template parameter is declared here}}150 template<typename T> struct U {151 template<typename V> static int V; // expected-warning{{declaration of 'V' shadows template parameter}}152 // expected-note@-1{{template parameter is declared here}}153 };154}155 156namespace PR28023 {157template<int V> // expected-note{{template parameter is declared here}}158struct A {159 struct B {160 template <int> friend struct V; // expected-error{{declaration of 'V' shadows template parameter}}161 };162};163A<0>::B a;164}165 166template <typename T> int shadow() { // expected-note{{template parameter is declared here}}167 using arr = int[1];168 // expected-warning@+1 {{structured binding declarations are a C++17 extension}}169 auto [170 T // expected-error {{declaration of 'T' shadows template parameter}}171 ] = arr{};172 return 0;173}174 175auto Use = shadow<int>();176