1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s 2583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor 3583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate<typename T> inline void f(T) { } 4583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate void f(int); // expected-note{{previous explicit instantiation}} 5583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate void f(int); // expected-error{{duplicate explicit instantiation}} 6583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor 7583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate<typename T> 8583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregorstruct X0 { 9583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor union Inner { }; 10583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor 11583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor void f(T) { } 12583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor 13583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor static T value; 14583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor}; 15583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor 16583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate<typename T> 17e31b8fb25b458f00e31dcd657c0840e5238e0f05David BlaikieT X0<T>::value = 3.14; // expected-warning{{implicit conversion turns literal floating-point number into integer}} 18583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor 19e31b8fb25b458f00e31dcd657c0840e5238e0f05David Blaikietemplate struct X0<int>; // expected-note{{previous explicit instantiation}} \ 20e31b8fb25b458f00e31dcd657c0840e5238e0f05David Blaikie expected-note{{requested here}} 21583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate struct X0<int>; // expected-error{{duplicate explicit instantiation}} 22583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor 23583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate void X0<float>::f(float); // expected-note{{previous explicit instantiation}} 24583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate void X0<float>::f(float); // expected-error{{duplicate explicit instantiation}} 25583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor 26583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate union X0<float>::Inner; // expected-note{{previous explicit instantiation}} 27583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate union X0<float>::Inner; // expected-error{{duplicate explicit instantiation}} 28583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor 29583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate float X0<float>::value; // expected-note{{previous explicit instantiation}} 30583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate float X0<float>::value; // expected-error{{duplicate explicit instantiation}} 31a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor 32a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor// Make sure that we don't get tricked by redeclarations of nested classes. 33a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregornamespace NestedClassRedecls { 34a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor template<typename T> 35a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor struct X { 36a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor struct Nested; 37a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor friend struct Nested; 38a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor 39a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor struct Nested { 40a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor Nested() {} 41a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor } nested; 42a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor }; 43a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor 44a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor X<int> xi; 45a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor 46a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor template struct X<int>; 47a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor} 48