[Issue 8903] New: Bad code for enum array members
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sun Oct 28 00:32:59 PDT 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8903
Summary: Bad code for enum array members
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Keywords: wrong-code
Severity: normal
Priority: P2
Component: DMD
AssignedTo: nobody at puremagic.com
ReportedBy: siegelords_abode at yahoo.com
--- Comment #0 from siegelords_abode at yahoo.com 2012-10-28 00:32:58 PDT ---
struct A
{
immutable int arr[8] = [1, 2, 3, 4, 5, 6, 7, 8];
}
struct B
{
enum int arr[8] = [1, 2, 3, 4, 5, 6, 7, 8];
}
void test_a(int n)
{
auto a = A();
auto b = a.arr[n];
}
/*
0000000000416c68 <_D4test6test_aFiZv>:
416c68: 55 push rbp
416c69: 48 8b ec mov rbp,rsp
416c6c: 48 83 ec 20 sub rsp,0x20
416c70: 89 7d f8 mov DWORD PTR [rbp-0x8],edi
416c73: c6 45 f0 00 mov BYTE PTR [rbp-0x10],0x0
416c77: 48 63 45 f8 movsxd rax,DWORD PTR [rbp-0x8]
416c7b: 48 83 f8 08 cmp rax,0x8
416c7f: 48 89 45 e8 mov QWORD PTR [rbp-0x18],rax
416c83: 72 0a jb 416c8f <_D4test6test_aFiZv+0x27>
416c85: bf 10 00 00 00 mov edi,0x10
416c8a: e8 a1 00 00 00 call 416d30 <_D4test7__arrayZ>
416c8f: 48 8b 4d e8 mov rcx,QWORD PTR [rbp-0x18]
416c93: 8b 14 8d f0 41 63 00 mov edx,DWORD PTR [rcx*4+0x6341f0]
416c9a: c9 leave
416c9b: c3 ret
*/
void test_b(int n)
{
auto a = B();
auto b = a.arr[n];
}
/*
0000000000416c9c <_D4test6test_bFiZv>:
416c9c: 55 push rbp
416c9d: 48 8b ec mov rbp,rsp
416ca0: 48 83 ec 20 sub rsp,0x20
416ca4: 89 7d f8 mov DWORD PTR [rbp-0x8],edi
416ca7: c6 45 f0 00 mov BYTE PTR [rbp-0x10],0x0
416cab: 48 63 45 f8 movsxd rax,DWORD PTR [rbp-0x8]
416caf: 48 b9 08 00 00 00 00 movabs rcx,0x8
416cb6: 00 00 00
416cb9: 48 3b c1 cmp rax,rcx
416cbc: 48 89 45 e8 mov QWORD PTR [rbp-0x18],rax
416cc0: 72 0a jb 416ccc <_D4test6test_bFiZv+0x30>
416cc2: bf 16 00 00 00 mov edi,0x16
416cc7: e8 64 00 00 00 call 416d30 <_D4test7__arrayZ>
416ccc: 48 be 08 00 00 00 00 movabs rsi,0x8
416cd3: 00 00 00
416cd6: 48 bf 60 43 63 00 00 movabs rdi,0x634360
416cdd: 00 00 00
416ce0: e8 1b 23 00 00 call 419000 <_d_arrayliteralTX>
416ce5: c7 00 01 00 00 00 mov DWORD PTR [rax],0x1
416ceb: ba 02 00 00 00 mov edx,0x2
416cf0: 89 50 04 mov DWORD PTR [rax+0x4],edx
416cf3: c7 40 08 03 00 00 00 mov DWORD PTR [rax+0x8],0x3
416cfa: c7 40 0c 04 00 00 00 mov DWORD PTR [rax+0xc],0x4
416d01: c7 40 10 05 00 00 00 mov DWORD PTR [rax+0x10],0x5
416d08: c7 40 14 06 00 00 00 mov DWORD PTR [rax+0x14],0x6
416d0f: c7 40 18 07 00 00 00 mov DWORD PTR [rax+0x18],0x7
416d16: c7 40 1c 08 00 00 00 mov DWORD PTR [rax+0x1c],0x8
416d1d: 48 8b 4d e8 mov rcx,QWORD PTR [rbp-0x18]
416d21: 8b 04 88 mov eax,DWORD PTR [rax+rcx*4]
416d24: c9 leave
416d25: c3 ret
416d26: 90 nop
416d27: 90 nop
*/
void main()
{
}
It makes no sense to me for the enum array to cause re-allocation when
instantiated. I know that enum arrays are problematic entities to begin with,
but while they are allowed to exist, they shouldn't generate horrible code like
that.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list