1// { dg-do compile }
2// { dg-additional-options "-std=c++11" }
3
4namespace std
5{
6typedef long unsigned size_t;
7template <typename> class complex;
8template <typename _Tp> complex<_Tp> operator+(complex<_Tp>, complex<_Tp>)
9{
10  complex<_Tp> a = 0;
11  a += 0;
12  return a;
13}
14template <> struct complex<double>
15{
16  complex (int __i) : _M_value{ __i } {}
17  int imag ();
18  void operator+=(complex __z) { _M_value = __z.imag (); }
19  _Complex double _M_value;
20};
21}
22class A
23{
24public:
25  A (int);
26  std::complex<double> &operator[](int i) { return data_[i]; }
27  std::complex<double> *data_;
28};
29struct B
30{
31  static std::complex<double>
32  apply (std::complex<double> t1, std::complex<double> t2)
33  {
34    return t1 + t2;
35  }
36};
37template <class T1, class> struct C
38{
39  static void
40  apply (T1 t1, std::complex<double> t2)
41  {
42    t1 = t2;
43  }
44};
45template <class E> class D
46{
47public:
48  E operator()();
49};
50class G : public D<G>
51{
52public:
53  typedef std::complex<double> value_type;
54  value_type operator()(int) { return B::apply (0, 0); }
55};
56template <class E1, class E2> G operator+(D<E1>, D<E2>);
57template <template <class, class> class F, class V, class E>
58void
59indexing_vector_assign (V v, D<E> e)
60{
61  for (int i;; ++i)
62    F<typename V::reference, typename E::value_type>::apply (v (i), e ()(0));
63}
64template <template <class, class> class F, class V, class E>
65void
66vector_assign (V v, D<E> e, int)
67{
68  indexing_vector_assign<F> (v, e);
69}
70template <template <class, class> class F, class V, class E>
71void
72vector_assign (V v, D<E> e)
73{
74  vector_assign<F> (v, e, typename V::storage_category ());
75}
76class H : public D<int>
77{
78public:
79  typedef std::complex<double> &reference;
80  typedef int storage_category;
81  H (int);
82  template <class AE> H (D<AE> ae) : data_ (0)
83  {
84    vector_assign<C> (*this, ae);
85  }
86  A
87  data ()
88  {
89    return data_;
90  }
91  reference operator()(int i) { return data ()[i]; }
92  A data_;
93};
94template <class T1, class V1, class T2, class V2>
95void
96rot (T1, V1 v1, T2, V2 v2)
97{
98  H (v1 + v2);
99}
100template <class, unsigned long> struct F
101{
102  void test ();
103};
104template struct F<H, 3>;
105template <class V, std::size_t N>
106void
107F<V, N>::test ()
108{
109  V b (0), c (0);
110  rot (0, b, 0, c);
111}
112