import std.stdio; void main() out { writeln("out"); } body { //return; } "out" is only printed if return is explicit.
Applies to D1 (even ancient versions) as well as D2.
This is a very obscure bug; it's of interest for educational purposes only. Only void main() is affected, and it's because the return 0; needs to be added AFTER the invariant is processed, not before. This patch (against DMD2, svn 356) just moves the return 0; insertion slightly later in FuncDeclaration::semantic3(). Index: func.c =================================================================== --- func.c (revision 356) +++ func.c (working copy) @@ -1287,16 +1287,8 @@ int offend = blockexit & BEfallthru; #endif - if (type->nextOf()->ty == Tvoid) + if (type->nextOf()->ty != Tvoid) { - if (offend && isMain()) - { // Add a return 0; statement - Statement *s = new ReturnStatement(0, new IntegerExp(0)); - fbody = new CompoundStatement(0, fbody, s); - } - } - else - { if (offend) { Expression *e; #if DMDV1 @@ -1462,8 +1454,17 @@ } ReturnStatement *s = new ReturnStatement(0, e); a->push(s); - } + } } +#if DMDV2 + int blockexit = fbody ? fbody->blockExit() : BEfallthru; + int offend = blockexit & BEfallthru; +#endif + if (offend && isMain() && type->nextOf()->ty == Tvoid) + { // For void main(), add a 'return 0' statement + ReturnStatement *s = new ReturnStatement(0, new IntegerExp(0)); + a->push(s); + } fbody = new CompoundStatement(0, a); #if DMDV2
Oops, there's something wrong with this patch. It can interfere badly with foreach for some reason.
https://github.com/D-Programming-Language/dmd/pull/986
Commits pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/2b05220ce3c10602748037189cfd6f3123faafd7 fix Issue 3574 - post-condition in void main() is not evaluated if there is no return statement https://github.com/D-Programming-Language/dmd/commit/48d389b430b16b61d5f101485deb004a50b3a700 Merge pull request #986 from 9rnsr/fix3574 Issue 3574 - post-condition in void main() is not evaluated if there is no return statement
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル