dmd 2.063 beta 5

Don turnyourkidsintocash at nospam.com
Thu May 23 06:12:10 PDT 2013


On Thursday, 23 May 2013 at 11:08:16 UTC, Artur Skawina wrote:
> On 05/23/13 11:05, Don wrote:
>> On Tuesday, 21 May 2013 at 20:36:20 UTC, Walter Bright wrote:
>>>
>>> Join the dmd beta mailing list to keep up with the betas. 
>>> This one is pretty much good to go, unless something 
>>> disastrous crops up.
>>>
>>> http://ftp.digitalmars.com/dmd2beta.zip
>>>
>>> Remaining regressions:
>>>
>>> http://d.puremagic.com/issues/buglist.cgi?query_format=advanced&bug_severity=regression&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED
>> 
>> NO NO NO NO. I am violently opposed to this release.
>> 
>> This beta contains the worst language misfeature of all time. 
>> It's silently snuck in under the guise of a bugfix.
>
> It is a bugfix.

No. Disallowing the problematic initializer fixes the bug. 
Allowing it, but with a different meaning, is a new feature.


> It's also a breaking change, for code that relied on the buggy
> behavior. There may be ways to ease the migration. But it's not 
> a 'misfeature'.
>
> The language changes with /every/ frontend release, often 
> silently or with
> just a note in some bugzilla entry.. This case isn't any worse 
> and at least
> this change is actually a real fix.

No, it's not, it's a fix plus a new misfeature.

> The scoped import change, which makes local imports effectively 
> 'public' is a
> much more serious problem. Undoing that one would be painful in 
> the future,
> if it were to stay. ( 
> http://d.puremagic.com/issues/show_bug.cgi?id=10128 )
>
>
>> struct S
>> {
>>     const int x = 7;
>>     int y;
>> }
>> 
>> In previous releases, S.x was always 7.
>> But now, if you write
>> 
>> S s = S(5);
>> 
>> then x gets changed to 5.
>> This means that the const variable x has been initialized 
>> TWICE!
>> 
>> This new behaviour is counter-intuitive and introduces a 
>> horrible inconsistency.
>
> Yes, this is wrong and just shouldn't be allowed. And, yes, 
> even inside ctors.
>
>> This is totally different to what happens with module 
>> constructors (you get a compile error if you try to set a 
>> const global if it already has an initializer). Likewise, 
>> everywhere else in the language, when you see a const variable 
>> with an initializer, the initializer gives its value.
>
> Yes, introducing a "const and initialized, but still mutable" 
> class makes no sense.
>
>> I think the only possible solution is to make it an error to 
>> provide a const or immutable member with an initializer.
>
> Except for the issue mentioned above, the new behavior is 
> right. Adding a
> keyword ("static") to such declarations should not be a real 
> problem.
> AIUI the compiler can be made to list all the places which need 
> changing.
> But, yes, the fact that the old (buggy) code compiles, but now 
> silently
> drops that implicit "static" isn't ideal.
> Would making 'struct S{const a=1;}" illegal for a release 
> really be a
> significant improvement? Any code not updated during that 
> 'migration'
> period would then still be in the same situation...

No, it should be illegal for ever. It's not sensible behaviour.

>
>> If you are providing an initializer, you surely meant to make 
>> it 'static const', and that is certainly true of all existing 
>> usages of it.
>> As far as I can tell, this new feature exists only to create 
>> bugs. No use cases for it have been given. I cannot imagine a 
>> case where using this feature would not be a bug.
>
> struct Packet(uint TYPE) {
>    immutable uint type = TYPE;
>    // ...
> }

But that allows you to write:

auto w  = Packet!(7)(6);

which sets type to 6 !
That makes no sense. It's a bug. Probably you meant:

struct Packet(uint TYPE) {
     static immutable uint type = TYPE;
     // ...
}
which doesn't store a copy of the '7' in every instance.


More information about the Digitalmars-d-announce mailing list