From: froydnj Date: Tue, 1 Jun 2010 19:33:57 +0000 (+0000) Subject: * typeck2.c (build_x_arrow): Make types_memoized a VEC. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c672385204109cfca73b6225cc2ec370b43d3a26;p=thirdparty%2Fgcc.git * typeck2.c (build_x_arrow): Make types_memoized a VEC. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@160119 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b7d3e2d6b0ec..594431300d48 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2010-06-01 Nathan Froyd + + * typeck2.c (build_x_arrow): Make types_memoized a VEC. + 2010-06-01 Arnaud Charlet Matthew Gingell diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index e512272abb70..489d3f8cf838 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -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; }