Thread overview |
---|
October 20, 2008 [Issue 2423] New: Erroneous unreachable statement warning | ||||
---|---|---|---|---|
| ||||
http://d.puremagic.com/issues/show_bug.cgi?id=2423 Summary: Erroneous unreachable statement warning Product: D Version: 1.035 Platform: Other OS/Version: All Status: NEW Keywords: diagnostic Severity: regression Priority: P2 Component: DMD AssignedTo: bugzilla@digitalmars.com ReportedBy: larsivar@igesund.net Consider the following function: void foo() { do { if (false) return 1; } while (true); } Compiling with -w, results in warning - whiletrue.d(6): Error: statement is not reachable Minimized from a module in Tango, meaning Tango does not compile with warnings on. This regression was introduced in DMD 1.032. -- |
October 20, 2008 Re: [Issue 2423] New: Erroneous unreachable statement warning | ||||
---|---|---|---|---|
| ||||
Posted in reply to d-bugmail | d-bugmail@puremagic.com wrote:
> http://d.puremagic.com/issues/show_bug.cgi?id=2423
>
> Summary: Erroneous unreachable statement warning
> Product: D
> Version: 1.035
> Platform: Other
> OS/Version: All
> Status: NEW
> Keywords: diagnostic
> Severity: regression
> Priority: P2
> Component: DMD
> AssignedTo: bugzilla@digitalmars.com
> ReportedBy: larsivar@igesund.net
>
>
> Consider the following function:
>
> void foo() {
>
> do {
> if (false)
> return 1;
> } while (true);
> }
>
> Compiling with -w, results in
>
> warning - whiletrue.d(6): Error: statement is not reachable
>
> Minimized from a module in Tango, meaning Tango does not compile with warnings
> on.
>
> This regression was introduced in DMD 1.032.
>
>
Why is that wrong? "return 1" looks unreachable to me.
|
October 20, 2008 Re: [Issue 2423] New: Erroneous unreachable statement warning | ||||
---|---|---|---|---|
| ||||
Posted in reply to Don | Don wrote: > d-bugmail@puremagic.com wrote: >> http://d.puremagic.com/issues/show_bug.cgi?id=2423 >> >> Summary: Erroneous unreachable statement warning >> Product: D >> Version: 1.035 >> Platform: Other >> OS/Version: All >> Status: NEW >> Keywords: diagnostic >> Severity: regression >> Priority: P2 >> Component: DMD >> AssignedTo: bugzilla@digitalmars.com >> ReportedBy: larsivar@igesund.net >> >> >> Consider the following function: >> >> void foo() { >> >> do { >> if (false) >> return 1; >> } while (true); >> } >> >> Compiling with -w, results in >> >> warning - whiletrue.d(6): Error: statement is not reachable >> >> Minimized from a module in Tango, meaning Tango does not compile with warnings on. >> >> This regression was introduced in DMD 1.032. >> >> > Why is that wrong? "return 1" looks unreachable to me. It is while(true) that is line 6 (you can move the while a few lines down to see that it isn't just a line number error). The return makes the statement on that line ("true" I assume) unreachable, which is correct without the conditional. So it is the presence of the if (false) that makes this an error. -- Lars Ivar Igesund blog at http://larsivi.net DSource, #d.tango & #D: larsivi Dancing the Tango |
October 20, 2008 Re: [Issue 2423] New: Erroneous unreachable statement warning | ||||
---|---|---|---|---|
| ||||
Posted in reply to Lars Ivar Igesund | Lars Ivar Igesund wrote: > Don wrote: > >> d-bugmail@puremagic.com wrote: >>> http://d.puremagic.com/issues/show_bug.cgi?id=2423 >>> >>> Summary: Erroneous unreachable statement warning >>> Product: D >>> Version: 1.035 >>> Platform: Other >>> OS/Version: All >>> Status: NEW >>> Keywords: diagnostic >>> Severity: regression >>> Priority: P2 >>> Component: DMD >>> AssignedTo: bugzilla@digitalmars.com >>> ReportedBy: larsivar@igesund.net >>> >>> >>> Consider the following function: >>> >>> void foo() { >>> >>> do { >>> if (false) >>> return 1; >>> } while (true); >>> } >>> >>> Compiling with -w, results in >>> >>> warning - whiletrue.d(6): Error: statement is not reachable >>> >>> Minimized from a module in Tango, meaning Tango does not compile with warnings on. >>> >>> This regression was introduced in DMD 1.032. >>> >>> >> Why is that wrong? "return 1" looks unreachable to me. > > It is > > while(true) > > that is line 6 (you can move the while a few lines down to see that it > isn't just a line number error). The return makes the statement on that > line ("true" I assume) unreachable, which is correct without the > conditional. So it is the presence of the if (false) that makes this an > error. > Of course, any conditional should remove this warning - in the module (tango/io/vfs/ZipFolder.d) where I found this problem, the return is in the else block. -- Lars Ivar Igesund blog at http://larsivi.net DSource, #d.tango & #D: larsivi Dancing the Tango |
October 26, 2008 [Issue 2423] Erroneous unreachable statement warning | ||||
---|---|---|---|---|
| ||||
Posted in reply to d-bugmail | http://d.puremagic.com/issues/show_bug.cgi?id=2423 ------- Comment #1 from larsivar@igesund.net 2008-10-26 11:40 ------- There is also a related issue that will show in the same function if that has a return value: int foo() { do { return 1; } while (true); } warning - whiletrue.d(4): Error: statement is not reachable warning - whiletrue.d(1): function whiletrue.foo no return at end of function I understand that the "no return" is a semantic challenge, but the rule is fairly simple: if there is a while(true), then all code after it is dead code unless there is also a break. This is also a regression. Note that whereas the first is an obvious bug and impossible to workaround, this one is possible to workaround, but still a question about quality of implementation. The "no return" bug does also affect/break Tango when using warnings. -- |
October 26, 2008 [Issue 2423] Erroneous unreachable statement warning | ||||
---|---|---|---|---|
| ||||
Posted in reply to d-bugmail | http://d.puremagic.com/issues/show_bug.cgi?id=2423 ------- Comment #2 from andrei@metalanguage.com 2008-10-26 12:27 ------- (In reply to comment #1) > There is also a related issue that will show in the same function if that has a return value: > > int foo() { > do { > return 1; > } while (true); > } > > warning - whiletrue.d(4): Error: statement is not reachable > warning - whiletrue.d(1): function whiletrue.foo no return at end of function > > I understand that the "no return" is a semantic challenge, but the rule is fairly simple: if there is a while(true), then all code after it is dead code unless there is also a break. This is also a regression. > > Note that whereas the first is an obvious bug and impossible to workaround, this one is possible to workaround, but still a question about quality of implementation. The "no return" bug does also affect/break Tango when using warnings. In this case there's no doubt a simple flow analysis will take care of things. The challenge is only when conditions are complex; in this case that doesn't matter. The code could as well be: do { return 1; } while (P == NP); My explanation for the bug is that Walter's front-end rewrites loops with terminal test as loops with initial test with a jump: do stmt while (cond); ==> goto __label; while (cond) __label: stmt The rewritten form makes it a tad more difficult to figure out what's going on. Andrei -- |
October 26, 2008 [Issue 2423] Erroneous unreachable statement warning | ||||
---|---|---|---|---|
| ||||
Posted in reply to d-bugmail | http://d.puremagic.com/issues/show_bug.cgi?id=2423 ------- Comment #3 from jarrett.billingsley@gmail.com 2008-10-26 12:52 ------- (In reply to comment #0) > Consider the following function: > > void foo() { > > do { > if (false) > return 1; > } while (true); > } > > Compiling with -w, results in > > warning - whiletrue.d(6): Error: statement is not reachable > > Minimized from a module in Tango, meaning Tango does not compile with warnings on. > > This regression was introduced in DMD 1.032. > Erm, actually, I wonder if this is even valid. do-while loops in D do not require a semicolon at the end. The "unreachable statement" is simply the empty statement that follows the "while(true)". The following code: int foo() { do { return 1; } while (true) } gives no warnings. -- |
October 26, 2008 [Issue 2423] Erroneous unreachable statement warning | ||||
---|---|---|---|---|
| ||||
Posted in reply to d-bugmail | http://d.puremagic.com/issues/show_bug.cgi?id=2423 ------- Comment #4 from larsivar@igesund.net 2008-10-26 13:35 ------- (In reply to comment #3) > (In reply to comment #0) > > Consider the following function: > > > > void foo() { > > > > do { > > if (false) > > return 1; > > } while (true); > > } > > > > Compiling with -w, results in > > > > warning - whiletrue.d(6): Error: statement is not reachable > > > > Minimized from a module in Tango, meaning Tango does not compile with warnings on. > > > > This regression was introduced in DMD 1.032. > > > > Erm, actually, I wonder if this is even valid. do-while loops in D do not require a semicolon at the end. The "unreachable statement" is simply the empty statement that follows the "while(true)". The following code: > > int foo() { > do { > return 1; > } while (true) > } > > gives no warnings. > You are right. I won't decide whether there is still a bug in the compiler, but it is no longer a problem for Tango. -- |
November 20, 2008 [Issue 2423] Erroneous unreachable statement warning | ||||
---|---|---|---|---|
| ||||
Posted in reply to d-bugmail | http://d.puremagic.com/issues/show_bug.cgi?id=2423 smjg@iname.com changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |smjg@iname.com ------- Comment #5 from smjg@iname.com 2008-11-19 18:38 ------- (In reply to comment #3) > Erm, actually, I wonder if this is even valid. do-while loops in D do not require a semicolon at the end. The "unreachable statement" is simply the empty statement that follows the "while(true)". The following code: It's valid, it just throws a warning. ISTM not having the semicolon at the end of DoStatement was a bad design decision - if you stumble upon } while (whatever) { in the middle of some code, you have to look through possibly screenfuls of code to determine whether the while applies to the preceding block (and the following one just opens a new scope for whatever reason) or the following block. Meanwhile, the conditions under which "statement is not reachable" is thrown ought to be changed to exclude empty statements. -- |
August 07, 2009 [Issue 2423] Erroneous unreachable statement warning | ||||
---|---|---|---|---|
| ||||
Posted in reply to d-bugmail | http://d.puremagic.com/issues/show_bug.cgi?id=2423 Don <clugdbug@yahoo.com.au> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |patch CC| |clugdbug@yahoo.com.au --- Comment #6 from Don <clugdbug@yahoo.com.au> 2009-08-07 08:35:26 PDT --- To remove the warning from empty statements: PATCH: statement.c, line 564 (DMD2) - if (!(result & BEfallthru) && !s->comeFrom()) + if (!(result & BEfallthru) && !s->comeFrom() && !s->isEmpty()) { s->warning("statement is not reachable"); } And then add this line to ExpStatement, in statement.h line 140: virtual int isEmpty() { return exp==NULL; } Side effect: This will make {;;;;;} an empty statement; at the moment, it isn't. The patch below makes the code below compile (into return 2;). Currently it won't compile, but works if try{;} is changed into try{}. nothrow int main() { int x= 2; try { ; } catch(Exception e) { x=4; throw new Exception("xxx"); } return x; } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
Copyright © 1999-2021 by the D Language Foundation