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: nob...@puremagic.com Reporter: ket...@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. --