p5.cpp revision a77eaa9f4562dc611aa121a20ee8f2e2146765ce
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>
17583f33b8a9227bace1a77a15404b4c64dc619d69Douglas GregorT X0<T>::value = 3.14;
18583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor
19583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate struct X0<int>; // expected-note{{previous explicit instantiation}}
20583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate struct X0<int>; // expected-error{{duplicate explicit instantiation}}
21583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor
22583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate void X0<float>::f(float); // expected-note{{previous explicit instantiation}}
23583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate void X0<float>::f(float); // expected-error{{duplicate explicit instantiation}}
24583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor
25583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate union X0<float>::Inner; // expected-note{{previous explicit instantiation}}
26583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate union X0<float>::Inner; // expected-error{{duplicate explicit instantiation}}
27583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor
28583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate float X0<float>::value; // expected-note{{previous explicit instantiation}}
29583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregortemplate float X0<float>::value; // expected-error{{duplicate explicit instantiation}}
30a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor
31a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor// Make sure that we don't get tricked by redeclarations of nested classes.
32a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregornamespace NestedClassRedecls {
33a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor  template<typename T>
34a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor  struct X {
35a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor    struct Nested;
36a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor    friend struct Nested;
37a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor
38a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor    struct Nested {
39a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor      Nested() {}
40a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor    } nested;
41a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor  };
42a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor
43a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor  X<int> xi;
44a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor
45a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor  template struct X<int>;
46a77eaa9f4562dc611aa121a20ee8f2e2146765ceDouglas Gregor}
47