Hi! Delayed folding caused following regression where we no longer warn about returning reference to local variable.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2016-11-24 Jakub Jelinek <ja...@redhat.com> PR c++/77591 * typeck.c (maybe_warn_about_returning_address_of_local): Optimize whats_returned through fold_for_warn. * g++.dg/cpp1y/pr77591.C: New test. --- gcc/cp/typeck.c.jj 2016-11-15 09:57:00.000000000 +0100 +++ gcc/cp/typeck.c 2016-11-24 11:37:30.732109019 +0100 @@ -8612,7 +8612,7 @@ static bool maybe_warn_about_returning_address_of_local (tree retval) { tree valtype = TREE_TYPE (DECL_RESULT (current_function_decl)); - tree whats_returned = retval; + tree whats_returned = fold_for_warn (retval); for (;;) { --- gcc/testsuite/g++.dg/cpp1y/pr77591.C.jj 2016-11-24 11:41:03.867436090 +0100 +++ gcc/testsuite/g++.dg/cpp1y/pr77591.C 2016-11-24 11:42:04.428676591 +0100 @@ -0,0 +1,19 @@ +// PR c++/77591 +// { dg-do compile { target c++14 } } +// { dg-options "-O0 -Wreturn-local-addr" } + +class A { }; + +decltype(auto) +foo () +{ + A c; // { dg-warning "reference to local variable 'c' returned" } + return (c); +} + +decltype(auto) +bar () +{ + A c; // { dg-warning "reference to local variable 'c' returned" } + return 1==1 ? c : c; +} Jakub