Simon Martin <si...@nasilyan.com> writes:

> We ICE upon the following invalid code because we end up calling
> finalize_nrv_r with a RETURN_EXPR with no operand.
> 
> === cut here ===
> struct X {
>   ~X();
> };
> X test(bool b) {
>   {
>     X x;
>     return x;
>   }
>   if (!(b)) return;
> }
> === cut here ===
> 
> This patch fixes this by simply returning error_mark_node when detecting
> a void return in a function returning non-void.
> 
> Successfully tested on x86_64-pc-linux-gnu.
> 
>       PR c++/117099
> 
> gcc/cp/ChangeLog:
> 
>       * typeck.cc (check_return_expr): Return error_mark_node upon
>       void return for function returning non-void.
> 
> gcc/testsuite/ChangeLog:
> 
>       * g++.dg/parse/crash77.C: New test.
> 
> ---
>  gcc/cp/typeck.cc                     |  1 +
>  gcc/testsuite/g++.dg/parse/crash77.C | 14 ++++++++++++++
>  2 files changed, 15 insertions(+)
>  create mode 100644 gcc/testsuite/g++.dg/parse/crash77.C
> 
> diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc
> index 71d879abef1..22a6ec9a185 100644
> --- a/gcc/cp/typeck.cc
> +++ b/gcc/cp/typeck.cc
> @@ -11238,6 +11238,7 @@ check_return_expr (tree retval, bool *no_warning, 
> bool *dangling)
>        RETURN_EXPR to avoid control reaches end of non-void function
>        warnings in tree-cfg.cc.  */
>        *no_warning = true;
> +      return error_mark_node;
>      }
>    /* Check for a return statement with a value in a function that
>       isn't supposed to return a value.  */
> diff --git a/gcc/testsuite/g++.dg/parse/crash77.C 
> b/gcc/testsuite/g++.dg/parse/crash77.C
> new file mode 100644
> index 00000000000..d3f0ae6a877
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/parse/crash77.C
> @@ -0,0 +1,14 @@
> +// PR c++/117099
> +// { dg-compile }

dg-do compile

> +
> +struct X {
> +  ~X();
> +};
> +
> +X test(bool b) {
> +  {
> +    X x;
> +    return x;
> +  } 
> +  if (!(b)) return; // { dg-error "return-statement with no value" }
> +}
> -- 
> 2.44.0
> 

BTW, the line-endings on this seem a bit odd. Did you use git-send-email?

Reply via email to