| Thread overview | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
April 19, 2011 case statement allows for runtime values, a case of accepts-invalid? | ||||
|---|---|---|---|---|
| ||||
int foo(ref int y)
{
y = 5;
return y;
}
void main()
{
int x = 1;
int y = 2;
switch (x = foo(y))
{
case y:
writeln("x == y");
default:
}
assert(x == 5);
assert(y == 5);
}
According to the docs:
The case expressions must all evaluate to a constant value or array, or a runtime initialized const or immutable variable of integral type.
In fact if you try to add a constant, only then will you get an error:
switch (x)
{
case y + 1:
}
Error: case must be a string or an integral constant, not y + 1
It will also error out if you try to use a field of a struct. Which leads me to believe the first case should not be allowed to compile. Thoughts?
| ||||
April 19, 2011 Re: case statement allows for runtime values, a case of accepts-invalid? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | Andrej Mitrovic Wrote: > int foo(ref int y) > { > y = 5; > return y; > } > > void main() > { > int x = 1; > int y = 2; > > switch (x = foo(y)) > { > case y: > writeln("x == y"); > default: > } > > assert(x == 5); > assert(y == 5); > } Yes bug. Not this part though > switch (x = foo(y)) | |||
April 19, 2011 Re: case statement allows for runtime values, a case of accepts-invalid? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jesse Phillips | On 4/19/11, Jesse Phillips <jessekphillips+D@gmail.com> wrote:
> Yes bug. Not this part though
>
>> switch (x = foo(y))
>
Yeah that I know.
Do you happen to know if this bug is already filed or should I file it?
| |||
April 19, 2011 Re: case statement allows for runtime values, a case of accepts-invalid? | ||||
|---|---|---|---|---|
| ||||
*I've searched bugzilla and couldn't find an entry for this particular case. | ||||
April 19, 2011 Re: case statement allows for runtime values, | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | Andrej Mitrovic Wrote:
> On 4/19/11, Jesse Phillips <jessekphillips+D@gmail.com> wrote:
> > Yes bug. Not this part though
> >
> >> switch (x = foo(y))
> >
>
> Yeah that I know.
>
> Do you happen to know if this bug is already filed or should I file it?
I would not know. As long as you do a best guess search on what you think it would be in Bugzilla, post the bug. It is best to have a duplicate here and there then to miss something. In fact even when something seems similar it is good to post a new bug when you're not sure (mention possibly related bugs in the report).
| |||
April 19, 2011 Re: case statement allows for runtime values, | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jesse Phillips | Got it. Bug is reported.
Btw, is there a specific reason why non-const values are not allowed?
I mean, doesn't a switch statement like this:
switch(value)
{
case 1:
foo(); break;
case 2:
bar(); break;
default:
doo();
}
expand to:
if (value == 1)
foo();
else if (value == 2)
bar();
else
doo();
You can compare anything in an if statement, so why is switch more limited?
| |||
April 19, 2011 Re: case statement allows for runtime values, | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | Andrej Mitrovic Wrote:
> Got it. Bug is reported.
>
> Btw, is there a specific reason why non-const values are not allowed?
>
> I mean, doesn't a switch statement like this:
> switch(value)
> {
> case 1:
> foo(); break;
> case 2:
> bar(); break;
> default:
> doo();
> }
>
> expand to:
>
> if (value == 1)
> foo();
> else if (value == 2)
> bar();
> else
> doo();
>
> You can compare anything in an if statement, so why is switch more limited?
No, it doesn't lower to an if/else statement. I didn't quite understand the details, but I'm actually pretty sure it needs a compile-time value.
| |||
April 19, 2011 Re: case statement allows for runtime values, | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | Andrej Mitrovic: > Got it. Bug is reported. Good. > You can compare anything in an if statement, so why is switch more limited? switch has stronger requirements than a series of if statements and its uses such extra information to create assembly code that's more efficient than a series of if statement, like a dense jump table. (And in some situations there are ways to produce something even better, if you need to emulate a state machine or an interpreter. You are able to do it in GCC with computed gotos). Bye, bearophile | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply