// Origin: PR c++/42824 // { dg-do compile } template class int_ { }; template class Unit { public: Unit(const Unit& other) {} }; template class Quan { public: Quan(void) {} template Quan(double value, Unit unit) {} }; typedef Quan<0> Scalar; template class hlp { public: typedef Quan type; }; class Mtrl { public: template struct AssoType { typedef typename hlp::type type; }; }; template class Eval { public: Eval(const T& object){} template void eval() { eval (int_<0>()); } private: template struct Wrap {}; template void value(Wrap >) {} template void value(Wrap) {} template void eval(int_<0>) { typedef typename T::template AssoType::type Type; value(Wrap()); } }; class Foo { public: static void eval(const Mtrl& mtrl) { Eval h(mtrl); h.eval<0> (); } };