[Issue 13775] [REG2.067a] Broken explicit casting of dynamic array slices of known size to static array of different type

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Fri Dec 5 06:54:08 PST 2014


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

Kenji Hara <k.hara.pg at gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |pull
            Summary|Broken explicit casting of  |[REG2.067a] Broken explicit
                   |dynamic array slices of     |casting of dynamic array
                   |known size to static array  |slices of known size to
                   |of different type           |static array of different
                   |                            |type

--- Comment #9 from Kenji Hara <k.hara.pg at gmail.com> ---
(In reply to Denis Shelomovskij from comment #0)
> In case it was an accept-invalid bug, what is the reason to disallow the
> feature and break user code without any deprecation message and with such
> unpleasant minor ICE message?

The expression cast(byte[2]) ubytes[0..2] would mean a combination of
- an implicit conversion T[] to T[dim] on a slice expression with CT-known
boundaries
- reinterpret cast T[n] to U[m]

When I implemented issue 3652, I didn't think about the case. So the code had
been just accidentally accepted and and fortunately worked as you intended.

Then, I made the code invalid in my pull/3984 to fix some wrong-code bug.

    ubyte[4] ubytes;
    byte[3] bytes = cast(byte[3]) ubytes[2 .. 4];
    // This code had been wrongly accepted before the pull/3984.

Finally, following PR will accept such reinterpret cast only when the cast is
appropriate.

https://github.com/D-Programming-Language/dmd/pull/4193


(In reply to Steven Schveighoffer from comment #4)
> Is this really an ICE? Usually an ICE shows a DMD source line number where
> the assert happened, or a seg fault.
> 
> This looks more like a standard error message, although the "e2ir" is out of
> place.
> 
> I found the error message, it doesn't look like an ICE to me, just a bad
> error message:
> 
> https://github.com/D-Programming-Language/dmd/blob/master/src/e2ir.c#L4428
> 
> Looking through history, that message has been that way for a long time.
> 
> Clearly, it's a regression, and rejects-valid, but not ICE.

>From historical reasons, some cast operations have been verified only by
glue-layer. That's why sometimes 'e2ir' errors are reported for invalid cast
operations.

Essentially, all semantic errors should be handled by front-end layer. So I
recognize it's a not-yet fixed compiler internal issue.

--


More information about the Digitalmars-d-bugs mailing list