1 /* { dg-do compile } */ 2 /* { dg-options "-O2 -fdump-tree-dse2-details -Wno-return-type" } */ 3 4 typedef __SIZE_TYPE__ size_t; 5 extern "C" 6 { 7 extern void *memmove (void *__dest, const void *__src, size_t __n) throw () 8 __attribute__ ((__nonnull__ (1, 2))); 9 } 10 extern void abort () __attribute__ ((__noreturn__)); 11 struct vec_prefix { unsigned m_num; }; 12 struct vl_embed { }; 13 struct vl_ptr { }; 14 struct va_heap { typedef vl_ptr default_layout; }; 15 template < typename T, typename A = va_heap, typename L = typename A::default_layout > struct vec { }; 16 template < typename T, typename A > struct vec < T, A, vl_embed > 17 { 18 unsigned length (void) const { return m_vecpfx. m_num; } 19 bool is_empty (void) const { return m_vecpfx. m_num == 0; } 20 void block_remove (unsigned, unsigned); 21 vec_prefix m_vecpfx; 22 T m_vecdata[1]; 23 }; 24 template < typename T, typename A > inline void vec < T, A, vl_embed >::block_remove (unsigned ix, unsigned len) 25 { 26 T * slot = &m_vecdata[ix]; 27 m_vecpfx.m_num -= len; 28 memmove (slot, slot + len, (m_vecpfx.m_num - ix) * sizeof (T)); 29 } 30 31 template < typename T > struct vec < T, va_heap, vl_ptr > 32 { 33 bool is_empty (void) const { return m_vec ? m_vec-> is_empty () : true; } 34 unsigned length (void) const { return m_vec ? m_vec-> length () : 0; } 35 void block_remove (unsigned, unsigned); 36 vec < T, va_heap, vl_embed > * m_vec; 37 }; 38 template < typename T > inline void vec < T, va_heap, vl_ptr >::block_remove (unsigned ix, unsigned len) 39 { 40 m_vec->block_remove (ix, len); 41 } 42 43 typedef struct _list_node * _list_t; 44 typedef struct _expr expr_def; 45 typedef expr_def * expr_t; 46 typedef _list_t av_set_t; 47 static vec < expr_t > vec_av_set; 48 bool 49 fill_vec_av_set (av_set_t av) 50 { 51 if (vec_av_set.length () > 0) 52 vec_av_set.block_remove (0, vec_av_set.length ()); 53 ((!(vec_av_set.is_empty ())? abort () , 0 : 0)); 54 } 55 56 /* { dg-final { scan-tree-dump-not "Trimming statement .head = -" "dse2" } } */ 57 /* { dg-final { scan-tree-dump-not "mem\[^\r\n\]*, 0\\);" "dse2" } } */ 58