1/* { dg-do run { target c++11 } } */ 2/* { dg-options "-fno-tree-forwprop" } */ 3 4typedef __SIZE_TYPE__ size_t; 5 6template < typename > struct remove_reference; 7template < typename _Tp > struct remove_reference <_Tp & > 8{ 9 typedef _Tp type; 10}; 11template < typename _Tp > typename remove_reference < _Tp >::type && 12move (_Tp && __t) 13{ 14 return static_cast < typename remove_reference < _Tp >::type && >(__t); 15} 16 17template < typename _Tp > void 18stdswap (_Tp & __a, _Tp & __b) 19{ 20 _Tp __tmp (__a); 21 __a = (__b); 22 __b = (__tmp); 23} 24 25struct _Deque_iterator 26{ 27 int *_M_cur; 28 int *_M_first; 29 int *_M_last; 30 int **_M_node; 31}; 32 33static inline int operatorMIN (_Deque_iterator & __x, _Deque_iterator & __y) 34{ 35 return sizeof (int) * (__x._M_node - __y._M_node - 1) 36 + (__x._M_cur - __x._M_first) + (__y._M_last - __y._M_cur); 37} 38 39struct deque 40{ 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 } 50 51deque (): 52 _M_map (), _M_map_size (), _M_start (), _M_finish () 53 { 54 _M_start._M_last = _M_start._M_first + sizeof (int); 55 } 56 57 int **_M_map; 58 size_t _M_map_size; 59 _Deque_iterator _M_start; 60 _Deque_iterator _M_finish; 61}; 62 63struct queue 64{ 65 deque c; 66 size_t size () 67 { 68 return c.size (); 69 } 70}; 71 72void 73test01 () 74{ 75 queue a, b; 76 ++a.c._M_finish._M_cur; 77 b = move (a); 78 if (!b.size ()) 79 __builtin_abort (); 80} 81 82main () 83{ 84 test01 (); 85} 86 87