[GSoC] Header Generation for C/C++
Eduard Staniloiu
edi33416 at gmail.com
Thu Sep 5 11:56:28 UTC 2019
> On Thursday, 5 September 2019 at 11:25:47 UTC, Eduard Staniloiu
> wrote:
> [...]
> I'm currently working on correctly generating the ctors and
> dtors declarations.
More details about the above.
When I began working on the project, the code was generating two
ctors for each `struct`
1. a default ctor that was initializing all the struct fields
with their default value
2. a ctor that took all the struct field types as arguments and
assigned the supplied arguments to each struct field (Ex.
`this->x = x`).
The above two replicate (almost) the D behavior of constructing a
struct that has no ctor defined. I say almost because you can
either use the default ctor, or you **must** pass all the field
arguments to the ctor (in D you can pass as many as you want, not
all).
When I first saw this and ran it with Razvan and Andrei and we
said "Thats odd. The tool should only generate declarations, not
definitions". I asked Iain about it and he said he couldn't
remember why it was there, but probably he needed it at some
point. So, in the light of this, we took the decision of dropping
the ctor definition generation until further notice.
Well, this week I had an epiphany: for any struct, we have to
generate the default ctor definition because on the D side,
fields are default initialized to their `.init` value. If one
would construct a struct (Ex. on the stack) on the C++ side, then
the code could break.
Let's see the following simple struct example
```
// D module
extern (C++) struct S
{
int* ptr;
void apiFun() {
if (ptr) {
/* do stuff */
}
}
}
void bar()
{
S s;
s.apiFun();
}
// C++ code
// Generated struct header
struct S
{
int* ptr;
void apiFun();
};
void gun()
{
S s;
s.apiFun();
}
```
The `bar` function, being on the D side, is fine.
The `gun` function on the other hand, will be UB.
This is bad.
Starting from this, I came to the following conclusions:
- For any `extern (C++)` struct, a default ctor must be
generated
- If a struct defines a dtor, a declaration must be generated:
`virtual ~A();`
- For any defined ctors, a declaration must be generated
I think that if a struct defines a copy ctor, an opAssign, then
an equivalent C++ declaration must be generated.
What do you think, folks?
Cheers,
Edi
More information about the Digitalmars-d
mailing list