tree.h (vec_member): Declare.

gcc/
	* tree.h (vec_member): Declare.
	* tree.c (vec_member): Define.

gcc/cp/
	* name-lookup.c (struct arg_lookup): Convert namespaces and
	classes fields to VEC.
	(arg_assoc_namespace): Adjust for new type of namespaces.
	(arg_assoc_class): Adjust for new type of classes.
	(lookup_arg_dependent): Use make_tree_vector and
	release_tree_vector.
	* typeck2.c (build_x_arrow): Use vec_member.

From-SVN: r160936
This commit is contained in:
Nathan Froyd 2010-06-17 17:26:28 +00:00 committed by Nathan Froyd
parent 3a6206615e
commit bfdb7b700a
6 changed files with 46 additions and 18 deletions

View File

@ -1,3 +1,8 @@
2010-06-17 Nathan Froyd <froydnj@codesourcery.com>
* tree.h (vec_member): Declare.
* tree.c (vec_member): Define.
2010-06-17 Richard Guenther <rguenther@suse.de>
* tree-flow-inline.h (array_ref_contains_indirect_ref): Remove.

View File

@ -1,3 +1,13 @@
2010-06-17 Nathan Froyd <froydnj@codesourcery.com>
* name-lookup.c (struct arg_lookup): Convert namespaces and
classes fields to VEC.
(arg_assoc_namespace): Adjust for new type of namespaces.
(arg_assoc_class): Adjust for new type of classes.
(lookup_arg_dependent): Use make_tree_vector and
release_tree_vector.
* typeck2.c (build_x_arrow): Use vec_member.
2010-06-17 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR c++/44486

View File

@ -4588,8 +4588,8 @@ struct arg_lookup
{
tree name;
VEC(tree,gc) *args;
tree namespaces;
tree classes;
VEC(tree,gc) *namespaces;
VEC(tree,gc) *classes;
tree functions;
};
@ -4666,9 +4666,9 @@ arg_assoc_namespace (struct arg_lookup *k, tree scope)
{
tree value;
if (purpose_member (scope, k->namespaces))
return 0;
k->namespaces = tree_cons (scope, NULL_TREE, k->namespaces);
if (vec_member (scope, k->namespaces))
return false;
VEC_safe_push (tree, gc, k->namespaces, scope);
/* Check out our super-users. */
for (value = DECL_NAMESPACE_ASSOCIATIONS (scope); value;
@ -4849,9 +4849,9 @@ arg_assoc_class (struct arg_lookup *k, tree type)
if (!CLASS_TYPE_P (type))
return false;
if (purpose_member (type, k->classes))
if (vec_member (type, k->classes))
return false;
k->classes = tree_cons (type, NULL_TREE, k->classes);
VEC_safe_push (tree, gc, k->classes, type);
if (TYPE_CLASS_SCOPE_P (type)
&& arg_assoc_class_only (k, TYPE_CONTEXT (type)))
@ -5048,14 +5048,14 @@ lookup_arg_dependent (tree name, tree fns, VEC(tree,gc) *args)
k.name = name;
k.args = args;
k.functions = fns;
k.classes = NULL_TREE;
k.classes = make_tree_vector ();
/* We previously performed an optimization here by setting
NAMESPACES to the current namespace when it was safe. However, DR
164 says that namespaces that were already searched in the first
stage of template processing are searched again (potentially
picking up later definitions) in the second stage. */
k.namespaces = NULL_TREE;
k.namespaces = make_tree_vector ();
arg_assoc_args_vec (&k, args);
@ -5069,6 +5069,9 @@ lookup_arg_dependent (tree name, tree fns, VEC(tree,gc) *args)
error (" in call to %qD", name);
fns = error_mark_node;
}
release_tree_vector (k.classes);
release_tree_vector (k.namespaces);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, fns);
}

View File

@ -1418,18 +1418,14 @@ build_x_arrow (tree expr)
/*overloaded_p=*/NULL,
tf_warning_or_error)))
{
tree t;
unsigned ix;
if (expr == error_mark_node)
return error_mark_node;
for (ix = 0; VEC_iterate (tree, types_memoized, ix, t); ix++)
if (TREE_TYPE (expr) == t)
{
error ("circular pointer delegation detected");
return error_mark_node;
}
if (vec_member (TREE_TYPE (expr), types_memoized))
{
error ("circular pointer delegation detected");
return error_mark_node;
}
VEC_safe_push (tree, gc, types_memoized, TREE_TYPE (expr));
last_rval = expr;

View File

@ -1917,6 +1917,19 @@ purpose_member (const_tree elem, tree list)
return NULL_TREE;
}
/* Return true if ELEM is in V. */
bool
vec_member (const_tree elem, VEC(tree,gc) *v)
{
unsigned ix;
tree t;
for (ix = 0; VEC_iterate (tree, v, ix, t); ix++)
if (elem == t)
return true;
return false;
}
/* Returns element number IDX (zero-origin) of chain CHAIN, or
NULL_TREE. */

View File

@ -4094,6 +4094,7 @@ extern bool range_in_array_bounds_p (tree);
extern tree value_member (tree, tree);
extern tree purpose_member (const_tree, tree);
extern bool vec_member (const_tree, VEC(tree,gc) *);
extern tree chain_index (int, tree);
extern int attribute_list_equal (const_tree, const_tree);