blob: 05ab3e9c1bf9b6f33641ccc9270eb589c783be9b [file] [log] [blame]
Douglas Gregorc19ee3e2009-06-17 23:37:01 +00001// RUN: clang-cc -fsyntax-only -verify %s
Douglas Gregor551f48c2009-03-27 04:21:56 +00002
3class A;
4
5class S {
6public:
7 template<typename T> struct A {
8 struct Nested {
9 typedef T type;
10 };
11 };
12};
13
14int i;
15S::A<int>::Nested::type *ip = &i;
16
Douglas Gregorc3058332009-08-24 23:03:25 +000017template<typename T>
Douglas Gregor05396e22009-08-25 17:23:04 +000018struct Outer {
19 template<typename U>
20 class Inner0;
Douglas Gregorc3058332009-08-24 23:03:25 +000021
22 template<typename U>
Douglas Gregor05396e22009-08-25 17:23:04 +000023 class Inner1 {
24 struct ReallyInner;
25
26 T foo(U);
27 template<typename V> T bar(V);
Douglas Gregorc3058332009-08-24 23:03:25 +000028 };
29};
30
Douglas Gregor05396e22009-08-25 17:23:04 +000031template<typename X>
32template<typename Y>
33class Outer<X>::Inner0 {
34public:
35 void f(X, Y);
36};
Douglas Gregorc3058332009-08-24 23:03:25 +000037
Douglas Gregor05396e22009-08-25 17:23:04 +000038#if 0
39// FIXME: These don't parse properly because we can't handle the template-name
40// "Inner0" or "Inner1" after the dependent type Outer<X>.
41template<typename X>
42template<typename Y>
43void Outer<X>::Inner0<Y>::f(X, Y) {
44}
45
46template<typename X>
47template<typename Y>
48struct Outer<X>::Inner1<Y>::ReallyInner {
49 void g(X, Y);
50};
51
52template<typename X>
53template<typename Y>
54void Outer<X>::Inner1<Y>::ReallyInner::g(X, Y) {
55}
56
57template<typename X>
58template<typename Y>
59X Outer<X>::Inner1<Y>::foo(Y) {
60 return X();
61}
62
63template<typename X>
64template<typename Y>
65template<typename Z>
66X Outer<X>::Inner1<Y>::bar(Z) {
67 return X();
68}
69#endif