http://d.puremagic.com/issues/show_bug.cgi?id=5996
Summary: [CTFE] Undefined function call in auto return function Product: D Version: D2 Platform: x86 OS/Version: Windows Status: NEW Keywords: diagnostic Severity: normal Priority: P2 Component: DMD AssignedTo: nob...@puremagic.com ReportedBy: bearophile_h...@eml.cc --- Comment #0 from bearophile_h...@eml.cc 2011-05-13 13:10:26 PDT --- This is wrong D2 code, because min() is not defined: auto foo(int n) { uint two = 2, three = 3, five = 5; auto h = new typeof(two)[n]; h[0] = 1; auto x2 = two, x3 = three, x5 = five; int i, j, k; for (int w = 1; w < n; w++) { auto el = h[w] = min(x2, x3, x5); if (x2 == el) x2 = two * h[++i]; if (x3 == el) x3 = three * h[++j]; if (x5 == el) x5 = five * h[++k]; } return h[$ - 1]; } enum uint h = foo(1691); static assert(h == 2123366400); void main() {} DMD 2.053beta prints: Assertion failure: '0' on line 1601 in file 'expression.c' --------------------- If I have remove the three if() lines: auto foo(int n) { uint two = 2, three = 3, five = 5; auto h = new typeof(two)[n]; h[0] = 1; auto x2 = two, x3 = three, x5 = five; int i, j, k; for (int w = 1; w < n; w++) { auto el = h[w] = min(x2, x3, x5); } return h[$ - 1]; } enum uint h = foo(1691); static assert(h == 2123366400); void main() {} Now the error messages are: Error: array index 4294967295 is out of bounds [][0 .. 0] test2.d(10): Error: h[__dollar - 1u] cannot be interpreted at compile time test2.d(12): Error: cannot evaluate foo(1691) at compile time test2.d(12): Error: cannot evaluate foo(1691) at compile time test2.d(13): Error: static assert (foo(1691) == 2123366400u) is not evaluatable at compile time Note an error message without line number too. DMD 2.052 instead prints: test2.d(4): Error: array index 0 is out of bounds [][0..0] test2.d(12): Error: cannot evaluate foo(1691) at compile time test2.d(12): Error: cannot evaluate foo(1691) at compile time test2.d(12): Error: cannot evaluate foo(1691) at compile time test2.d(13): Error: static assert (foo(1691) == 2123366400u) is not evaluatable at compile time --------------------- If I remove "auto" as return type and put a "uint": uint foo(int n) { uint two = 2, three = 3, five = 5; auto h = new typeof(two)[n]; h[0] = 1; auto x2 = two, x3 = three, x5 = five; int i, j, k; for (int w = 1; w < n; w++) { auto el = h[w] = min(x2, x3, x5); } return h[$ - 1]; } enum uint h = foo(1691); static assert(h == 2123366400); void main() {} Finally the error messages are correct: test3.d(8): Error: undefined identifier min, did you mean function main? test3.d(12): Error: cannot evaluate foo(1691) at compile time -------------------------- Now adding the missing min() fixes the problem, and it works with auto return type too: T min(T)(T a, T b, T c) { return (a > b) ? ((b > c) ? c : b) : ((a > c) ? c : a); } auto foo(int n) { uint two = 2, three = 3, five = 5; auto h = new typeof(two)[n]; h[0] = 1; auto x2 = two, x3 = three, x5 = five; int i, j, k; for (int w = 1; w < n; w++) { auto el = h[w] = min(x2, x3, x5); if (x2 == el) x2 = two * h[++i]; if (x3 == el) x3 = three * h[++j]; if (x5 == el) x5 = five * h[++k]; } return h[$ - 1]; } enum uint h = foo(1691); static assert(h == 2125764000); void main() {} -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------