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