// { dg-do assemble } template < class T, template class E1, template class E2 > struct Add { Add(const E1& e1, const E2& e2) {} }; template < class T, template class E1, template class E2 > struct Mul { Mul(const E1& e1, const E2& e2) {} }; template < class T > struct Lit { Lit(const T& t) {} }; template < class T > struct Id { Add < T, ::Id, Lit > operator+(const T& t) const { return Add < T, ::Id, Lit >(*this, Lit(t)); } Mul < T, ::Id, Lit > operator*(const T& t) const { return Mul < T, ::Id, Lit >(*this, Lit(t)); } };