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