www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Strange "Statement is not reachable"

reply Orgoton <orgoton mindless.com> writes:
I created and Actor Class like this:

class Actor
{
    public this()
    {
        frameQ[this.type].add(this); //add myself to the queue
        HP=this.MaxHP;
        MP=this.MaxMP;
        if (this.type==ActorType.Other) return;
        if (heartQ[0].size()>heartQ[1].size()) heartQ[1].add(this);
        else heartQ[0].add(this);
        if (this.type==ActorType.Creature) AIQ.add(this);
        return; /*****/
    }
public final static const ActorType type=ActorType.Other;
}

(ignore functions calls, they aren't relevant)

and then on the Player Class

public class Player : Actor
{
public this(float x, float y, ubyte level)
    {
        this.level=level;
        super(x, y);
    }
public final static const ActorType type=ActorType.HumanPlayer;
}

Now the problem lies on the line marked with "***" (the return statement in
Actor's ctr). If it is there, DMD says that "statement is not reachable"
without giving me any information on why or which line:

semantic2 actor
semantic3 actor
warning - Error: statement is not reachable
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings

So, if I remove the "return;", the program compiles fine. What happened?

Btw, it is my (Assembly) programming habit to put a "return;" at the end of
every function, even if it is not void or is unreachable.
Mar 23 2007
next sibling parent Orgoton <orgoton mindless.com> writes:
Fergot to post:

    public this(in float x, in float y)
    {
        coord.x=x; coord.y=y;
        this();
    }

on the Actor class... Whether or not this functions has a "return;" at the end,
the problem occurs.
Mar 23 2007
prev sibling parent reply Ary Manzana <ary esperanto.org.ar> writes:
Orgoton escribió:
 I created and Actor Class like this:
 
 class Actor
 {
     public this()
     {
         frameQ[this.type].add(this); //add myself to the queue
         HP=this.MaxHP;
         MP=this.MaxMP;
         if (this.type==ActorType.Other) return;
         if (heartQ[0].size()>heartQ[1].size()) heartQ[1].add(this);
         else heartQ[0].add(this);
         if (this.type==ActorType.Creature) AIQ.add(this);
         return; /*****/
     }
 public final static const ActorType type=ActorType.Other;
 }
 
 (ignore functions calls, they aren't relevant)
 
 and then on the Player Class
 
 public class Player : Actor
 {
 public this(float x, float y, ubyte level)
     {
         this.level=level;
         super(x, y);
     }
 public final static const ActorType type=ActorType.HumanPlayer;
 }
 
 Now the problem lies on the line marked with "***" (the return statement in
Actor's ctr). If it is there, DMD says that "statement is not reachable"
without giving me any information on why or which line:
 
 semantic2 actor
 semantic3 actor
 warning - Error: statement is not reachable
 Process terminated with status 1 (0 minutes, 0 seconds)
 0 errors, 0 warnings
 
 So, if I remove the "return;", the program compiles fine. What happened?
 
 Btw, it is my (Assembly) programming habit to put a "return;" at the end of
every function, even if it is not void or is unreachable.

I think this is caused because the semantic pass adds a return statement at the end of the constructor, so if you specify a return you get two return statements, one of which is not reachable. But this is just a guess because I've just snooped the semantic code. Ary
Mar 23 2007
parent Orgoton <orgoton mindless.com> writes:
I have other functions and constructors with return statements and none other
gives out the same error. Besides, it is strange that the DMD does not supply
me with information as to where the error occurs (in this case, which line is
unreachable).

Furthermore, the compiling log shows at the end: "0 warnings, 0 errors" when
there were at least one, but this may be related to Code::Blocks.
Mar 24 2007