// RUN: %clang_cc1 -fsyntax-only -verify %s template<typename T> inline void f(T) { } template void f(int); // expected-note{{previous explicit instantiation}} template void f(int); // expected-error{{duplicate explicit instantiation}} template<typename T> struct X0 { union Inner { }; void f(T) { } static T value; }; template<typename T> T X0<T>::value = 3.14; // expected-warning{{implicit conversion from 'double' to 'int' changes value from 3.14 to 3}} template struct X0<int>; // expected-note{{previous explicit instantiation}} \ expected-note{{requested here}} template struct X0<int>; // expected-error{{duplicate explicit instantiation}} template void X0<float>::f(float); // expected-note{{previous explicit instantiation}} template void X0<float>::f(float); // expected-error{{duplicate explicit instantiation}} template union X0<float>::Inner; // expected-note{{previous explicit instantiation}} template union X0<float>::Inner; // expected-error{{duplicate explicit instantiation}} template float X0<float>::value; // expected-note{{previous explicit instantiation}} template float X0<float>::value; // expected-error{{duplicate explicit instantiation}} // Make sure that we don't get tricked by redeclarations of nested classes. namespace NestedClassRedecls { template<typename T> struct X { struct Nested; friend struct Nested; struct Nested { Nested() {} } nested; }; X<int> xi; template struct X<int>; } |