adding the -inline option produces wrong output, both with
Digital Mars D Compiler v1.043,
Digital Mars D Compiler v2.029
on windows.
import std.stdio; //writefln
int my_abs(int i) {
return i<0 ? -i : i;
}
void main(char[][] args) {
int rows=9;
int mid=5;
for (int j=0; j<rows; j++) {
int leadSpaces=my_abs((mid-1)-j);
for (int i=0; i<leadSpaces; i++)
writef("-");
//writefln("%d:%d",j,leadSpaces);
writefln("!");
}
}
/*
CORRECT:
C:\dev\d>dmd -release -O -run compiler_bug1.d
----!
---!
--!
-!
!
-!
--!
---!
----!
WRONG:
C:\dev\d>dmd -release -O -inline -run compiler_bug1.d
!
!
!
!
!
!
!
!
!
*/
Comment #1 by clugdbug — 2009-05-15T08:40:41Z
Reduced test case:
dmd bug.d //OK
dmd -O bug.d // fails.
Raising severity -- this is a VERY nasty bug. All the outer for loop does is prevent constant folding. With -O enabled, the wrong branch of ?: gets taken.
void main() {
for (int j=1; j<2; j++) {
int x = (j<0) ? -j : j;
int q=0;
for (int i=0; i<x; i++) ++q;
assert(q!=0);
}
}