Merge from branches/gcc-4_8-branch up to rev 207411.
[official-gcc.git] / gcc-4_8-branch / gcc / testsuite / g++.dg / torture / pr49770.C
blob7eac9e0d9bbb11c81b8a8765dcbdf2d4a8644b24
1 /* { dg-do run } */
2 /* { dg-options "-std=c++0x -fno-tree-forwprop" } */
4 typedef __SIZE_TYPE__ size_t;
6 template < typename > struct remove_reference;
7 template < typename _Tp > struct remove_reference <_Tp & >
9   typedef _Tp type;
11 template < typename _Tp > typename remove_reference < _Tp >::type &&
12 move (_Tp && __t)
14   return static_cast < typename remove_reference < _Tp >::type && >(__t);
17 template < typename _Tp > void
18 stdswap (_Tp & __a, _Tp & __b)
20   _Tp __tmp (__a);
21   __a = (__b);
22   __b = (__tmp);
25 struct _Deque_iterator
27   int *_M_cur;
28   int *_M_first;
29   int *_M_last;
30   int **_M_node;
33 static inline int operatorMIN (_Deque_iterator & __x, _Deque_iterator & __y)
35   return sizeof (int) * (__x._M_node - __y._M_node - 1)
36     + (__x._M_cur - __x._M_first) + (__y._M_last - __y._M_cur);
39 struct deque
41   deque & operator = (deque && __x)
42   {
43     stdswap (_M_finish, __x._M_finish);
44     return *this;
45   }
46   size_t size ()
47   {
48     return operatorMIN (_M_finish, _M_start);
49   }
51 deque ():
52   _M_map (), _M_map_size (), _M_start (), _M_finish ()
53   {
54     _M_start._M_last = _M_start._M_first + sizeof (int);
55   }
57   int **_M_map;
58   size_t _M_map_size;
59   _Deque_iterator _M_start;
60   _Deque_iterator _M_finish;
63 struct queue
65   deque c;
66   size_t size ()
67   {
68     return c.size ();
69   }
72 void
73 test01 ()
75   queue a, b;
76   ++a.c._M_finish._M_cur;
77   b = move (a);
78   if (!b.size ())
79     __builtin_abort ();
82 main ()
84   test01 ();