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









nobody <nobody mailinator.com> 