D issues are now
tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Summary: |
[CTFE] ICE with pointer cast of indexed array |
Product: |
D
|
Reporter: |
Hisayuki Mima <youxkei> |
Component: |
dmd | Assignee: |
No Owner <nobody> |
Status: |
RESOLVED
FIXED
|
Severity: |
normal
|
CC: |
bugzilla, clugdbug
|
Priority: |
P2
|
Version: |
D2 |
Hardware: |
x86 |
OS: |
Windows |
struct S{
int i;
}
static assert({
{
void* p;
p = [S(1)].ptr;
S s = *(cast(S*)p);// OK
assert(s.i == 1);
}
{
void*[] ary;
ary ~= [S(2)].ptr;
S s = *(cast(S*)ary[0]);// Error: CTFE internal error assigning struct
assert(s.i == 2);
}
{
void*[string] aa;
aa["key"] = [S(3)].ptr;
S s = *(cast(S*)aa["key"]);// Error: CTFE internal error assigning struct
assert(s.i == 3);
}
return true;
}());
The latest dmd built from github cannot compile the above code.
Another case, where it's an lvalue instead of an rvalue:
{
void*[7] ary;
ary[6]= [S(2)].ptr;
*(cast(S*)ary[6]) = S(4); //ICE(interpret.c 2965)
}
The root cause is that type painting of pointers hasn't been considered properly in CTFE.