digitalmars.D.bugs - [Issue 19743] New: Foreach loops desugar into code that does not
- d-bugmail puremagic.com (50/51) Mar 15 2019 https://issues.dlang.org/show_bug.cgi?id=19743
https://issues.dlang.org/show_bug.cgi?id=19743 Issue ID: 19743 Summary: Foreach loops desugar into code that does not work with Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: normal Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: monkeyworks12 hotmail.com I have the following code: Needle* find(Haystack, Needle)(return scope Haystack haystack, scope Needle needle) safe { foreach (ref val; haystack) if (val == needle) return &val; //Error: scope variable __r2 may not be returned return null; } void main() safe { int[9] haystack = [0, 10, 5, 6, 2, 3, 9, 4, 5]; int* foundVal = haystack.find(3); }From my understanding of `return scope` parameters, this should compile.However, the foreach loop desugars into the following: { int[] __r2 = haystack[]; ulong __key3 = 0LU; for (; __key3 < __r2.length; __key3 += 1LU) { ref int val = __r2[__key3]; if (val == needle) return &val; } } The slicing of the static array obscures the knowledge that `haystack` is `return scope` from the compiler. Furthermore, as `__r2` is inferred as `scope`, the compiler thinks that I am escaping a reference to a local `scope` variable, and does not allow this code to compile. Unfortunately, due to https://issues.dlang.org/show_bug.cgi?id=19742, writing a manually-desugared version does not quite work: for (auto i = 0; i < haystack.length; i++) if (haystack[i] == needle) return &haystack[i]; //Error: returning &haystack[cast(ulong)i] escapes a reference to parameter haystack, perhaps annotate with return --
Mar 15 2019