extern(C++) cast from interface to child class returns wrong pointer value #19486
Labels
Arch:x86_64
Issues specific to x86_64
Feature:extern (C/C++/Obj-C)
interfacing to C, C++, Objective-C code
OS:Linux
P2
Severity:critical
Atila Neves (@atilaneves) reported this on 2018-09-26T11:50:29Z
Transferred from https://issues.dlang.org/show_bug.cgi?id=19267
CC List
Description
The code at the end with extern(C++) prints: fooImpl @ 0x7fa6503c1000 foo @ 0x7fa6503c1008 foo @ 0x7fa6503c1008 fooImpl @ 0x7fa6503c1008 If the interface and class are extern(D) it (correctly) prints: fooImpl @ 0x7fa6503c1000 foo @ 0x7fa6503c1008 foo @ 0x7fa6503c1008 fooImpl @ 0x7fa6503c1000 Casting from the class to the interface works in both cases and adds 8 bytes to the pointer. Casting back from interface to the class only works for extern(D) and fails for extern(C++): there's no way to get the original pointer back except for manually subtracting 8 bytes. Code to reproduce: import core.stdc.stdio: printf; extern(C++) interface Foo { int foo(); } extern(C++) class FooImpl: Foo { override int foo() { return 42; } } void main() { auto fooImpl = new FooImpl; printf("fooImpl @ %p ", fooImpl); Foo foo = fooImpl; printf("foo @ %p ", foo); printf(" "); takingFoo(foo); } void takingFoo(Foo foo) { printf("foo @ %p ", foo); FooImpl fooImpl = cast(FooImpl) foo; // oops printf("fooImpl @ %p ", fooImpl); }The text was updated successfully, but these errors were encountered: