Bug 13167 – Link errors with std.variant

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Mac OS X
Creation time
2014-07-20T17:42:42Z
Last change time
2020-06-13T19:31:32Z
Assigned to
No Owner
Creator
Andrei Alexandrescu

Comments

Comment #0 by andrei — 2014-07-20T17:42:42Z
Consider (also http://dpaste.dzfl.pl/051bb1357bba): import std.variant; alias Payload = Algebraic!( bool, double, string ); struct Value { private Payload payload; this(T)(T v) { payload = Payload(v); } bool opEquals(T)(auto ref T v) { return payload == v; } } void main() {} This code causes the following link errors: Undefined symbols for architecture x86_64: "_D3std7variant71__T8VariantNVmi16TnTbTdTAyaTAS3std7variant4ThisTHAyaS3std7variant4ThisZ8VariantN06__ctorMFNcNeS3bug5ValueZS3std7variant71__T8VariantNVmi16TnTbTdTAyaTAS3std7variant4ThisTHAyaS3std7variant4ThisZ8VariantN", referenced from: _D3bug5Value23__T6__ctorTS3bug5ValueZ6__ctorMFNcNfS3bug5ValueZS3bug5Value in bug.o "_D3std7variant71__T8VariantNVmi16TnTbTdTAyaTAS3std7variant4ThisTHAyaS3std7variant4ThisZ8VariantN08opEqualsMxFNbNeKS3bug5ValueZb", referenced from: _D3bug5Value25__T8opEqualsTS3bug5ValueZ8opEqualsMFNfKS3bug5ValueZb in bug.o After passing through ddemangle: Undefined symbols for architecture x86_64: "ref @trusted std.variant.VariantN!(16uL, bool, double, immutable(char)[]).VariantN std.variant.VariantN!(16uL, bool, double, immutable(char)[]).VariantN.__ctor(bug.Value)", referenced from: ref @safe bug.Value bug.Value.__ctor!(bug.Value).__ctor(bug.Value) in bug.o "const(nothrow @trusted bool function(ref bug.Value)) std.variant.VariantN!(16uL, bool, double, immutable(char)[]).VariantN.opEquals", referenced from: @safe bool bug.Value.opEquals!(bug.Value).opEquals(ref bug.Value) in bug.o Commenting out the constructor makes the first undefined reference error go away. Commenting out opEquals makes both errors go away.
Comment #1 by growlercab — 2015-02-19T05:23:49Z
I have the same problem with this example: --- import std.variant; void main() { Variant a = true; } --- /tmp/.rdmd-1000/rdmd-hack.d-C187E56C4E00B02558F23ECBE6067626/objs/hack.o: In function `_D3std7variant18__T8VariantNVmi32Z8VariantN14__T7handlerTbZ7handlerFNeE3std7variant18__T8VariantNVmi32Z8VariantN4OpIDPG32hPvZl': hack.d:(.text._D3std7variant18__T8VariantNVmi32Z8VariantN14__T7handlerTbZ7handlerFNeE3std7variant18__T8VariantNVmi32Z8VariantN4OpIDPG32hPvZl+0x30d): undefined reference to `_D3std4conv11__T2toTAyaZ9__T2toTbZ2toFbZAya' collect2: error: ld returned 1 exit status --- errorlevel 1 Demangled /tmp/.rdmd-1000/rdmd-hack.d-C187E56C4E00B02558F23ECBE6067626/objs/hack.o: In function `@trusted long std.variant.VariantN!(32uL).VariantN.handler!(bool).handler(std.variant.VariantN!(32uL).VariantN.OpID, ubyte[32]*, void*)': hack.d:(.text.@trusted long std.variant.VariantN!(32uL).VariantN.handler!(bool).handler(std.variant.VariantN!(32uL).VariantN.OpID, ubyte[32]*, void*)+0x30d): undefined reference to `immutable(char)[] std.conv.to!(immutable(char)[]).to!(bool).to(bool)' collect2: error: ld returned 1 exit status --- errorlevel 1
Comment #2 by growlercab — 2015-02-19T05:27:38Z
Sorry, I just noticed the date on this bug. I am using DMD 2.67-b2 on Arch linux x86-64 DMD 2.066.1 works DMD 2.067-b2 fails with the linker error. (In reply to growlercab from comment #1) > I have the same problem with this example: > > --- > import std.variant; > void main() > { > Variant a = true; > > } > --- > > /tmp/.rdmd-1000/rdmd-hack.d-C187E56C4E00B02558F23ECBE6067626/objs/hack.o: In > function > `_D3std7variant18__T8VariantNVmi32Z8VariantN14__T7handlerTbZ7handlerFNeE3std7 > variant18__T8VariantNVmi32Z8VariantN4OpIDPG32hPvZl': > hack.d:(.text. > _D3std7variant18__T8VariantNVmi32Z8VariantN14__T7handlerTbZ7handlerFNeE3std7v > ariant18__T8VariantNVmi32Z8VariantN4OpIDPG32hPvZl+0x30d): undefined > reference to `_D3std4conv11__T2toTAyaZ9__T2toTbZ2toFbZAya' > collect2: error: ld returned 1 exit status > --- errorlevel 1 > > > Demangled > > /tmp/.rdmd-1000/rdmd-hack.d-C187E56C4E00B02558F23ECBE6067626/objs/hack.o: In > function `@trusted long > std.variant.VariantN!(32uL).VariantN.handler!(bool).handler(std.variant. > VariantN!(32uL).VariantN.OpID, ubyte[32]*, void*)': > hack.d:(.text.@trusted long > std.variant.VariantN!(32uL).VariantN.handler!(bool).handler(std.variant. > VariantN!(32uL).VariantN.OpID, ubyte[32]*, void*)+0x30d): undefined > reference to `immutable(char)[] > std.conv.to!(immutable(char)[]).to!(bool).to(bool)' > collect2: error: ld returned 1 exit status > --- errorlevel 1
Comment #3 by k.hara.pg — 2015-02-19T14:59:41Z
(In reply to growlercab from comment #2) > Sorry, I just noticed the date on this bug. > > I am using DMD 2.67-b2 on Arch linux x86-64 > > DMD 2.066.1 works > DMD 2.067-b2 fails with the linker error. If something is unreasonably broken, it is a regression. I separated the issue into: https://issues.dlang.org/show_bug.cgi?id=14198
Comment #4 by growlercab — 2015-02-20T05:42:47Z
@Kenji: Thanks for doing that, I wasn't sure.
Comment #5 by snarwin+bugzilla — 2020-06-13T19:31:32Z
The given example compiles and links successfully as of DMD 2.092.0.