tree.h (vec_member): Declare.
authorNathan Froyd <froydnj@codesourcery.com>
Thu, 17 Jun 2010 17:26:28 +0000 (17:26 +0000)
committerNathan Froyd <froydnj@gcc.gnu.org>
Thu, 17 Jun 2010 17:26:28 +0000 (17:26 +0000)
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

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/cp/typeck2.c
gcc/tree.c
gcc/tree.h

index 79e47f50d75f7480a582863122e2374efd10e701..2f8c80ceb269245787fb7b18571a3b4fe5595395 100644 (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.
index 45ddad56514d474519ddde0f502d10707a5e154b..2d989016fd392f2e7955e9b87b903629c995e51f 100644 (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
index af6829fc3bdf632045116a0789bca8e162bc3667..4e40e3b555ad50945075437e7a1d4f0f1d651d33 100644 (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);
 }
index 2cc398628975369cc02fef7f85d5fd04b94f2255..3d48c22faab4575a3ee6358a5ad18498013ba2b4 100644 (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;
index 3c1a8782cbbdd6dc4841726aec7a9928897c8e6f..0922ab5b915dcc259a6579cdaff9dc3d43f3c1be 100644 (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.  */
 
index 1a2ac3a06f020e1211114b8be1687ffee6a3b11d..0d8eefaedef86fac5b6fa001a5327e56701c8f33 100644 (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);