Bug 9152 – Regression in type inference of array of delegates

Status
RESOLVED
Resolution
INVALID
Severity
regression
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2012-12-13T09:52:00Z
Last change time
2012-12-13T10:00:13Z
Assigned to
nobody
Creator
hsteoh

Comments

Comment #0 by hsteoh — 2012-12-13T09:52:16Z
This code used to compile in 2.058: alias void delegate(int) DgType; void dispatch(DgType[] funcTable, int idx, int arg) { funcTable[idx](arg); } void main() { dispatch([ (int x) { return x+x; }, (int x) { return x*x; }, (int x) { return x^^2; } ], 0, 1); } Since 2.059, dmd is unable to correctly infer the type of the delegate array literal: test.d(9): Error: function test.dispatch (void delegate(int)[] funcTable, int idx, int arg) is not callable using argument types (int function(int x) pure nothrow @safe[],int,int) test.d(9): Error: cannot implicitly convert expression ([delegate pure nothrow @safe int(int x) { return x + x; } , delegate pure nothrow @safe int(int x) { return x * x; } , delegate pure nothrow @safe int(int x) { return int __powtmp8 = x; , __powtmp8 * __powtmp8; } ]) of type int function(int x) pure nothrow @safe[] to void delegate(int)[] In this case, one can add @safe to the alias as a workaround, but it doesn't work if the same function needs to be called with another array that contains a @system delegate.
Comment #1 by hsteoh — 2012-12-13T10:00:13Z
Oops, the code snippet is wrong. I'll have to reduce the actual failing code again and file another bug.