www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 14210] New: invalid merging of template instances

https://issues.dlang.org/show_bug.cgi?id=14210

          Issue ID: 14210
           Summary: invalid merging of template instances
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: major
          Priority: P1
         Component: DMD
          Assignee: nobody puremagic.com
          Reporter: ketmar ketmar.no-ip.org

compiler erroneously merges templates with different delegate types. let's run
the following code:

=== test.d ===
void test(DT) (string name, DT dg) {
  import std.stdio;
  writeln(":: ", name);
  writeln(typeof(dg).stringof);
}

void main () {
  test("001", (int a=40) => a+2);
  test("000", (int a) => a+0);
}
===

output:
:: 001
int function(int a = 40) pure nothrow  nogc  safe
:: 000
int function(int a = 40) pure nothrow  nogc  safe

now let's change `main` to:
===
void main () {
  test("000", (int a) => a+0);
  test("001", (int a=40) => a+2);
}
===

output:
:: 000
int function(int a) pure nothrow  nogc  safe
:: 001
int function(int a) pure nothrow  nogc  safe


both results are obviously wrong, 'cause compiler should not merge two
instantiations. yet compiler checks for merge possibility by checking mangled
names, and both types mangles to the same string.

this breaks automatic CTFE wrapping of functions for some scripting engines,
and possibly many more cases.

--
Feb 20 2015