https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119699
Bug ID: 119699
Summary: fnspec for constructors/deconstructors don't say they
return this when targetm.cxx.cdtor_returns_this ()
returns true
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: enhancement
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: pinskia at gcc dot gnu.org
Target Milestone: ---
Target: arm-*-*eabi
>From PR 101995:
```
class x
{
public:
x ();
int func ();
private:
int a;
};
int g ()
{
x b;
return b.func();
}
```
For the above call we should get:
```
add r0, sp, #4
bl _ZN1xC1Ev
bl _ZN1x4funcEv
```
Since the constructor of class x, returns this (which is also the first
argument).
But currently there is an extra instruction:
add r0, sp, #4
fnspec is what explains this to the middle-end now:
```
/* Parse string of attribute "fn spec". This is an internal attribute
describing side effects of a function as follows:
character 0 specifies properties of return values as follows:
'1'...'4' specifies number of argument function returns (as in memset)
```
I think the easy way of doing this is call set_call_expr_flags with decl and
ECF_RET1 but I could be wrong.