p5.cpp revision a77eaa9f4562dc611aa121a20ee8f2e2146765ce
1// RUN: %clang_cc1 -fsyntax-only -verify %s
2
3template<typename T> inline void f(T) { }
4template void f(int); // expected-note{{previous explicit instantiation}}
5template void f(int); // expected-error{{duplicate explicit instantiation}}
6
7template<typename T>
8struct X0 {
9  union Inner { };
10
11  void f(T) { }
12
13  static T value;
14};
15
16template<typename T>
17T X0<T>::value = 3.14;
18
19template struct X0<int>; // expected-note{{previous explicit instantiation}}
20template struct X0<int>; // expected-error{{duplicate explicit instantiation}}
21
22template void X0<float>::f(float); // expected-note{{previous explicit instantiation}}
23template void X0<float>::f(float); // expected-error{{duplicate explicit instantiation}}
24
25template union X0<float>::Inner; // expected-note{{previous explicit instantiation}}
26template union X0<float>::Inner; // expected-error{{duplicate explicit instantiation}}
27
28template float X0<float>::value; // expected-note{{previous explicit instantiation}}
29template float X0<float>::value; // expected-error{{duplicate explicit instantiation}}
30
31// Make sure that we don't get tricked by redeclarations of nested classes.
32namespace NestedClassRedecls {
33  template<typename T>
34  struct X {
35    struct Nested;
36    friend struct Nested;
37
38    struct Nested {
39      Nested() {}
40    } nested;
41  };
42
43  X<int> xi;
44
45  template struct X<int>;
46}
47