blob: a5aa2dcb527a1d3c7ee839ea3f6a8ec4dd7aabdf [file] [log] [blame]
Daniel Dunbard7d5f022009-03-24 02:24:46 +00001// RUN: clang-cc -fsyntax-only -verify %s
Douglas Gregor39a8de12009-02-25 19:37:18 +00002
3namespace N {
4 namespace M {
Chris Lattnerf4382f52009-04-14 22:17:06 +00005 template<typename T> struct Promote;
Douglas Gregor39a8de12009-02-25 19:37:18 +00006
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}} \
Chris Lattnerf4382f52009-04-14 22:17:06 +000035// expected-error{{C++ requires a type specifier for all declarations}}
Douglas Gregor39a8de12009-02-25 19:37:18 +000036
37namespace N {
38 template<typename T> struct A;
39
40 template<>
41 struct A<int> {
42 struct X;
43 };
Douglas Gregorc45c2322009-03-31 00:43:58 +000044
45 struct B;
Douglas Gregor39a8de12009-02-25 19:37:18 +000046}
47
48struct ::N::A<int>::X {
49 int foo;
50};
Douglas Gregorc45c2322009-03-31 00:43:58 +000051
52#if 0
53// FIXME: the following crashes the parser, because Sema has no way to
Douglas Gregor31a19b62009-04-01 21:51:26 +000054// communicate that the "dependent" template-name N::template B doesn't
Douglas Gregorc45c2322009-03-31 00:43:58 +000055// actually refer to a template.
56template<typename T>
57struct TestA {
58 typedef typename N::template B<T>::type type; // xpected-error{{'B' following the 'template' keyword does not refer to a template}}
59 // FIXME: should show what B *does* refer to.
60};
61#endif