Merge -r 127928:132243 from trunk
[official-gcc.git] / gcc / testsuite / g++.dg / opt / inline14.C
blob8d2a5d4bb28d2286ca212a062484d68939aa8d8e
1 // PR middle-end/34018
2 // { dg-do compile }
3 // { dg-options "-O1" }
5 template <typename E, unsigned long N>
6 struct A
8   typedef E F;
9   E elems[N];
10   A () {}
11   E *begin () { return elems; }
12   const E *begin () const { return elems; }
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   }
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)
26   E3 *r = a3 + sz;
27   for (;a3 != r; a1++, a3++)
28     *a3 = *a1 - a2;
31 template<typename E, unsigned long N>
32 inline A<E, N>
33 operator- (A<E, N> const& a1, E const& a2)
35   typedef A<E, N> G;
36   G a3;
37   bar (a1.begin (), a2, a3.begin (), N);
38   return a3;
41 struct B
43   B (A<unsigned long, 3> const &m) : n (m - static_cast<unsigned long>(1)) {}
44   A<unsigned long, 3> n;
47 void
48 foo ()
50   B t (A<unsigned long, 3> (0,0,0));