From: Volker Reichelt Date: Thu, 1 Sep 2005 15:06:16 +0000 (+0000) Subject: Backport: X-Git-Tag: releases/gcc-3.4.5~222 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=85fce99b18019f9688695c6e64a7c4efccf35a0f;p=thirdparty%2Fgcc.git Backport: 2004-11-25 Mark Mitchell PR c++/18545 * typeck.c (check_return_expr): Robustify. * g++.dg/expr/return1.C: New test. From-SVN: r103732 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e24c72bddd4b..b485511eaf4c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2005-09-01 Volker Reichelt + + Backport: + + 2004-11-25 Mark Mitchell + PR c++/18545 + * typeck.c (check_return_expr): Robustify. + 2005-09-01 Volker Reichelt Backport: diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index e0f6868a6d7e..50e2ea9e52b6 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -6084,6 +6084,15 @@ check_return_expr (tree retval) /* Remember that this function did return a value. */ current_function_returns_value = 1; + /* Check for erroneous operands -- but after giving ourselves a + chance to provide an error about returning a value from a void + function. */ + if (error_operand_p (retval)) + { + current_function_return_value = error_mark_node; + return error_mark_node; + } + /* Only operator new(...) throw(), can return NULL [expr.new/13]. */ if ((DECL_OVERLOADED_OPERATOR_P (current_function_decl) == NEW_EXPR || DECL_OVERLOADED_OPERATOR_P (current_function_decl) == VEC_NEW_EXPR) @@ -6140,8 +6149,8 @@ check_return_expr (tree retval) /* We don't need to do any conversions when there's nothing being returned. */ - if (!retval || retval == error_mark_node) - return retval; + if (!retval) + return NULL_TREE; /* Do any required conversions. */ if (retval == result || DECL_CONSTRUCTOR_P (current_function_decl)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e4356b2faa96..0bd2505f7734 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2005-09-01 Volker Reichelt + + Backport: + + 2004-11-25 Mark Mitchell + PR c++/18545 + * g++.dg/expr/return1.C: New test. + 2005-09-01 Volker Reichelt Backport: diff --git a/gcc/testsuite/g++.dg/expr/return1.C b/gcc/testsuite/g++.dg/expr/return1.C index 7a64988e4b32..74fb32f192f1 100644 --- a/gcc/testsuite/g++.dg/expr/return1.C +++ b/gcc/testsuite/g++.dg/expr/return1.C @@ -2,8 +2,8 @@ struct A; -A foo() // { dg-error "" } -{ - A a; // { dg-error "" } +A foo() +{ // { dg-error "incomplete" } + A a; // { dg-error "incomplete" } return a; }