From: Volker Reichelt Date: Tue, 11 Oct 2005 00:39:26 +0000 (+0000) Subject: backport: re PR c++/17618 (ICE in cp_convert_to_pointer, at cp/cvt.c:83) X-Git-Tag: releases/gcc-3.4.5~147 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d76530693b5ddcb7aa99ee1e157d076594e7cb4e;p=thirdparty%2Fgcc.git backport: re PR c++/17618 (ICE in cp_convert_to_pointer, at cp/cvt.c:83) Backport: 2004-09-23 Andrew Pinski PR c++/17618 * cvt.c (cp_convert_to_pointer): Return early when the type is an error_mark_node. 2004-05-22 Roger Sayle * name-lookup.c (check_for_out_of_scope_variable): Avoid ICE by returning when TREE_TYPE is error_mark_node. * typeck.c (require_complete_type): Return error_mark_node if value's type is an error_mark_node. 2004-11-02 Mark Mitchell PR c++/18177 * typeck.c (build_const_cast): Use error_operand_p. 2004-09-23 Andrew Pinski PR c++/17618 * g++.dg/lookup/crash5.C: New test. 2004-05-22 Wolfgang Bangerth Roger Sayle * g++.dg/lookup/forscope2.C: New test case. 2004-11-02 Mark Mitchell PR c++/18177 * g++.dg/conversion/const3.C: New test. From-SVN: r105210 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ef4a00b8ec9f..fcc35668a8eb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,21 @@ +2005-10-11 Volker Reichelt + + Backport: + 2004-09-23 Andrew Pinski + PR c++/17618 + * cvt.c (cp_convert_to_pointer): Return early when the type is + an error_mark_node. + + 2004-05-22 Roger Sayle + * name-lookup.c (check_for_out_of_scope_variable): Avoid ICE by + returning when TREE_TYPE is error_mark_node. + * typeck.c (require_complete_type): Return error_mark_node if + value's type is an error_mark_node. + + 2004-11-02 Mark Mitchell + PR c++/18177 + * typeck.c (build_const_cast): Use error_operand_p. + 2005-10-06 Volker Reichelt * call.c (resolve_args): Remove redundant test. diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index 8276451cb10c..2071c260299c 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -79,6 +79,8 @@ cp_convert_to_pointer (tree type, tree expr, bool force) tree intype = TREE_TYPE (expr); enum tree_code form; tree rval; + if (intype == error_mark_node) + return error_mark_node; if (IS_AGGR_TYPE (intype)) { diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 71894db10583..7cefe2e661cf 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -1179,6 +1179,10 @@ check_for_out_of_scope_variable (tree decl) return decl; DECL_ERROR_REPORTED (decl) = 1; + + if (TREE_TYPE (decl) == error_mark_node) + return decl; + if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl))) { error ("name lookup of `%D' changed for new ISO `for' scoping", diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 50e2ea9e52b6..b13fb857d695 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -95,6 +95,9 @@ require_complete_type (tree value) else type = TREE_TYPE (value); + if (type == error_mark_node) + return error_mark_node; + /* First, detect a valid value with a complete type. */ if (COMPLETE_TYPE_P (type)) return value; @@ -4794,7 +4797,7 @@ build_const_cast (tree type, tree expr) { tree intype; - if (type == error_mark_node || expr == error_mark_node) + if (type == error_mark_node || error_operand_p (expr)) return error_mark_node; if (processing_template_decl) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f24a7c624d8d..3fc5ef8d2e18 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,18 @@ +2005-10-11 Volker Reichelt + + Backport: + 2004-09-23 Andrew Pinski + PR c++/17618 + * g++.dg/lookup/crash5.C: New test. + + 2004-05-22 Wolfgang Bangerth + Roger Sayle + * g++.dg/lookup/forscope2.C: New test case. + + 2004-11-02 Mark Mitchell + PR c++/18177 + * g++.dg/conversion/const3.C: New test. + 2005-10-08 Janis Johnson PR debug/24267