[Issue 22636] New: Wrong C++ constructor called for abstract class
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Wed Dec 29 12:51:37 UTC 2021
https://issues.dlang.org/show_bug.cgi?id=22636
Issue ID: 22636
Summary: Wrong C++ constructor called for abstract class
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: tim.dlang at t-online.de
Wrong C++ constructor called for abstract class
//////////////// testabstractcpp.cpp ////////////////
class C
{
public:
C();
virtual void f() = 0;
int i;
};
C::C()
{
i = 5;
}
////////////////// testabstractd.d //////////////////
extern(C++) abstract class C
{
this();
abstract void f();
int i;
}
extern(C++) class D : C
{
override void f()
{
assert(i == 5);
}
}
void main()
{
D d = new D();
d.f();
}
/////////////////////////////////////////////////////
The files can be compiled with the following commands:
clang++ -c testabstractcpp.cpp
dmd -L-lstdc++ testabstractd.d testabstractcpp.o
The second command results in a linker error:
/usr/bin/ld: testabstractd.o:(.data._D13testabstractd1C7__ClassZ+0x88):
undefined reference to `C::C()'
/usr/bin/ld: testabstractd.o: in function `D::D()':
testabstractd.d:(.text._ZN1DC1Ev[_ZN1DC1Ev]+0x14): undefined reference to
`C::C()'
The Itanium C++ ABI has different constructors. Clang seems to only emit the
base object constructor (_ZN1CC2Ev) for abstract class C, but dmd tries to use
the complete object constructor (_ZN1DC1Ev).
The example work with GCC, because it emits both constructors.
--
More information about the Digitalmars-d-bugs
mailing list