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 ! ! ! ! ! ! ! ! ! */
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); } }
Fixed dmd 1.046 and 2.031
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル