> On 19 Oct 2024, at 10:16, Simon Martin <si...@nasilyan.com> wrote:
>
> On 18 Oct 2024, at 10:55, Sam James wrote:
>
>> 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.
> Strange. FWIW I’m generating and sending the patches from a MacOS box,
> and there might be some weirdness coming from that. I’ll check and try
> to fix.
macOS Mail messes up whitespace, for sure (but I’ve not seen it append <CR>).
AFAIK “git send-email” works fine (at least no-one has reported a problem).
maybe the editor in use thinks the target format is Windows and has changed
line endings accordingly?
Iain
>
> Simon