[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