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