1// { dg-do assemble } 2 3template < class T, template <class> class E1, template <class> class E2 > 4struct Add { 5 Add(const E1<T>& e1, const E2<T>& e2) {} 6}; 7 8 9template < class T, template <class> class E1, template <class> class E2 > 10struct Mul { 11 Mul(const E1<T>& e1, const E2<T>& e2) {} 12}; 13 14 15template < class T > 16struct Lit { 17 Lit(const T& t) {} 18}; 19 20 21template < class T > 22struct Id { 23 Add < T, ::Id, Lit > operator+(const T& t) const { 24 return Add < T, ::Id, Lit >(*this, Lit<T>(t)); 25 } 26 27 Mul < T, ::Id, Lit > operator*(const T& t) const { 28 return Mul < T, ::Id, Lit >(*this, Lit<T>(t)); 29 } 30}; 31