aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Froyd <froydnj@codesourcery.com>2010-06-17 17:26:28 +0000
committerNathan Froyd <froydnj@gcc.gnu.org>2010-06-17 17:26:28 +0000
commitbfdb7b700a3ff86230205f9d5d641fb480387d1d (patch)
tree2a8dc87125235ab53b2b22e782700dd34010cb61
parent3a6206615ecc75936dfa4f548a9cdd8597173c4b (diff)
downloadgcc-bfdb7b700a3ff86230205f9d5d641fb480387d1d.zip
gcc-bfdb7b700a3ff86230205f9d5d641fb480387d1d.tar.gz
gcc-bfdb7b700a3ff86230205f9d5d641fb480387d1d.tar.bz2
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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/name-lookup.c21
-rw-r--r--gcc/cp/typeck2.c14
-rw-r--r--gcc/tree.c13
-rw-r--r--gcc/tree.h1
6 files changed, 46 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 79e47f5..2f8c80c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 45ddad5..2d98901 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index af6829f..4e40e3b 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -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);
}
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index 2cc3986..3d48c22 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -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;
diff --git a/gcc/tree.c b/gcc/tree.c
index 3c1a878..0922ab5 100644
--- a/gcc/tree.c
+++ b/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. */
diff --git a/gcc/tree.h b/gcc/tree.h
index 1a2ac3a..0d8eefa 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -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);