Thread overview
statement is not reachable
Mar 05, 2009
Qian Xu
Mar 05, 2009
Qian Xu
Mar 05, 2009
Ary Borenszweig
March 05, 2009
Hi All,

I have got a warning by compiling ("gdc file -Wall") the following code
----------------------------------------------------------
module unreachable;
class Foo {
  this(int i) {}
  this(char[] s) {}
  this(char[] s, int flag) {
    if (flag == 1)
    {
      this(1);
      return;
    }
    else if (flag == 2)
    {
      this("hello");
      return;
    }
    throw new Exception("unhandled case");
    this(0); // fake
  }
}
void main()
{
  Foo foo = new Foo("world", 1);
  assert(false, "END");
}
-----------------------------------------------------------

The warning is: "statement is not reachable"

If I use switch-case-statment, I can see even an error message: "constructor calls not allowed in loops or after labels"



So, is my design incorrect, or is the compiler too strict?

--Qian Xu


March 05, 2009
On Thu, Mar 5, 2009 at 3:17 AM, Qian Xu <quian.xu@stud.tu-ilmenau.de> wrote:

>  this(char[] s, int flag) {
>    if (flag == 1)
>    {
>      this(1);
>      return;
>    }
>    else if (flag == 2)
>    {
>      this("hello");
>      return;
>    }
>    throw new Exception("unhandled case");
>    this(0); // fake

This line is unreachable.  The 'throw' before it makes it impossible for it to ever execute.  Just take out this line.
March 05, 2009
Jarrett Billingsley wrote:

> On Thu, Mar 5, 2009 at 3:17 AM, Qian Xu <quian.xu@stud.tu-ilmenau.de> wrote:
> 
>> this(char[] s, int flag) {
>> if (flag == 1)
>> {
>> this(1);
>> return;
>> }
>> else if (flag == 2)
>> {
>> this("hello");
>> return;
>> }
>> throw new Exception("unhandled case");
>> this(0); // fake
> 
> This line is unreachable.  The 'throw' before it makes it impossible for it to ever execute.  Just take out this line.


Hi Jarrett,

but I need an exception here. This is an unexpected case. I want no instance to be create in this case.

--Qian
March 05, 2009
Qian Xu wrote:
> Jarrett Billingsley wrote:
> 
>> On Thu, Mar 5, 2009 at 3:17 AM, Qian Xu <quian.xu@stud.tu-ilmenau.de>
>> wrote:
>>
>>> this(char[] s, int flag) {
>>> if (flag == 1)
>>> {
>>> this(1);
>>> return;
>>> }
>>> else if (flag == 2)
>>> {
>>> this("hello");
>>> return;
>>> }
>>> throw new Exception("unhandled case");
>>> this(0); // fake
>> This line is unreachable.  The 'throw' before it makes it impossible
>> for it to ever execute.  Just take out this line.
> 
> 
> Hi Jarrett, 
> 
> but I need an exception here. This is an unexpected case. I want no instance
> to be create in this case.
> 
> --Qian

No instance is created if you throw an exception. Or... I don't know what's the difference between that and trying to create an instance and throwing.

I'd suggest you do it like this:

module unreachable;
class Foo {
  this(int i) {}
  this(char[] s) {}
  this(char[] s, int flag)
  in
  {
    assert(flag == 1 || flag == 2);	
  }
  body
  {
    if (flag == 1)
    {
      this(1);
    }
    else if (flag == 2)
    {
      this("hello");
    }
  }
}
March 05, 2009
On Thu, Mar 5, 2009 at 10:45 AM, Qian Xu <quian.xu@stud.tu-ilmenau.de> wrote:
> Hi Jarrett,
>
> but I need an exception here. This is an unexpected case. I want no instance to be create in this case.

By the time the constructor runs, an instance has already been created.  But if you throw an exception in the ctor, it's impossible for a reference to that instance to be stored anywhere, unless you store it within the ctor itself, i.e.

this()
{
    someGlobal = this;
    throw new Exception("foo!");
}