[Issue 17541] New: @nogc template deduction problem (codegen different from .mangleof)
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Fri Jun 23 03:55:31 PDT 2017
https://issues.dlang.org/show_bug.cgi?id=17541
Issue ID: 17541
Summary: @nogc template deduction problem (codegen different
from .mangleof)
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: johanengelen at weka.io
I unfortunately only have a complex testcase for this issue (after long
dustmiting sessions and manual reduction), involving three files (one.d, two.d,
three.d).
When only `one.d` is compiled, function `three.TT!(int).insertabcdefg(int)` is
deduced to be `@nogc`. But the deduction happens late, and printing `.mangleof`
does not show it. The symbol in the object file does show `@nogc` in the
mangling.
When `one.d` and `two.d` are compiled simultaneously (with or without
`three.d`), the function is no longer deduced to be `@nogc`.
(The bug was found in Weka's codebase where everything-at-once compilation is
impossible, and where per-package compilation is done. The testcase is heavily
simplified.)
Details:
Only compiling one.d gives:
> dmd one.d -c -of=tmp1.o
_D5three9__T2TTTiZ2TT13insertabcdefgMFiZv
> nm tmp1.o | grep "insertabcdefg"
0000000000000358 S _D5three9__T2TTTiZ2TT13insertabcdefgMFNiiZv
Compiling all three at once gives:
> dmd one.d two.d three.d -c -of=tmp2.o
_D5three9__T2TTTiZ2TT13insertabcdefgMFiZv
> nm tmp2.o | grep "insertabcdefg"
0000000000000460 S _D5three9__T2TTTiZ2TT13insertabcdefgMFiZv
File one.d
```````````````````````````
module one;
import two;
import three;
struct BB
{
enum MAX_NUM_FIBERS = 4096;
TWOR!1 t;
TT!(int) tt;
auto foo()
{
tt.insertabcdefg(1);
}
}
BB bb;
```````````````````````````
File two.d
```````````````````````````
module two;
import one;
struct ET(bool a)
{
enum e = BB.MAX_NUM_FIBERS;
}
alias Event = ET!false;
struct TWOR(size_t M)
{
Event e;
void open()
{
bb.foo();
}
}
```````````````````````````
File three.d
```````````````````````````
module three;
void aaa() @nogc
{
}
struct TT(T)
{
void insertabcdefg(T) // @nogc <-- deduction problem
{
pragma(msg, insertabcdefg.mangleof);
aaa();
}
}
```````````````````````````
--
More information about the Digitalmars-d-bugs
mailing list