1extern void abort (void);
2
3void __attribute__((noinline,noreturn))
4vec_assert_fail (void)
5{
6    abort ();
7}
8
9struct ggc_root_tab {
10    void *base;
11};
12
13typedef struct deferred_access_check {} VEC_deferred_access_check_gc;
14
15typedef struct deferred_access {
16    VEC_deferred_access_check_gc* deferred_access_checks;
17    int deferring_access_checks_kind;
18} deferred_access;
19
20typedef struct VEC_deferred_access_base {
21    unsigned num;
22    deferred_access vec[1];
23} VEC_deferred_access_base;
24
25static __inline__ deferred_access *
26VEC_deferred_access_base_last (VEC_deferred_access_base *vec_)
27{
28    (void)((vec_ && vec_->num) ? 0 : (vec_assert_fail (), 0));
29    return &vec_->vec[vec_->num - 1];
30}
31
32static __inline__  void
33VEC_deferred_access_base_pop (VEC_deferred_access_base *vec_)
34{
35    (void)((vec_->num) ? 0 : (vec_assert_fail (), 0));
36    --vec_->num;
37}
38
39void __attribute__((noinline))
40perform_access_checks (VEC_deferred_access_check_gc* p)
41{
42    abort ();
43}
44
45typedef struct VEC_deferred_access_gc {
46    VEC_deferred_access_base base;
47} VEC_deferred_access_gc;
48
49static VEC_deferred_access_gc *deferred_access_stack;
50static unsigned deferred_access_no_check;
51
52const struct ggc_root_tab gt_pch_rs_gt_cp_semantics_h[] = {
53    {
54	&deferred_access_no_check
55    }
56};
57
58void __attribute__((noinline)) pop_to_parent_deferring_access_checks (void)
59{
60    if (deferred_access_no_check)
61	deferred_access_no_check--;
62    else
63    {
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);
71    }
72}
73
74int main()
75{
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;
81}
82