blob: 59a9c3cb88241d491429af5b4d23e89a8af6d3eb [file] [log] [blame]
/*
https://issues.dlang.org/show_bug.cgi?id=21518
TEST_OUTPUT:
---
fail_compilation/test21518.d(19): Error: cannot implicitly convert expression `[dg]` of type `const(void delegate() pure nothrow @nogc @system)[]` to `void delegate() @safe[]`
fail_compilation/test21518.d(23): Error: cannot implicitly convert expression `[dg]` of type `const(void delegate() pure nothrow @nogc @system)[]` to `const(void delegate() @safe)[]`
fail_compilation/test21518.d(28): Error: cannot implicitly convert expression `sysA` of type `const(void delegate() @system)[]` to `const(void delegate() @safe)[]`
fail_compilation/test21518.d(31): Error: cannot implicitly convert expression `sysA` of type `const(void delegate() @system)[]` to `const(void delegate() @safe)`
fail_compilation/test21518.d(32): Error: cannot implicitly convert expression `dg` of type `const(void delegate() pure nothrow @nogc @system)` to `const(void delegate() @safe)`
---
*/
void delegates()
{
const dg = delegate() @system { int* p; int x; p = &x; };
// pragma(msg, typeof(dg)); // const(void delegate() pure nothrow @nogc @system)
// Correctly fails
void delegate() @safe[] arg2 = [ dg ];
void delegate() @system[] arg3 = [ dg ]; // But doesnt break this
// Previously ignored
const(void delegate() @safe)[] arg = [ dg ];
// pragma(msg, typeof(arg)); // const(void delegate() @safe)[]
// Also for variables, not only array literals
const(void delegate() @system)[] sysA = [ dg ];
const(void delegate() @safe)[] safeA = sysA;
// Original bug report:
func(sysA);
func(dg);
}
void func(const void delegate() @safe [] paramDGs...) @safe
{
if (paramDGs.length > 0) paramDGs[0]();
}