www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 14779] New: incorrect addressing of arguments in

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

          Issue ID: 14779
           Summary: incorrect addressing of arguments in
                    require/in-contract
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Keywords: wrong-code
          Severity: regression
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: code dawg.eu

cat > bug.d << CODE
class Foo
{
    final  property void value(int val)
    in
    {
        assert(val == 0);
    }
    body
    {
    }
}

void main()
{
    auto foo = new Foo();
    foo.value = 0;
}
CODE

dmd -run bug

----
core.exception.AssertError bug.d(6): Assertion failure
----

Seems like the addressing the require function (in contract) is wrong.
This only affects master, not 2.068.0-b1.

Old ASM:

        mov     qword ptr [rbp-10H], rdi                ; 0008 _ 48: 89. 7D, F0
        mov     dword ptr [rbp-8H], esi                 ; 000C _ 89. 75, F8
        lea     rdi, [rbp-10H]                          ; 000F _ 48: 8D. 7D, F0
        call    _D3bug3Foo5valueMFNdiZ9__requireMFZv    ; 0013 _ E8,
00000000(rel)

_D3bug3Foo5valueMFNdiZ9__requireMFZv PROC
        push    rbp                                     ; 0000 _ 55
        mov     rbp, rsp                                ; 0001 _ 48: 8B. EC
        sub     rsp, 16                                 ; 0004 _ 48: 83. EC, 10
        cmp     dword ptr [rdi+8H], 0                   ; 0008 _ 83. 7F, 08, 00

New ASM:

        mov     qword ptr [rbp-10H], rdi                ; 0008 _ 48: 89. 7D, F0
        mov     dword ptr [rbp-8H], esi                 ; 000C _ 89. 75, F8
        call    _D3bug3Foo5valueMFNdiZ9__requireMFZv    ; 000F _ E8,
00000000(rel)

_D3bug3Foo5valueMFNdiZ9__requireMFZv PROC
        push    rbp                                     ; 0000 _ 55
        mov     rbp, rsp                                ; 0001 _ 48: 8B. EC
        sub     rsp, 16                                 ; 0004 _ 48: 83. EC, 10
        mov     qword ptr [rbp-8H], rdi                 ; 0008 _ 48: 89. 7D, F8
        cmp     dword ptr [rbp], 0                      ; 000C _ 83. 7D, 00, 00

--
Jul 07 2015