www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 16317] New: Wrong binop evaluation/load order when optimizing


          Issue ID: 16317
           Summary: Wrong binop evaluation/load order when optimizing
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: major
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: kinke gmx.net

The runtime assertion fails when specifying `-O`:

int add8ret3(ref int s)
    s += 8;
    return 3;

int binAdd(int val)
    val = val + add8ret3(val);
    return val;

void main()
    assert(binAdd(1) == (1 + 3));
    static assert(binAdd(1) == (1 + 3));

So the left hand side lvalue seems to be loaded after evaluating the right hand
side. This can be caused by optimizing `val = val <op> ...` to `val <op>= ...`,
which isn't valid for the current evaluation/load order rules.

This came up when fixing a related CTFE issue in
https://github.com/dlang/dmd/pull/5966, where I disabled the corresponding
tests for now.

Jul 24 2016