aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Palka <patrick@parcs.ath.cx>2014-03-31 20:48:33 -0400
committerJason Merrill <jason@gcc.gnu.org>2014-03-31 20:48:33 -0400
commit75d850f3681a4f907b43983936db7f28a2ec230d (patch)
tree830660eae8355c31ce7b0fcf6569c8b5bbd927b3
parent3020dc6e31cc701e5e19b4d680271b9f84437c93 (diff)
downloadgcc-75d850f3681a4f907b43983936db7f28a2ec230d.zip
gcc-75d850f3681a4f907b43983936db7f28a2ec230d.tar.gz
gcc-75d850f3681a4f907b43983936db7f28a2ec230d.tar.bz2
re PR c++/44859 (missed warning: returning reference to temporary)
PR c++/44859 * typeck.c (maybe_warn_about_returning_address_of_local): Unwrap COMPONENT_REFs and ARRAY_REFs sooner. From-SVN: r208970
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/typeck.c8
-rw-r--r--gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C11
3 files changed, 21 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index aca5f44..553a059 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2014-03-31 Patrick Palka patrick@parcs.ath.cx
+
+ PR c++/44859
+ * typeck.c (maybe_warn_about_returning_address_of_local): Unwrap
+ COMPONENT_REFs and ARRAY_REFs sooner.
+
2014-03-29 Adam Butcher <adam@jessamine.co.uk>
PR c++/60626
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 559f19b5..9a80727 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -8283,6 +8283,10 @@ maybe_warn_about_returning_address_of_local (tree retval)
return;
whats_returned = TREE_OPERAND (whats_returned, 0);
+ while (TREE_CODE (whats_returned) == COMPONENT_REF
+ || TREE_CODE (whats_returned) == ARRAY_REF)
+ whats_returned = TREE_OPERAND (whats_returned, 0);
+
if (TREE_CODE (valtype) == REFERENCE_TYPE)
{
if (TREE_CODE (whats_returned) == AGGR_INIT_EXPR
@@ -8300,10 +8304,6 @@ maybe_warn_about_returning_address_of_local (tree retval)
}
}
- while (TREE_CODE (whats_returned) == COMPONENT_REF
- || TREE_CODE (whats_returned) == ARRAY_REF)
- whats_returned = TREE_OPERAND (whats_returned, 0);
-
if (DECL_P (whats_returned)
&& DECL_NAME (whats_returned)
&& DECL_FUNCTION_SCOPE_P (whats_returned)
diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C b/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C
new file mode 100644
index 0000000..c483601
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C
@@ -0,0 +1,11 @@
+// PR c++/44859
+
+struct Base2 { int m_foo; };
+struct Derived2 : public Base2 {};
+
+const Base2& f8() { return Derived2(); } // { dg-warning "reference to temporary" }
+
+struct foo { };
+struct bar { foo base; };
+
+const foo& f9() { return bar().base; } // { dg-warning "reference to temporary" }