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:
parent
3a6206615e
commit
bfdb7b700a
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
13
gcc/tree.c
13
gcc/tree.c
@ -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. */
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user