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.