This should compile: void main() { int[int] aa; foreach(long k, long v; aa) {} // fails on both k and v // test.d(3): Error: foreach: index must be type int, not long // test.d(3): Error: foreach: value must be type int, not long static struct OpApply { int opApply(int delegate(int)) {return 0;} } foreach(long x; OpApply()) {} // fails // test.d(10): Error: cannot uniquely infer foreach argument types // In contrast, it does work on plain arrays and ranges: int[] a; foreach(long x; a) {} // ok static struct Range { @property bool empty() {return false;} @property int front() {return 0;} void popFront() {} } foreach(long x; Range()) {} // ok }
This case still doesn't work void main() { static struct OpApply { int opApply(int delegate(int)) {return 0;} } foreach(long x; OpApply()) {} // fails // test.d(10): Error: cannot uniquely infer foreach argument types } The first was issue 9212
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/18466 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB