On 2009-12-30 23:41:54 -0500, Michel Fortin <[email protected]> said:

Here is a pathetic example of something that does not work currently:

struct R {
        @safe int opApply(int delegate(ref int) z) {
                int i = 1;
return z(i); // Error: safe function 'opApply' cannot call system delegate 'z'
        }
}

@system
void someSystemFunction() {
        R r;
        foreach (i; r) { writeln(i); }
}

Should I have to write the opApply twice so it can work with both system and safe functions? I sure hope not. Even then, this does not compile either:

I should add that I can write this to move the error somewhere else which is more illustrative of my point by tagging the argument as a @safe delegate:

struct R {
        @safe int opApply(int delegate(ref int) @safe z) {
                int i = 1;
                return z(i);
        }
}

@system
void someSystemFunction() {
        R r;
foreach (i; r) { writeln(i); } // Error: function untitled.R.opApply (int delegate(ref int) z) is not callable using argument types (int delegate(ref int))
}

This version of opApply gives no error if the caller is @safe:

@safe
void someSafeFunction() {
        R r;
        foreach (i; r) { writeln(i); }
}

(Except about writeln not being safe, but that's not a language issue.)

--
Michel Fortin
[email protected]
http://michelf.com/

Reply via email to