1 /* { dg-do run } */ 2 /* { dg-require-effective-target lp64 } */ 3 4 typedef unsigned long size_t; 5 struct tree_base 6 { 7 int code; 8 }; 9 struct tree_decl_minimal 10 { 11 struct tree_base base; 12 const char *name; 13 }; 14 typedef union tree_node { 15 struct tree_base base; 16 struct tree_decl_minimal decl_minimal; 17 } *tree; 18 struct tree_overload 19 { 20 struct tree_base common; 21 tree function; 22 }; 23 typedef struct VEC_tree_base { unsigned num; unsigned alloc; tree vec[1]; } VEC_tree_base; 24 typedef struct VEC_tree_gc { VEC_tree_base base; } VEC_tree_gc; VEC_tree_base_length(const VEC_tree_base * vec_)25static __inline__ unsigned VEC_tree_base_length (const VEC_tree_base *vec_) 26 { return vec_ ? vec_->num : 0; } VEC_tree_base_iterate(const VEC_tree_base * vec_,unsigned ix_,tree * ptr)27static __inline__ int VEC_tree_base_iterate (const VEC_tree_base *vec_, unsigned ix_, tree *ptr) 28 { 29 if (vec_ && ix_ < vec_->num) { *ptr = vec_->vec[ix_]; return 1; } else { *ptr = 0; return 0; } 30 } 31 extern void abort (void); foo(size_t x)32void __attribute__((noinline)) foo (size_t x) 33 { 34 if (x != 18446744073709551614UL) 35 abort (); 36 } 37 void resort_type_method_vec(VEC_tree_gc * method_vec)38resort_type_method_vec (VEC_tree_gc *method_vec) 39 { 40 int len = (VEC_tree_base_length(((method_vec) ? &(method_vec)->base : 0))); 41 size_t slot; 42 tree fn; 43 44 for (slot = 2; 45 (VEC_tree_base_iterate(((method_vec) ? &(method_vec)->base : 0),slot,&(fn))); 46 ++slot) 47 if (!(((((((fn)->base.code) == 225) ? (((struct tree_overload*)(fn))->function) : (fn)))->decl_minimal.name))) 48 break; 49 50 if (len - slot > 1) 51 foo (len - slot); 52 } 53 main()54int main () 55 { 56 resort_type_method_vec ((void *)0); 57 return 0; 58 } 59