www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 17259] New: ICE with multiple mixin templates containing


          Issue ID: 17259
           Summary: ICE with multiple mixin templates containing
                    conflicting ctor declarations
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: critical
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: hsteoh quickfur.ath.cx


mixin template Templ(T) {
    this() { }

class C {
    mixin Templ!int;
    mixin Templ!float;

void main() {
    auto c = new C;

Compiler output:

test.d: Error: overloadset test.C.__ctor is aliased to a function
core.exception.AssertError ddmd/func.d(4136): Assertion failure
dmd() [0x5a58e5]
dmd(_ZN6NewExp8semanticEP5Scope+0xcc1) [0x57a721]
dmd(_ZN14ExpInitializer9inferTypeEP5Scope+0x26) [0x5b65f6]
dmd(_ZN14VarDeclaration8semanticEP5Scope+0x150) [0x526858]
dmd(_ZN14DeclarationExp8semanticEP5Scope+0xa9) [0x57d101]
dmd(_ZN24StatementSemanticVisitor5visitEP12ExpStatement+0x52) [0x60c1b2]
dmd(_ZN12ExpStatement6acceptEP7Visitor+0x1a) [0x6004da]
ddmd.statementsem.semantic(ddmd.statement.Statement, ddmd.dscope.Scope*)+0x41)
dmd(_ZN24StatementSemanticVisitor5visitEP17CompoundStatement+0xe8) [0x60c448]
dmd(_ZN17CompoundStatement6acceptEP7Visitor+0x1a) [0x600c42]
ddmd.statementsem.semantic(ddmd.statement.Statement, ddmd.dscope.Scope*)+0x41)
dmd(_ZN15FuncDeclaration9semantic3EP5Scope+0x120c) [0x59b2b4]
dmd(_ZN6Module9semantic3EP5Scope+0x6c) [0x54664c]
dmd(int ddmd.mars.tryMain(ulong, const(char)**)+0x2f43) [0x5c90a3]
dmd(_Dmain+0x27) [0x5c9cd7]
dmd(void rt.dmain2._d_run_main(int, char**, extern (C) int
function(char[][])*).tryExec(scope void delegate())+0x2a) [0x706482]
dmd(void rt.dmain2._d_run_main(int, char**, extern (C) int
function(char[][])*).runAll()+0x30) [0x7064e8]
dmd(void rt.dmain2._d_run_main(int, char**, extern (C) int
function(char[][])*).tryExec(scope void delegate())+0x2a) [0x706482]
dmd(_d_run_main+0x1dc) [0x7063fc]
dmd(main+0x12) [0x5ca3c2]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1) [0x7fd3820fd2b1]

Arguably, the code is invalid (but see below), but the compiler should not ICE
just because of that.

I said "arguably" because changing "this() {}" to "~this() {}" not only makes
the error go away, but also causes the multiple dtors to get aggregated and
even merged with any dtors defined explicitly in class C, so that upon class
destruction all the instances of ~this() get invoked. This causes one to wonder
if this is an undocumented feature.  Which then raises the question of why the
asymmetry with ctors, that multiple definitions of the default ctor is rejected
(and leads to an ICE).

Mar 15 2017