1dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com// RUN: %clang_cc1 -fsyntax-only -verify %s
2dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com
3dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.comtemplate<typename T> inline void f(T) { }
4dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.comtemplate void f(int); // expected-note{{previous explicit instantiation}}
5dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.comtemplate void f(int); // expected-error{{duplicate explicit instantiation}}
6dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com
7dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.comtemplate<typename T>
8dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.comstruct X0 {
9dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com  union Inner { };
10dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com
11dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com  void f(T) { }
12dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com
13dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com  static T value;
14dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com};
15dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com
16dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.comtemplate<typename T>
17ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.comT X0<T>::value = 3.14; // expected-warning{{implicit conversion from 'double' to 'int' changes value from 3.14 to 3}}
18dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com
192880df2609eba09b555ca37be04b6ad89290c765Tom Hudsontemplate struct X0<int>; // expected-note{{previous explicit instantiation}} \
20622a17091b69df8d54d318c88f34851677a6d9c2robertphillips@google.com                            expected-note{{requested here}}
21dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.comtemplate struct X0<int>; // expected-error{{duplicate explicit instantiation}}
22dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com
23dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.comtemplate void X0<float>::f(float); // expected-note{{previous explicit instantiation}}
24dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.comtemplate void X0<float>::f(float); // expected-error{{duplicate explicit instantiation}}
25dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com
26dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.comtemplate union X0<float>::Inner; // expected-note{{previous explicit instantiation}}
27dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.comtemplate union X0<float>::Inner; // expected-error{{duplicate explicit instantiation}}
28dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com
29ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.comtemplate float X0<float>::value; // expected-note{{previous explicit instantiation}}
30dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.comtemplate float X0<float>::value; // expected-error{{duplicate explicit instantiation}}
31dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com
32dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com// Make sure that we don't get tricked by redeclarations of nested classes.
33fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.comnamespace NestedClassRedecls {
34670ff9ae7f37356bff08b30a356bb0c52dc8d62erobertphillips@google.com  template<typename T>
35670ff9ae7f37356bff08b30a356bb0c52dc8d62erobertphillips@google.com  struct X {
36670ff9ae7f37356bff08b30a356bb0c52dc8d62erobertphillips@google.com    struct Nested;
372880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    friend struct Nested;
382880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
392880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    struct Nested {
402880df2609eba09b555ca37be04b6ad89290c765Tom Hudson      Nested() {}
412880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    } nested;
422880df2609eba09b555ca37be04b6ad89290c765Tom Hudson  };
432880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
44944bcf0acb78f8f9da01e991f1307629959e338absalomon  X<int> xi;
45dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com
46dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com  template struct X<int>;
47622a17091b69df8d54d318c88f34851677a6d9c2robertphillips@google.com}
48622a17091b69df8d54d318c88f34851677a6d9c2robertphillips@google.com