Home | History | Annotate | Download | only in temp.spec
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 
      3 template<typename T> inline void f(T) { }
      4 template void f(int); // expected-note{{previous explicit instantiation}}
      5 template void f(int); // expected-error{{duplicate explicit instantiation}}
      6 
      7 template<typename T>
      8 struct X0 {
      9   union Inner { };
     10 
     11   void f(T) { }
     12 
     13   static T value;
     14 };
     15 
     16 template<typename T>
     17 T X0<T>::value = 3.14; // expected-warning{{implicit conversion from 'double' to 'int' changes value from 3.14 to 3}}
     18 
     19 template struct X0<int>; // expected-note{{previous explicit instantiation}} \
     20                             expected-note{{requested here}}
     21 template struct X0<int>; // expected-error{{duplicate explicit instantiation}}
     22 
     23 template void X0<float>::f(float); // expected-note{{previous explicit instantiation}}
     24 template void X0<float>::f(float); // expected-error{{duplicate explicit instantiation}}
     25 
     26 template union X0<float>::Inner; // expected-note{{previous explicit instantiation}}
     27 template union X0<float>::Inner; // expected-error{{duplicate explicit instantiation}}
     28 
     29 template float X0<float>::value; // expected-note{{previous explicit instantiation}}
     30 template float X0<float>::value; // expected-error{{duplicate explicit instantiation}}
     31 
     32 // Make sure that we don't get tricked by redeclarations of nested classes.
     33 namespace NestedClassRedecls {
     34   template<typename T>
     35   struct X {
     36     struct Nested;
     37     friend struct Nested;
     38 
     39     struct Nested {
     40       Nested() {}
     41     } nested;
     42   };
     43 
     44   X<int> xi;
     45 
     46   template struct X<int>;
     47 }
     48