Bug 22951 – Dtor missing from generated C++ header
Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2022-03-28T16:35:37Z
Last change time
2022-03-29T07:58:30Z
Keywords
pull
Assigned to
No Owner
Creator
moonlightsentinel
Comments
Comment #0 by moonlightsentinel — 2022-03-28T16:35:37Z
dtoh omits function declarations that cannot be called from C++. But that currently applies to destructors and hence allow code that breaks RAII due to instances not being destroyed on the C++ side.
Comment #1 by dlang-bot — 2022-03-29T06:56:13Z
@MoonlightSentinel created dlang/dmd pull request #13914 "Fix 22951 - Emit non-extern (C++) destructors as private members" fixing this issue:
- Fix 22951 - Emit non-extern (C++) destructors as private members
Destructors not marked as `extern (C++)` aren't accessible from C++
due to the D name mangling. The header generator used to skip `extern(D)`
destructors, allowing C++ code that violated RAII guarantees.
Declaring the constructors as `private` members ensures that any
instance that would need to be destroyed on the C++ side causes a
compiler error (rather than a linker error due to missmatched mangling).
Renamed the helper function `checkVirtualFunction` because it now also
handles other types of functions.
https://github.com/dlang/dmd/pull/13914
Comment #2 by dlang-bot — 2022-03-29T07:58:30Z
dlang/dmd pull request #13914 "Fix 22951 - Emit non-extern (C++) destructors as private members" was merged into master:
- 11be8a63105cb5e43b4a2c318260bafb8456af32 by MoonlightSentinel:
Fix 22951 - Emit non-extern (C++) destructors as private members
Destructors not marked as `extern (C++)` aren't accessible from C++
due to the D name mangling. The header generator used to skip `extern(D)`
destructors, allowing C++ code that violated RAII guarantees.
Declaring the constructors as `private` members ensures that any
instance that would need to be destroyed on the C++ side causes a
compiler error (rather than a linker error due to missmatched mangling).
Renamed the helper function `checkVirtualFunction` because it now also
handles other types of functions.
https://github.com/dlang/dmd/pull/13914