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