[Issue 18880] New: [REG2.079] Miscompilation of unittests when two are mixed-in on one line

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sat May 19 21:44:25 UTC 2018


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

          Issue ID: 18880
           Summary: [REG2.079] Miscompilation of unittests when two are
                    mixed-in on one line
           Product: D
           Version: D2
          Hardware: x86
                OS: Mac OS X
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: johanengelen at weka.io

With the change to deterministic unittest function naming, this bug was
introduced:
When N unittests are mixed-in on the same line, the first one is run N times.

Testcase:
```
mixin(genTest("666")); mixin(genTest("777"));

int i;

string genTest(string a)
{
    return "unittest { i += " ~ a ~ "; }";
}

void main()
{
    // All unittests have been when we reach here.
    assert(i == 0 + 666 + 777);

    // Since 2.079 this passes!
    // assert(i == 0 + 666 + 666);
}
```
fails with:
dmd -unittest -run testcase.d
since 2.079.

It's caused by the naming of the unittest functions. The source location of the
unittest is used in the name, but the source location inside mixins behaves
strange: inside the mixin the linenumbers are offset with the line number of
the mixin statement, but the column of the mixin statement is not reflected in
Locs inside a mixin (only in the filename of the Loc).
Thus only one function is made "...__unittest_L1_C1FZv" and it is called twice.
(the second unittest gets the same name and is subsequently not codegenned
because the symbol is already defined)

--


More information about the Digitalmars-d-bugs mailing list