[Issue 13207] Wrong code for 'extern' C/C++ function returning struct
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Sat Jul 26 16:23:12 PDT 2014
https://issues.dlang.org/show_bug.cgi?id=13207
--- Comment #1 from Denis Shelomovskij <verylonglogin.reg at gmail.com> ---
And a C++ example where it segfaults:
D code:
---
const size_t n = 8; // yes, even fits in a register
struct S1 { long l; } // good
struct S2 { byte[n] arr; } // causes errors
static assert(S1.sizeof == n);
static assert(S2.sizeof == n);
extern(C++) interface I
{
size_t getN();
S1 getS1();
S2 getS2();
}
class C: I
{
extern(C++):
size_t getN() { return n; }
S1 getS1() { return S1(); } // correct code
S2 getS2() { return S2(); } // wrong code
}
extern(C) I getI() { return new C; }
---
C++ code:
---
const size_t n = 8;
struct S { char arr[n]; };
static_assert(sizeof(S) == n, "Size mismath.");
class I
{
public:
virtual size_t getN() = 0;
virtual S getS1() = 0;
virtual S getS2() = 0;
};
extern "C" I *getI();
int main()
{
rt_init();
I *i = getI();
assert(i->getN() == n); // simple test
S s1 = i->getS1(); // ok
S s2 = i->getS2(); // segfaults
rt_term();
return 0;
}
---
--
More information about the Digitalmars-d-bugs
mailing list