1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 23e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 33e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith// Examples from CWG1056. 43e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithnamespace Example1 { 53e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith template<class T> struct A; 63e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith template<class T> using B = A<T>; 73e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 83e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith template<class T> struct A { 93e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith struct C {}; 103e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith B<T>::C bc; // ok, B<T> is the current instantiation. 113e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith }; 123e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 133e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith template<class T> struct A<A<T>> { 143e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith struct C {}; 153e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith B<B<T>>::C bc; // ok, B<B<T>> is the current instantiation. 163e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith }; 173e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 183e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith template<class T> struct A<A<A<T>>> { 193e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith struct C {}; 203e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith B<B<T>>::C bc; // expected-error {{missing 'typename'}} 213e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith }; 223e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 233e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 243e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithnamespace Example2 { 253e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith template<class T> struct A { 263e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith void g(); 273e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith }; 283e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith template<class T> using B = A<T>; 293e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith template<class T> void B<T>::g() {} // ok. 303e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 31