[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