digitalmars.D.bugs - else not attaching properly to if
- nobody (72/72) Oct 29 2007 I do not think it should ever be the case that this block:
- Don Clugston (11/37) Oct 29 2007 The else always wants to join to the most recent if.
- nobody (3/43) Oct 29 2007 You are right. I was wrong in thinking that the elimination in
- Matti Niemenmaa (49/77) Oct 29 2007 No, you've got it wrong. It's:
I do not think it should ever be the case that this block: if(false) if(true) { assert(false); } else { assert(true); } should ever be functionally different from this block: if(false) { if(true) { assert(false); } } else { assert(true); } The compiler agrees with me in this simple case. However, I have found a spot in my code where the second block results in correct behaviour and the first block does not. This is surely a compiler (v1.015) bug? Here is the big picture: struct S { void f() { while() { foreach() { if(...) { if(...) { } else if(...) { } } else { if(...) { // need brackets or next else is not attached if(...) { } } else { if(...) { } else if(...) { } else if(...) { } else if(...) { } } } } } } }
Oct 29 2007
nobody wrote:I do not think it should ever be the case that this block: if(false) if(true) { assert(false); } else { assert(true); } should ever be functionally different from this block: if(false) { if(true) { assert(false); } } else { assert(true); }The else always wants to join to the most recent if. The first snippet is equivalent to: if (false) { if (true) { assert(false); } else { assert(true); } } So I can't see a bug in the bigger example.
Oct 29 2007
Don Clugston wrote:nobody wrote:You are right. I was wrong in thinking that the elimination in the case of single statements applied here, which it does not.I do not think it should ever be the case that this block: if(false) if(true) { assert(false); } else { assert(true); } should ever be functionally different from this block: if(false) { if(true) { assert(false); } } else { assert(true); }The else always wants to join to the most recent if. The first snippet is equivalent to: if (false) { if (true) { assert(false); } else { assert(true); } } So I can't see a bug in the bigger example.
Oct 29 2007
nobody wrote:I do not think it should ever be the case that this block: if(false) if(true) { assert(false); } else { assert(true); } should ever be functionally different from this block: if(false) { if(true) { assert(false); } } else { assert(true); } The compiler agrees with me in this simple case.No, you've got it wrong. It's: if (false) { if (true) { assert (false); } else { assert (true); } } Which compiles down to nothing since if (false) is always false. The compiler appears to agree because both blocks actually do nothing. Compile and run this: import std.stdio; void main() { writefln("%d", f (false,true)); writefln("%d", f_wrong(false,true)); writefln("%d", f_right(false,true)); } int f(bool a, bool b) { if (a) if (b) { return 0; } else { return 1; } return 2; } int f_wrong(bool a, bool b) { if (a) { if (b) { return 0; } } else { return 1; } return 2; } int f_right(bool a, bool b) { if (a) { if (b) { return 0; } else { return 1; } } return 2; } -- E-mail address: matti.niemenmaa+news, domain is iki (DOT) fi
Oct 29 2007