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/