Thread overview
Strange "Statement is not reachable"
Mar 23, 2007
Orgoton
Mar 23, 2007
Orgoton
Mar 23, 2007
Ary Manzana
Mar 24, 2007
Orgoton
March 23, 2007
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.
March 23, 2007
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.
March 23, 2007
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
March 24, 2007
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.