+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.
+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
{
tree name;
VEC(tree,gc) *args;
- tree namespaces;
- tree classes;
+ VEC(tree,gc) *namespaces;
+ VEC(tree,gc) *classes;
tree functions;
};
{
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;
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)))
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);
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);
}
/*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;
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. */
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);