// RUN: clang-cc -fsyntax-only -verify %s class A; class S { public: template struct A { struct Nested { typedef T type; }; }; }; int i; S::A::Nested::type *ip = &i; template struct Outer { template class Inner0; template class Inner1 { struct ReallyInner; T foo(U); template T bar(V); template T* bar(V); static T value1; static U value2; }; }; template template class Outer::Inner0 { public: void f(X, Y); }; template template void Outer::Inner0::f(X, Y) { } template template struct Outer::Inner1::ReallyInner { static Y value3; void g(X, Y); }; template template void Outer::Inner1::ReallyInner::g(X, Y) { } template template X Outer::Inner1::foo(Y) { return X(); } template template template X Outer::Inner1::bar(Z) { return X(); } template template template X* Outer::Inner1::bar(Z) { return 0; } template template X Outer::Inner1::value1 = 0; template template Y Outer::Inner1::value2 = Y(); template template Y Outer::Inner1::ReallyInner::value3 = Y();