summaryrefslogtreecommitdiff
path: root/gcc/cp/class.c
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2004-07-08 04:32:27 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2004-07-08 04:32:27 +0000
commit89b578be68dd3d91e551c3ba922f054ead36c4e4 (patch)
treeb704620d1b4bd63427c4b884a49c7ece575dd1e4 /gcc/cp/class.c
parentbeed8fc0bb23590fdfa4665c3ad5b3ca7edb17f7 (diff)
downloadgcc-89b578be68dd3d91e551c3ba922f054ead36c4e4.tar.gz
cp-tree.h (saved_scope): Remove x_previous_class_type and x_previous_class_values...
* cp-tree.h (saved_scope): Remove x_previous_class_type and x_previous_class_values; add x_previous_class_level. (previous_class_type): Remove. (previous_class_values): Remove. (previous_class_level): New macro. * class.c (pushclass): Restore the identifier cache more expeditiously. (invalidate_class_lookup_cache): Use vector for class_shadowed and previous_class_values. * decl.c (poplevel): Likewise. * name-lookup.c (cxx_binding_init): New function. (cxx_binding_make): Use it. (push_binding): For a binding in a class level, use a vector of cp_class_binding nodes. (push_binding_level): New function. (begin_scope): Use it. (leave_scope): Do not put class binding levels on the free list. (print_binding_level): Adjust for the fact that class_shadowed is a vector. (poplevel_class): Likewise. (clear_identifier_class_values): Likewise. (push_class_level_binding): Likewise. (set_class_shadows): Remove. (store_binding): New function. (store_class_bindings): New function. (push_to_top_level): Use store_class_bindings as appropriate. (pop_from_top_level): Use previous_class_level, not previous_class_type. * name-lookup.h (cp_class_binding): New type. (cp_binding_level): Use a vector object for class_shadowed. (push_binding_level): Declare. (set_class_shadows): Remove. From-SVN: r84259
Diffstat (limited to 'gcc/cp/class.c')
-rw-r--r--gcc/cp/class.c54
1 files changed, 34 insertions, 20 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index e4117278690..1f3b22a7ddc 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -5486,9 +5486,8 @@ pushclass (tree type)
? access_private_node
: access_public_node);
- if (previous_class_type != NULL_TREE
- && (type != previous_class_type
- || !COMPLETE_TYPE_P (previous_class_type))
+ if (previous_class_level
+ && type != previous_class_level->this_entity
&& current_class_depth == 1)
{
/* Forcibly remove any old class remnants. */
@@ -5500,10 +5499,11 @@ pushclass (tree type)
if (current_class_depth > 1)
clear_identifier_class_values ();
- pushlevel_class ();
-
- if (type != previous_class_type || current_class_depth > 1)
+ if (!previous_class_level
+ || type != previous_class_level->this_entity
+ || current_class_depth > 1)
{
+ pushlevel_class ();
push_class_decls (type);
if (CLASSTYPE_TEMPLATE_INFO (type) && !CLASSTYPE_USE_TEMPLATE (type))
{
@@ -5520,22 +5520,33 @@ pushclass (tree type)
}
else
{
- tree item;
+ cp_class_binding *cb;
+ size_t i;
/* We are re-entering the same class we just left, so we don't
have to search the whole inheritance matrix to find all the
decls to bind again. Instead, we install the cached
class_shadowed list, and walk through it binding names and
setting up IDENTIFIER_TYPE_VALUEs. */
- set_class_shadows (previous_class_values);
- for (item = previous_class_values; item; item = TREE_CHAIN (item))
+ push_binding_level (previous_class_level);
+ class_binding_level = previous_class_level;
+ for (i = 0;
+ (cb = VEC_iterate (cp_class_binding,
+ previous_class_level->class_shadowed,
+ i));
+ ++i)
{
- tree id = TREE_PURPOSE (item);
- tree decl = TREE_TYPE (item);
-
- push_class_binding (id, decl);
- if (TREE_CODE (decl) == TYPE_DECL)
- set_identifier_type_value (id, decl);
+ tree id;
+ tree type_decl;
+
+ id = cb->identifier;
+ cb->base.previous = IDENTIFIER_BINDING (id);
+ IDENTIFIER_BINDING (id) = &cb->base;
+ type_decl = cb->base.value;
+ if (!type_decl || TREE_CODE (type_decl) != TYPE_DECL)
+ type_decl = cb->base.type;
+ if (type_decl && TREE_CODE (type_decl) == TYPE_DECL)
+ set_identifier_type_value (id, type_decl);
}
unuse_fields (type);
}
@@ -5551,14 +5562,17 @@ pushclass (tree type)
void
invalidate_class_lookup_cache (void)
{
- tree t;
+ size_t i;
+ cp_class_binding *cb;
/* The IDENTIFIER_CLASS_VALUEs are no longer valid. */
- for (t = previous_class_values; t; t = TREE_CHAIN (t))
- IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (t)) = NULL_TREE;
+ for (i = 0;
+ (cb = VEC_iterate (cp_class_binding,
+ previous_class_level->class_shadowed, i));
+ ++i)
+ IDENTIFIER_CLASS_VALUE (cb->identifier) = NULL_TREE;
- previous_class_values = NULL_TREE;
- previous_class_type = NULL_TREE;
+ previous_class_level = NULL;
}
/* Get out of the current class scope. If we were in a class scope