[Issue 17605] New: __traits(compiles, closure) adds link-time reference to _d_allocmemory
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Wed Jul 5 10:11:50 PDT 2017
https://issues.dlang.org/show_bug.cgi?id=17605
Issue ID: 17605
Summary: __traits(compiles, closure) adds link-time reference
to _d_allocmemory
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: petar.p.kirov at gmail.com
While playing with '-betterC', and investigating which parts of the language
are usable without the compiler emitting link-time references to druntime, I
noticed that the following code:
---
extern (C) void main()
{
int a;
enum bool works = __traits(compiles, { a = 1; });
a = 1;
}
---
Produces an undefined reference to _d_allocmemory from druntime:
$ dmd --version
DMD64 D Compiler v2.074.1-master-de3cb1a
(This is dmd nightly from 2017-07-05.)
$ dmd -c -betterC test.d && nm test.o
0000000000000000 t
U _d_allocmemory
U _GLOBAL_OFFSET_TABLE_
0000000000000000 W main
While the following does not:
---
extern (C) void main()
{
int a;
a = 1;
}
---
---
// Also ok, as long as no closure-allocating lambdas
// are used
extern (C) void main()
{
int a;
enum bool works = __traits(compiles, a = 1);
pragma (msg, works);
a = 1;
}
---
$ dmd -c -betterC test.d && nm test.o
0000000000000000 t
U _GLOBAL_OFFSET_TABLE_
0000000000000000 W main
The result is also reproducible on Windows:
> dmd --version
DMD32 D Compiler v2.075.0-b1
Copyright (c) 1999-2017 by Digital Mars written by Walter Bright
> dmd -c -betterC -m32mscoff test.d
$ nm test.obj
0000000000000000 b .bss$B
U _d_allocmemory
0000000000000000 d .data$B
0000000000000000 N .debug$S
0000000000000000 i .drectve
0000000000000000 T main
0000000000000000 p .pdata
0000000000000000 p $pdata$main
0000000000000000 r .rdata
0000000000000000 t .text
0000000000000000 t .text
0000000000000000 r $unwind$main
0000000000000000 r .xdata
--
More information about the Digitalmars-d-bugs
mailing list