https://issues.dlang.org/show_bug.cgi?id=14950

Kenji Hara <k.hara...@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|rejects-valid               |diagnostic
           Hardware|x86_64                      |All
                 OS|Linux                       |All
           Severity|normal                      |minor

--- Comment #1 from Kenji Hara <k.hara...@gmail.com> ---
This is a minor diagnostic issue.

In D, a derived enum type cannot overflow the value range of its base type.

http://dlang.org/enum

> If there is no AssignExpression and it is not the first EnumMember, it is 
> given the value of the previous EnumMember+1. If the value of the previous 
> EnumMember is EnumBaseType.max, it is an error. If the value of the previous 
> EnumMember+1 is the same as the value of the previous EnumMember, it is an 
> error. (This can happen with floating point types.)

With the definition of A and B

>       enum A {
>               start,
>               end
>       }
> 
>       enum B {
>               start = A.end,
>               end
>       }

The base type of B is implicitly deduced to A, because B.start is defined by
using A.end.

So B.end is beyond the value of A.max (== A.end), and compiler reports an
overflow error.

But current error message is a little confusing. The current message

> ./test.d(9): Error: enum member test.B.end initialization with (B.start + 1) 
> causes overflow for type 'int'

should become:

  ./test.d(9): Error: enum member test.B.end initialization with (B.start + 1)
causes overflow for type 'A'

----

To avoid the error, you need to specify the base of each enum types explicitly.
You're intended that the two enums are for C library interfaces, so the best
for that would be int.

A fixup example:

    enum A : int {
        start,   // == int(0)
        end      // == int(1)
    }

    enum B : int {
        start = A.end,  // == cast(int)A.end == int(0)
        end             // == int(1)
    }

Then, the B definition never overflows from its base type range: 0 to int.max.

--

Reply via email to