Bug 21008 – dmd segfaults because of __traits(getMember, ...) and virtual function overriding
Status
RESOLVED
Resolution
FIXED
Severity
critical
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2020-07-03T10:35:24Z
Last change time
2022-03-03T14:51:34Z
Keywords
ice, pull
Assigned to
No Owner
Creator
Heromyth
Comments
Comment #0 by bitworld — 2020-07-03T10:35:24Z
When compiling the test code with dmd, the compiler will crash.
Test with dmd 2.092.0 and 2.088.1 on Windows and Linux.
Here is the code:
======================================
void main() {}
import std.traits;
abstract class Controller {
bool after();
}
abstract class ControllerBase(T) : Controller {
override bool after() {
return true;
}
mixin(handleMiddlewareAnnotation!(T));
}
class DemoController : ControllerBase!DemoController {
// Bug mark A
override bool after() {
return true;
}
}
string handleMiddlewareAnnotation(T)() {
foreach (memberName; __traits(allMembers, T)) {
alias currentMember = __traits(getMember, T, memberName); // Bug mark B
}
return "";
}
======================================
After commenting out the mark A or the mark B, the compiling will pass.
Comment #1 by moonlightsentinel — 2020-07-05T14:38:36Z
Smaller test case (without templates):
class Base
{
bool after();
mixin(handleMiddlewareAnnotation);
}
class C : Base
{
override bool after();
}
string handleMiddlewareAnnotation()
{
foreach (member; __traits(allMembers, C))
{
__traits(getMember, C, member);
}
}
Comment #4 by dlang-bot — 2022-02-27T08:10:18Z
@WalterBright created dlang/dmd pull request #13724 "fix Issue 21008 - dmd segfaults because of __traits(getMember, ...) a…" fixing this issue:
- fix Issue 21008 - dmd segfaults because of __traits(getMember, ...) and virtual function overriding
https://github.com/dlang/dmd/pull/13724
Comment #5 by dlang-bot — 2022-03-03T14:51:34Z
dlang/dmd pull request #13724 "fix Issue 21008 - dmd segfaults because of __traits(getMember, ...) a…" was merged into master:
- 088d11bb2497c7ca4a6d58652f940a643fc95a39 by Walter Bright:
fix Issue 21008 - dmd segfaults because of __traits(getMember, ...) and virtual function overriding
https://github.com/dlang/dmd/pull/13724