Opened 5 years ago
Last modified 5 years ago
#197 new defect
Generated constructor calls copy ctor twice on tuple elements
Reported by: | f37yu | Owned by: | |
---|---|---|---|
Priority: | major | Component: | cfa-cc |
Version: | 1.0 | Keywords: | tuple, copy, constructor |
Cc: |
Description (last modified by ) ΒΆ
Compiler generated copy constructor for struct with fields of tuple type does a redundant copy.
The tuple elements are first copied to generated temporary variables, then to the actual destination.
Code that creates the problem:
struct A {}; void ?{}(A& a, A src) { sout | 'A'; } struct B { [A, A] elem; }; int main() { B b; B b1 = b; }
Correct behavior is the program prints twice. Currently on B b1 = b; it prints four times.
compile this snippet with -n -P resolver, should find the following (note the "maybe constructed"):
?{}: autogenerated cfa static inline function ... with parameters _dst: reference to instance of struct B with body 1 _src: instance of struct B with body 1 ... returning nothing ... with body CompoundStmt Implicit Ctor Dtor Statement ... with Ctor/Dtor: Expression Statement: Tuple Assignment Expression, with stmt expr: Statement Expression: CompoundStmt Declaration of __multassign_L0: reference to instance of struct A with body 1 with initializer (not constructed) Simple Initializer: Generated Cast of: Tuple Index Expression, with tuple: Member Expression, with field: elem: tuple of types instance of struct A with body 1 instance of struct A with body 1 ... from aggregate: Generated Cast of: Variable Expression: _dst: reference to instance of struct B with body 1 ... to: instance of struct B with body 1 with index: 0 ... to: reference to instance of struct A with body 1 Declaration of __multassign_L1: reference to instance of struct A with body 1 with initializer (not constructed) Simple Initializer: Generated Cast of: Tuple Index Expression, with tuple: Member Expression, with field: elem: tuple of types instance of struct A with body 1 instance of struct A with body 1 ... from aggregate: Generated Cast of: Variable Expression: _dst: reference to instance of struct B with body 1 ... to: instance of struct B with body 1 with index: 1 ... to: reference to instance of struct A with body 1 Declaration of __multassign_R0: instance of struct A with body 1 with initializer (maybe constructed) Constructor initializer: ... initially constructed with Implicit Ctor Dtor Statement ... with Ctor/Dtor: Expression Statement: Application of Variable Expression: ?{}: static inline function ... with parameters _dst: reference to instance of struct A with body 1 _src: instance of struct A with body 1 ... returning nothing ... to arguments Generated Cast of: Variable Expression: __multassign_R0: instance of struct A with body 1 ... to: reference to instance of struct A with body 1 Tuple Index Expression, with tuple: Member Expression, with field: elem: tuple of types instance of struct A with body 1 instance of struct A with body 1 ... from aggregate: Variable Expression: _src: instance of struct B with body 1 with index: 0 ... destructed with Implicit Ctor Dtor Statement ... with Ctor/Dtor: Expression Statement: Application of Variable Expression: ^?{}: static inline function ... with parameters _dst: reference to instance of struct A with body 1 ... returning nothing ... to arguments Generated Cast of: Variable Expression: __multassign_R0: instance of struct A with body 1 ... to: reference to instance of struct A with body 1 Declaration of __multassign_R1: instance of struct A with body 1 with initializer (maybe constructed) Constructor initializer: ... initially constructed with Implicit Ctor Dtor Statement ... with Ctor/Dtor: Expression Statement: Application of Variable Expression: ?{}: static inline function ... with parameters _dst: reference to instance of struct A with body 1 _src: instance of struct A with body 1 ... returning nothing ... to arguments Generated Cast of: Variable Expression: __multassign_R1: instance of struct A with body 1 ... to: reference to instance of struct A with body 1 Tuple Index Expression, with tuple: Member Expression, with field: elem: tuple of types instance of struct A with body 1 instance of struct A with body 1 ... from aggregate: Variable Expression: _src: instance of struct B with body 1 with index: 1 ... destructed with Implicit Ctor Dtor Statement ... with Ctor/Dtor: Expression Statement: Application of Variable Expression: ^?{}: static inline function ... with parameters _dst: reference to instance of struct A with body 1 ... returning nothing ... to arguments Generated Cast of: Variable Expression: __multassign_R1: instance of struct A with body 1 ... to: reference to instance of struct A with body 1 Expression Statement: Tuple: Application of Variable Expression: ?{}: static inline function ... with parameters _dst: reference to instance of struct A with body 1 _src: instance of struct A with body 1 ... returning nothing ... to arguments Variable Expression: __multassign_L0: reference to instance of struct A with body 1 Variable Expression: __multassign_R0: instance of struct A with body 1 Application of Variable Expression: ?{}: static inline function ... with parameters _dst: reference to instance of struct A with body 1 _src: instance of struct A with body 1 ... returning nothing ... to arguments Variable Expression: __multassign_L1: reference to instance of struct A with body 1 Variable Expression: __multassign_R1: instance of struct A with body 1
Change History (2)
comment:1 Changed 5 years ago by
Description: | modified (diff) |
---|
comment:2 Changed 5 years ago by
Description: | modified (diff) |
---|
Note: See
TracTickets for help on using
tickets.