1 /* { dg-do run } */ 2 /* { dg-options "-std=c++0x -fno-tree-forwprop" } */ 3 4 typedef __SIZE_TYPE__ size_t; 5 6 template < typename > struct remove_reference; 7 template < typename _Tp > struct remove_reference <_Tp & > 8 { 9 typedef _Tp type; 10 }; 11 template < typename _Tp > typename remove_reference < _Tp >::type && 12 move (_Tp && __t) 13 { 14 return static_cast < typename remove_reference < _Tp >::type && >(__t); 15 } 16 17 template < typename _Tp > void 18 stdswap (_Tp & __a, _Tp & __b) 19 { 20 _Tp __tmp (__a); 21 __a = (__b); 22 __b = (__tmp); 23 } 24 25 struct _Deque_iterator 26 { 27 int *_M_cur; 28 int *_M_first; 29 int *_M_last; 30 int **_M_node; 31 }; 32 33 static 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 39 struct 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 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 } 56 57 int **_M_map; 58 size_t _M_map_size; 59 _Deque_iterator _M_start; 60 _Deque_iterator _M_finish; 61 }; 62 63 struct queue 64 { 65 deque c; 66 size_t size () 67 { 68 return c.size (); 69 } 70 }; 71 72 void 73 test01 () 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 82 int 83 main () 84 { 85 test01 (); 86 return 0; 87 } 88 89