Home | History | Annotate | Download | only in temp.local
      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 16{{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 {}; // FIXME: desired-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   friend struct T; // expected-error {{declaration of 'T' shadows template parameter}}
     60 };
     61 
     62 template<typename T> // expected-note {{declared here}}
     63 void f(int T) {} // expected-error {{declaration of 'T' shadows template parameter}}
     64 
     65 // FIXME: These are ill-formed: a template-parameter shall not have the same name as the template name.
     66 namespace A {
     67   template<typename T> struct T {};
     68 }
     69 namespace B {
     70   template<typename T> void T() {}
     71 }
     72 namespace C {
     73   template<typename T> int T;
     74 }
     75