// PR c++/13950, DR 176 template <class T> struct Base { }; // { dg-message "" } candidate struct D1: Base<void> { D1::Base* p1; D1::Base<double>* p2; Base *p3; Base<double>* p4; }; struct D2: Base<void>, Base<void*> { D2::Base* p1; // { dg-error "" } D2::Base<double>* p2; Base *p3; // { dg-error "" } Base<double>* p4; }; template <class T> struct D3: Base<T> { typename D3::Base* p1; typename D3::template Base<double>* p2; }; template struct D3<void>; template <class T> struct D4: Base<T>, Base<T*> { typename D4::Base* p1; // { dg-error "" } typename D4::template Base<double>* p2; }; template struct D4<void>; // { dg-message "required" }