Bug 9559 – Range of Nullable doesn't work with std.array.array
Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
phobos
Product
D
Version
D2
Platform
All
OS
All
Creation time
2013-02-21T11:24:00Z
Last change time
2013-08-28T01:40:53Z
Assigned to
nobody
Creator
justin
Comments
Comment #0 by justin — 2013-02-21T11:24:22Z
Using std.array.array on a range of Nullable!T causes a runtime error if at least one of the elements is set to null. Test case:
----------------------
import std.algorithm;
import std.typecons;
void main()
{
alias Nullable!int I;
auto ints = [0, 1, 2].map!(i => i & 1 ? I.init : I(i));
auto asArray = std.array.array(ints);
}
----------------------
Produces the following error:
object.Exception@/usr/include/dmd/phobos/std/typecons.d(1181): Enforcement failed
Full backtrace here: http://pastebin.com/wMFRKk6L
The enforcement exception occurs in Nullable's get() function (I'm using 2.062, I noticed that this has been changed to an assert in HEAD) and Nullable has an alias this to get. Best guess is that this is actually a problem in emplace or array's usage of it.
Comment #1 by justin — 2013-02-21T12:00:31Z
I don't have a good testing environment at the moment, but it looks like the bug might be here: https://github.com/D-Programming-Language/phobos/blob/master/std/conv.d#L3581
If I understand this correctly, this static if will succeed because the Nullable!int constructor will accept another Nullable!int due to the alias this. When the constructor is called, the alias this causes the get() function to be called in order to resolve the Nullable being copied to an int.
Possible fix: add a constructor to Nullable that takes typeof(this) and correctly checks isNull.
(In reply to comment #2)
> (In reply to comment #1)
> > I don't have a good testing environment at the moment, but it looks like the
> > bug might be here:
> > https://github.com/D-Programming-Language/phobos/blob/master/std/conv.d#L3581
> >
> > If I understand this correctly, this static if will succeed because the
> > Nullable!int constructor will accept another Nullable!int due to the alias
> > this. When the constructor is called, the alias this causes the get() function
> > to be called in order to resolve the Nullable being copied to an int.
> >
> > Possible fix: add a constructor to Nullable that takes typeof(this) and
> > correctly checks isNull.
>
> This gets fixed by my existing fix for emplace.
>
> The pull is here:
> https://github.com/D-Programming-Language/phobos/pull/1082
>
> And I just added a unittest for this specific bug:
> https://github.com/monarchdodra/phobos/commit/10025b835e564d17fd960d461e965e9bb80d115d
Excellent. I'd love to see this in the next release. Unfortunately, it looks like the use of UFCS in my test case is causing the auto-tester to choke.
Comment #4 by github-bugzilla — 2013-08-28T01:35:19Z