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

> Hi Sam,

Hi Simon,

>
> On 16 Oct 2024, at 22:06, Sam James wrote:
>
>> 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
>>
> Aarg, of course, thanks for spotting this! Fixed in the attached 
> version.
>
>>> +
>>> +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?
> I did use git-send-email indeed. What oddities do you see with line 
> endings?
> cat -A over the patch file looks good.
>

Weird -- if I open your original email in mu4e, I see a bunch of ^M at
the end of the lines.


> Thanks, Simon
>
> [2. text/plain; 
> 0001-c-Fix-crash-during-NRV-optimization-with-invalid-inp.patch]...

Reply via email to