Merge -r 127928:132243 from trunk
[official-gcc.git] / gcc / testsuite / gcc.c-torture / execute / 20071120-1.c
blobffe51aec847731fe0b93743a0a1c977d0cfb5748
1 extern void abort (void);
3 void __attribute__((noinline,noreturn))
4 vec_assert_fail (void)
6 abort ();
9 struct ggc_root_tab {
10 void *base;
13 typedef struct deferred_access_check {} VEC_deferred_access_check_gc;
15 typedef struct deferred_access {
16 VEC_deferred_access_check_gc* deferred_access_checks;
17 int deferring_access_checks_kind;
18 } deferred_access;
20 typedef struct VEC_deferred_access_base {
21 unsigned num;
22 deferred_access vec[1];
23 } VEC_deferred_access_base;
25 static __inline__ deferred_access *
26 VEC_deferred_access_base_last (VEC_deferred_access_base *vec_)
28 (void)((vec_ && vec_->num) ? 0 : (vec_assert_fail (), 0));
29 return &vec_->vec[vec_->num - 1];
32 static __inline__ void
33 VEC_deferred_access_base_pop (VEC_deferred_access_base *vec_)
35 (void)((vec_->num) ? 0 : (vec_assert_fail (), 0));
36 --vec_->num;
39 void __attribute__((noinline))
40 perform_access_checks (VEC_deferred_access_check_gc* p)
42 abort ();
45 typedef struct VEC_deferred_access_gc {
46 VEC_deferred_access_base base;
47 } VEC_deferred_access_gc;
49 static VEC_deferred_access_gc *deferred_access_stack;
50 static unsigned deferred_access_no_check;
52 const struct ggc_root_tab gt_pch_rs_gt_cp_semantics_h[] = {
54 &deferred_access_no_check
58 void __attribute__((noinline)) pop_to_parent_deferring_access_checks (void)
60 if (deferred_access_no_check)
61 deferred_access_no_check--;
62 else
64 VEC_deferred_access_check_gc *checks;
65 deferred_access *ptr;
66 checks = (VEC_deferred_access_base_last(deferred_access_stack ? &deferred_access_stack->base : 0))->deferred_access_checks;
67 VEC_deferred_access_base_pop(deferred_access_stack ? &deferred_access_stack->base : 0);
68 ptr = VEC_deferred_access_base_last(deferred_access_stack ? &deferred_access_stack->base : 0);
69 if (ptr->deferring_access_checks_kind == 0)
70 perform_access_checks (checks);
74 int main()
76 deferred_access_stack = __builtin_malloc (sizeof(VEC_deferred_access_gc) + sizeof(deferred_access) * 8);
77 deferred_access_stack->base.num = 2;
78 deferred_access_stack->base.vec[0].deferring_access_checks_kind = 1;
79 pop_to_parent_deferring_access_checks ();
80 return 0;