www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - statement is not reachable

reply Qian Xu <quian.xu stud.tu-ilmenau.de> writes:
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
Mar 05 2009
parent reply Jarrett Billingsley <jarrett.billingsley gmail.com> writes:
On Thu, Mar 5, 2009 at 3:17 AM, Qian Xu <quian.xu stud.tu-ilmenau.de> wrote=
:

 =A0this(char[] s, int flag) {
 =A0 =A0if (flag =3D=3D 1)
 =A0 =A0{
 =A0 =A0 =A0this(1);
 =A0 =A0 =A0return;
 =A0 =A0}
 =A0 =A0else if (flag =3D=3D 2)
 =A0 =A0{
 =A0 =A0 =A0this("hello");
 =A0 =A0 =A0return;
 =A0 =A0}
 =A0 =A0throw new Exception("unhandled case");
 =A0 =A0this(0); // fake
This line is unreachable. The 'throw' before it makes it impossible for it to ever execute. Just take out this line.
Mar 05 2009
parent reply Qian Xu <quian.xu stud.tu-ilmenau.de> writes:
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
Mar 05 2009
next sibling parent Ary Borenszweig <ary esperanto.org.ar> writes:
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"); } } }
Mar 05 2009
prev sibling parent Jarrett Billingsley <jarrett.billingsley gmail.com> writes:
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!"); }
Mar 05 2009