D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.

Issue 6792

Summary: [CTFE] ICE with pointer cast of indexed array
Product: D Reporter: Hisayuki Mima <youxkei>
Component: dmdAssignee: No Owner <nobody>
Status: RESOLVED FIXED
Severity: normal CC: bugzilla, clugdbug
Priority: P2
Version: D2
Hardware: x86
OS: Windows

Description Hisayuki Mima 2011年10月08日 10:24:56 UTC
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.
Comment 1 Don 2011年10月10日 01:15:26 UTC
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.

AltStyle によって変換されたページ (->オリジナル) /