Two Scala annotations
Don Clugston
dac at nospam.com
Tue Jul 3 00:42:58 PDT 2012
On 02/07/12 23:20, Walter Bright wrote:
> On 7/2/2012 1:04 PM, bearophile wrote:
>> Walter Bright:
>>
>>> Put "final" in front of y, and it will compile. Remember, this was
>>> done for D1
>>> that didn't have const.
>>
>> I see. So in D2 are we going to require that y to be immutable?
>
> No. I don't agree there's a problem. Nor do I care to break existing D1
> code (and D2 for that matter) without an awfully good reason, and I
> don't see one here.
>
This behaviour is *not* currently in the spec.
And if you give any other kind of runtime expression, you get an error
message which suggests it shouldn't work:
void main()
{
int x;
int y;
switch(x)
{
case *&y: break;
}
}
bug.d(10): Error: case must be a string or an integral constant, not *&y
----------
It would be really difficult to define the current behaviour. I don't
understand it. Let me explain how bizarre it is.
What it does is, run optimize(WANTvar) on the expression. If at the end
of optimization, it is a VarExp of type integer or class, then it can be
a run-time value. It must be a VarExp, it cannot be a DotVar.
Now, what does optimize(WANTvar) actually do? Under what circumstances
can it produce a VarExp? I'm not sure. You really need to check every
code path in optimize.c and constfold.c.
It can happen with comma expressions, for example.
So this:
case 7+8, y:
is accepted.
Are there circumstances where X.Y can be accepted? Maybe some
combination involving alias this or opDispatch ? I don't know.
More information about the Digitalmars-d
mailing list