OK.

On Thu, Nov 24, 2016 at 4:47 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> 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

Reply via email to