blob: 3adabcf9348a888a0159f2a2150b428d3d01a295 [file] [log] [blame]
Douglas Gregorf187420f2009-06-17 23:37:01 +00001// RUN: clang-cc -fsyntax-only -verify %s
Douglas Gregorfdca4a72009-03-27 04:21:56 +00002class A;
3
4class S {
5public:
6 template<typename T> struct A {
7 struct Nested {
8 typedef T type;
9 };
10 };
11};
12
13int i;
14S::A<int>::Nested::type *ip = &i;
15
Douglas Gregora3dff8e2009-08-24 23:03:25 +000016template<typename T>
Douglas Gregor1d5e9f92009-08-25 17:23:04 +000017struct Outer {
18 template<typename U>
19 class Inner0;
Douglas Gregora3dff8e2009-08-24 23:03:25 +000020
21 template<typename U>
Douglas Gregor1d5e9f92009-08-25 17:23:04 +000022 class Inner1 {
23 struct ReallyInner;
24
25 T foo(U);
26 template<typename V> T bar(V);
Douglas Gregore861bac2009-08-25 22:51:20 +000027 template<typename V> T* bar(V);
Douglas Gregora3dff8e2009-08-24 23:03:25 +000028 };
29};
30
Douglas Gregor1d5e9f92009-08-25 17:23:04 +000031template<typename X>
32template<typename Y>
33class Outer<X>::Inner0 {
34public:
35 void f(X, Y);
36};
Douglas Gregora3dff8e2009-08-24 23:03:25 +000037
Douglas Gregor1d5e9f92009-08-25 17:23:04 +000038template<typename X>
39template<typename Y>
40void Outer<X>::Inner0<Y>::f(X, Y) {
41}
42
43template<typename X>
44template<typename Y>
45struct Outer<X>::Inner1<Y>::ReallyInner {
46 void g(X, Y);
47};
48
49template<typename X>
50template<typename Y>
51void Outer<X>::Inner1<Y>::ReallyInner::g(X, Y) {
52}
53
54template<typename X>
55template<typename Y>
56X Outer<X>::Inner1<Y>::foo(Y) {
57 return X();
58}
59
60template<typename X>
61template<typename Y>
62template<typename Z>
63X Outer<X>::Inner1<Y>::bar(Z) {
64 return X();
65}
Douglas Gregore861bac2009-08-25 22:51:20 +000066
67template<typename X>
68template<typename Y>
69template<typename Z>
70X* Outer<X>::Inner1<Y>::bar(Z) {
71 return 0;
72}