/* { dg-do run } */ /* { dg-require-effective-target lp64 } */ typedef unsigned long size_t; struct tree_base { int code; }; struct tree_decl_minimal { struct tree_base base; const char *name; }; typedef union tree_node { struct tree_base base; struct tree_decl_minimal decl_minimal; } *tree; struct tree_overload { struct tree_base common; tree function; }; typedef struct VEC_tree_base { unsigned num; unsigned alloc; tree vec[1]; } VEC_tree_base; typedef struct VEC_tree_gc { VEC_tree_base base; } VEC_tree_gc; static __inline__ unsigned VEC_tree_base_length (const VEC_tree_base *vec_) { return vec_ ? vec_->num : 0; } static __inline__ int VEC_tree_base_iterate (const VEC_tree_base *vec_, unsigned ix_, tree *ptr) { if (vec_ && ix_ < vec_->num) { *ptr = vec_->vec[ix_]; return 1; } else { *ptr = 0; return 0; } } extern void abort (void); void __attribute__((noinline)) foo (size_t x) { if (x != 18446744073709551614UL) abort (); } void resort_type_method_vec (VEC_tree_gc *method_vec) { int len = (VEC_tree_base_length(((method_vec) ? &(method_vec)->base : 0))); size_t slot; tree fn; for (slot = 2; (VEC_tree_base_iterate(((method_vec) ? &(method_vec)->base : 0),slot,&(fn))); ++slot) if (!(((((((fn)->base.code) == 225) ? (((struct tree_overload*)(fn))->function) : (fn)))->decl_minimal.name))) break; if (len - slot > 1) foo (len - slot); } int main () { resort_type_method_vec ((void *)0); return 0; }