blob: 8db2bc34296e2be0daf521ff01ff4b4a4c1e970f [file] [log] [blame]
Douglas Gregor39a8de12009-02-25 19:37:18 +00001// RUN: clang -fsyntax-only -verify %s
2
3namespace N {
4 namespace M {
5 template<typename T> struct Promote; // expected-note{{previous definition is here}}
6
7 template<> struct Promote<short> {
8 typedef int type;
9 };
10
11 template<> struct Promote<int> {
12 typedef int type;
13 };
14
15 template<> struct Promote<float> {
16 typedef double type;
17 };
18
19 Promote<short>::type *ret_intptr(int* ip) { return ip; }
20 Promote<int>::type *ret_intptr2(int* ip) { return ip; }
21 }
22
23 M::Promote<int>::type *ret_intptr3(int* ip) { return ip; }
24 M::template Promote<int>::type *ret_intptr4(int* ip) { return ip; }
25}
26
27N::M::Promote<int>::type *ret_intptr5(int* ip) { return ip; }
28::N::M::Promote<int>::type *ret_intptr6(int* ip) { return ip; }
29
30
31N::M::template; // expected-error{{expected template name after 'template' keyword in nested name specifier}} \
32 // expected-error{{expected unqualified-id}}
33
34N::M::template Promote; // expected-error{{expected '<' after 'template Promote' in nested name specifier}} \
35// expected-error{{C++ requires a type specifier for all declarations}} \
Douglas Gregor656de632009-03-11 23:52:16 +000036// expected-error{{redefinition of 'Promote' as different kind of symbol}}
Douglas Gregor39a8de12009-02-25 19:37:18 +000037
38namespace N {
39 template<typename T> struct A;
40
41 template<>
42 struct A<int> {
43 struct X;
44 };
45}
46
47struct ::N::A<int>::X {
48 int foo;
49};