OSDN Git Service

* name-lookup.h (cp_label_binding): Declare. Declare a VEC type
authorfroydnj <froydnj@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 8 Aug 2010 02:14:07 +0000 (02:14 +0000)
committerfroydnj <froydnj@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 8 Aug 2010 02:14:07 +0000 (02:14 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162991 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/name-lookup.h

index b4eea19..25a4537 100644 (file)
@@ -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...
index 4e4a277..198921f 100644 (file)
@@ -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;
 }
index e5190eb..6375637 100644 (file)
@@ -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.  */