]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* typeck2.c (build_x_arrow): Make types_memoized a VEC.
authorfroydnj <froydnj@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Jun 2010 19:33:57 +0000 (19:33 +0000)
committerfroydnj <froydnj@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Jun 2010 19:33:57 +0000 (19:33 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@160119 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/typeck2.c

index b7d3e2d6b0ec28fb5fae5815686dfede55684b1f..594431300d48f8a13f5e4f955ee9ea3803b9777e 100644 (file)
@@ -1,3 +1,7 @@
+2010-06-01  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * typeck2.c (build_x_arrow): Make types_memoized a VEC.
+
 2010-06-01  Arnaud Charlet  <charlet@adacore.com>
            Matthew Gingell  <gingell@adacore.com>
 
index e512272abb70c60d669697bab56f9ca13382da50..489d3f8cf838887d30c075bc067ba1a8939fe6a4 100644 (file)
@@ -1400,9 +1400,9 @@ tree
 build_x_arrow (tree expr)
 {
   tree orig_expr = expr;
-  tree types_memoized = NULL_TREE;
   tree type = TREE_TYPE (expr);
   tree last_rval = NULL_TREE;
+  VEC(tree,gc) *types_memoized = NULL;
 
   if (type == error_mark_node)
     return error_mark_node;
@@ -1421,19 +1421,20 @@ 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;
 
-         if (value_member (TREE_TYPE (expr), types_memoized))
-           {
-             error ("circular pointer delegation detected");
-             return error_mark_node;
-           }
-         else
-           {
-             types_memoized = tree_cons (NULL_TREE, TREE_TYPE (expr),
-                                         types_memoized);
-           }
+         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;
+             }
+
+         VEC_safe_push (tree, gc, types_memoized, TREE_TYPE (expr));
          last_rval = expr;
        }