From 85fce99b18019f9688695c6e64a7c4efccf35a0f Mon Sep 17 00:00:00 2001 From: Volker Reichelt Date: Thu, 1 Sep 2005 15:06:16 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/typeck.c | 13 +++++++++++-- gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/g++.dg/expr/return1.C | 6 +++--- 4 files changed, 30 insertions(+), 5 deletions(-) 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; } -- 2.47.2