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