diff options
author | Patrick Palka <patrick@parcs.ath.cx> | 2014-03-31 20:48:33 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-03-31 20:48:33 -0400 |
commit | 75d850f3681a4f907b43983936db7f28a2ec230d (patch) | |
tree | 830660eae8355c31ce7b0fcf6569c8b5bbd927b3 | |
parent | 3020dc6e31cc701e5e19b4d680271b9f84437c93 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C | 11 |
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" } |