111
|
1 // PR middle-end/34018
|
|
2 // { dg-do compile }
|
|
3 // { dg-options "-O1" }
|
|
4
|
|
5 template <typename E, unsigned long N>
|
|
6 struct A
|
|
7 {
|
|
8 typedef E F;
|
|
9 E elems[N];
|
|
10 A () {}
|
|
11 E *begin () { return elems; }
|
|
12 const E *begin () const { return elems; }
|
|
13
|
|
14 explicit A (F const &v0, F const &v1, F const &v2)
|
|
15 {
|
|
16 elems[0] = v0;
|
|
17 elems[1] = v1;
|
|
18 elems[2] = v2;
|
|
19 }
|
|
20 };
|
|
21
|
|
22 template <typename E1, typename E2, typename E3>
|
|
23 inline void
|
|
24 bar (const E1 *a1, E2 const &a2, E3 *a3, unsigned long const &sz)
|
|
25 {
|
|
26 E3 *r = a3 + sz;
|
|
27 for (;a3 != r; a1++, a3++)
|
|
28 *a3 = *a1 - a2;
|
|
29 }
|
|
30
|
|
31 template<typename E, unsigned long N>
|
|
32 inline A<E, N>
|
|
33 operator- (A<E, N> const& a1, E const& a2)
|
|
34 {
|
|
35 typedef A<E, N> G;
|
|
36 G a3;
|
|
37 bar (a1.begin (), a2, a3.begin (), N);
|
|
38 return a3;
|
|
39 }
|
|
40
|
|
41 struct B
|
|
42 {
|
|
43 B (A<unsigned long, 3> const &m) : n (m - static_cast<unsigned long>(1)) {}
|
|
44 A<unsigned long, 3> n;
|
|
45 };
|
|
46
|
|
47 void
|
|
48 foo ()
|
|
49 {
|
|
50 B t (A<unsigned long, 3> (0,0,0));
|
|
51 }
|