Jump to page: 1 2
Thread overview
[Issue 2423] New: Erroneous unreachable statement warning
Oct 20, 2008
d-bugmail
Oct 20, 2008
Don
Oct 20, 2008
Lars Ivar Igesund
Oct 20, 2008
Lars Ivar Igesund
Oct 26, 2008
d-bugmail
Oct 26, 2008
d-bugmail
Oct 26, 2008
d-bugmail
Oct 26, 2008
d-bugmail
Nov 20, 2008
d-bugmail
Aug 07, 2009
Don
Oct 21, 2009
Don
October 20, 2008
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
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
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
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
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
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
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
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
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
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: -------
« First   ‹ Prev
1 2