DIP 1015--Deprecation of Implicit Conversion of Int. & Char. Literals to bool--Formal Assement

Rubn where at is.this
Wed Nov 14 21:21:05 UTC 2018


On Wednesday, 14 November 2018 at 02:45:38 UTC, Walter Bright 
wrote:
> On 11/13/2018 3:29 PM, Rubn wrote:
> > enum A : int { a = 127 }
>
> `a` is a manifest constant of type `A` with a value of `127`.
>
> Remember that `A` is not an `int`. It is implicitly convertible 
> to an integer type that its value will fit in (Value Range 
> Propagation). Other languages do not have VRP, so expectations 
> from how those languages behave do not apply to D. VRP is a 
> nice feature, it is why:
>
>     enum s = 100;     // typed as int
>     enum t = 300;     // also typed as int
>     ubyte u = s + 50; // works, no cast required,
>                       // although the type is implicitly 
> converted
>     ubyte v = t + 50; // fails
>
> In your articles, it is crucial to understand the difference 
> between a manifest constant of type `int` and one of type `A`.

At least can you understand where the problem lies? If you have 
code like this:

foo(Enum.value);

Then it gets changed:

// ops might be calling a different function now
foo(runtimeCond ? Enum.value : Enum.otherValue);

Or how about if we just add another enum to our list:

enum Enum : int {
     // ...
     // add new enum here, shifting the values down
     value,      // 126 -> 127
     otherValue, // 127 -> 128 - Ops now we are calling a 
different function ~somewhere~
     // ...
}

 From your implementation perspective I can see why it is a good 
thing. But from my user's perspective this just screams 
unreliable chaotic mess, even in the most trivial examples.

What D does is only suitable for the absolute most trivial 
example:

enum int s = 100;
ubyte v = s; // ok no cast required

But even just a slightly more trivial example like we have now, 
and it falls apart:

enum int s = 100;

void foo(int);
void foo(byte);

foo(s); // Not suitable for determining overloads
         // though is good for variable initialization

Not one's really asking to add another layer to anything. Merely 
to not treat named enum types as if they are just constants like 
anonymous enums.

ubyte a = Enum.value; // this is ok
foo(Enum.value);      // this needs to be x1000 more reliable



More information about the Digitalmars-d-announce mailing list