diff options
author | Nathan Froyd <froydnj@codesourcery.com> | 2010-08-08 02:14:07 +0000 |
---|---|---|
committer | Nathan Froyd <froydnj@gcc.gnu.org> | 2010-08-08 02:14:07 +0000 |
commit | 4d2fb7695429f6003e4038dbbb786e0eac5d64c0 (patch) | |
tree | ec0f33939d736e4820c0acb516a046ec590e7857 /gcc/cp | |
parent | daf30b2fd060396c23f5b190dc786824024c70e9 (diff) | |
download | gcc-4d2fb7695429f6003e4038dbbb786e0eac5d64c0.zip gcc-4d2fb7695429f6003e4038dbbb786e0eac5d64c0.tar.gz gcc-4d2fb7695429f6003e4038dbbb786e0eac5d64c0.tar.bz2 |
name-lookup.h (cp_label_binding): Declare.
* name-lookup.h (cp_label_binding): Declare. Declare a VEC type
containing it.
(cp_binding_level): Convert shadowed_labels and dead_vars_from_for
fields to VECs.
* decl.c (poplevel): Adjust for type changes.
(declare_local_label): Likewise.
From-SVN: r162991
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/decl.c | 37 | ||||
-rw-r--r-- | gcc/cp/name-lookup.h | 22 |
3 files changed, 45 insertions, 23 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b4eea19..25a45374 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2010-08-07 Nathan Froyd <froydnj@codesourcery.com> + + * name-lookup.h (cp_label_binding): Declare. Declare a VEC type + containing it. + (cp_binding_level): Convert shadowed_labels and dead_vars_from_for + fields to VECs. + * decl.c (poplevel): Adjust for type changes. + (declare_local_label): Likewise. + 2010-08-06 Jason Merrill <jason@redhat.com> * typeck.c (complete_type_or_maybe_complain): Split out from... diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 4e4a277..198921f 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -543,6 +543,8 @@ poplevel (int keep, int reverse, int functionbody) tree decl; int leaving_for_scope; scope_kind kind; + unsigned ix; + cp_label_binding *label_bind; timevar_push (TV_NAME_LOOKUP); restart: @@ -687,10 +689,9 @@ poplevel (int keep, int reverse, int functionbody) /* Add it to the list of dead variables in the next outermost binding to that we can remove these when we leave that binding. */ - current_binding_level->level_chain->dead_vars_from_for - = tree_cons (NULL_TREE, link, - current_binding_level->level_chain-> - dead_vars_from_for); + VEC_safe_push (tree, gc, + current_binding_level->level_chain->dead_vars_from_for, + link); /* Although we don't pop the cxx_binding, we do clear its SCOPE since the scope is going away now. */ @@ -719,9 +720,10 @@ poplevel (int keep, int reverse, int functionbody) /* Remove declarations for any `for' variables from inner scopes that we kept around. */ - for (link = current_binding_level->dead_vars_from_for; - link; link = TREE_CHAIN (link)) - pop_binding (DECL_NAME (TREE_VALUE (link)), TREE_VALUE (link)); + for (ix = VEC_length (tree, current_binding_level->dead_vars_from_for) - 1; + VEC_iterate (tree, current_binding_level->dead_vars_from_for, ix, decl); + ix--) + pop_binding (DECL_NAME (decl), decl); /* Restore the IDENTIFIER_TYPE_VALUEs. */ for (link = current_binding_level->type_shadowed; @@ -729,10 +731,12 @@ poplevel (int keep, int reverse, int functionbody) SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (link), TREE_VALUE (link)); /* Restore the IDENTIFIER_LABEL_VALUEs for local labels. */ - for (link = current_binding_level->shadowed_labels; - link; - link = TREE_CHAIN (link)) - pop_local_label (TREE_VALUE (link), TREE_PURPOSE (link)); + for (ix = VEC_length (cp_label_binding, + current_binding_level->shadowed_labels) - 1; + VEC_iterate (cp_label_binding, current_binding_level->shadowed_labels, + ix, label_bind); + ix--) + pop_local_label (label_bind->label, label_bind->prev_value); /* There may be OVERLOADs (wrapped in TREE_LISTs) on the BLOCK_VARs list if a `using' declaration put them there. The debugging @@ -2508,16 +2512,17 @@ lookup_label (tree id) tree declare_local_label (tree id) { - tree decl, shadow; + tree decl; + cp_label_binding *bind; /* Add a new entry to the SHADOWED_LABELS list so that when we leave this scope we can restore the old value of IDENTIFIER_TYPE_VALUE. */ - shadow = tree_cons (IDENTIFIER_LABEL_VALUE (id), NULL_TREE, - current_binding_level->shadowed_labels); - current_binding_level->shadowed_labels = shadow; + bind = VEC_safe_push (cp_label_binding, gc, + current_binding_level->shadowed_labels, NULL); + bind->prev_value = IDENTIFIER_LABEL_VALUE (id); decl = make_label_decl (id, /*local_p=*/1); - TREE_VALUE (shadow) = decl; + bind->label = decl; return decl; } diff --git a/gcc/cp/name-lookup.h b/gcc/cp/name-lookup.h index e5190eb..6375637 100644 --- a/gcc/cp/name-lookup.h +++ b/gcc/cp/name-lookup.h @@ -148,6 +148,16 @@ typedef struct GTY(()) cp_class_binding { DEF_VEC_O(cp_class_binding); DEF_VEC_ALLOC_O(cp_class_binding,gc); +typedef struct GTY(()) cp_label_binding { + /* The bound LABEL_DECL. */ + tree label; + /* The previous IDENTIFIER_LABEL_VALUE. */ + tree prev_value; +} cp_label_binding; + +DEF_VEC_O(cp_label_binding); +DEF_VEC_ALLOC_O(cp_label_binding,gc); + /* For each binding contour we allocate a binding_level structure which records the names defined in that contour. Contours include: @@ -206,10 +216,9 @@ struct GTY(()) cp_binding_level { the class. */ tree type_shadowed; - /* A TREE_LIST. Each TREE_VALUE is the LABEL_DECL for a local - label in this scope. The TREE_PURPOSE is the previous value of - the IDENTIFIER_LABEL VALUE. */ - tree shadowed_labels; + /* Similar to class_shadowed, but for IDENTIFIER_LABEL_VALUE, and + used for all binding levels. */ + VEC(cp_label_binding,gc) *shadowed_labels; /* For each level (except not the global one), a chain of BLOCK nodes for all the levels @@ -225,9 +234,8 @@ struct GTY(()) cp_binding_level { /* List of VAR_DECLS saved from a previous for statement. These would be dead in ISO-conforming code, but might - be referenced in ARM-era code. These are stored in a - TREE_LIST; the TREE_VALUE is the actual declaration. */ - tree dead_vars_from_for; + be referenced in ARM-era code. */ + VEC(tree,gc) *dead_vars_from_for; /* STATEMENT_LIST for statements in this binding contour. Only used at present for SK_CLEANUP temporary bindings. */ |