[Issue 21285] New: Delegate covariance broken
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Wed Sep 30 05:45:21 UTC 2020
https://issues.dlang.org/show_bug.cgi?id=21285
Issue ID: 21285
Summary: Delegate covariance broken
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: regression
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: hsteoh at quickfur.ath.cx
Reduced code:
--------
void main()
{
string path;
int bank;
auto aa = [
"path": (string arg) {
path = arg;
},
"bank": (string arg) {
bank = 1;
throw new Exception("");
},
];
}
--------
DMD 2.094 output:
--------
/tmp/test.d(6): Error: cannot implicitly convert expression __lambda1 of type
void delegate(string arg) pure nothrow @nogc @safe to void delegate(string)
pure @safe
--------
Surely `void delegate(string) pure nothrow @nogc @safe` is implicitly
convertible to `void delegate(string) pure @safe`? Since nothrow is covariant
to (implicit) throwing, and @nogc is covariant to (implicit) allocating. In any
case, it's a bug that the compiler is unable to find a common value type for
the above AA literal, since the common type `void delegate(string)` exists and
works for both cases.
Note that the same problem persists even if the AA's type is explicitly spelled
out `void delegate(string)[string]`, so this is not directly related to type
deduction of the AA, but rather is a failure to find a common type between the
two values of the AA literal.
This code successfully compiled with DMD 2.092, so this represents a recent
regression.
--
More information about the Digitalmars-d-bugs
mailing list