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.
Simon