Bug 19626 – RedBlackTree of an enum fails in unittest mode

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P1
Component
phobos
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2019-01-28T18:28:13Z
Last change time
2019-10-18T22:30:16Z
Keywords
pull
Assigned to
No Owner
Creator
Victor Porton

Comments

Comment #0 by porton — 2019-01-28T18:28:13Z
Ubuntu Linux 18.10 $ dmd --version DMD64 D Compiler v2.080.1 The following code does not compile in unittest mode: --- import std.container.rbtree; import std.stdio; enum T { a, b } alias t = RedBlackTree!T; void main() { } --- $ dmd -unittest app.d /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(817): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(991): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1056): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1084): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1085): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1086): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1087): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1111): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1173): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1190): Error: cannot implicitly convert expression `[7, 8, 6, 9, 10, 8]` of type `int[]` to `T[]` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1222): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1227): Error: cannot implicitly convert expression `1` of type `int` to `T` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1227): Error: cannot implicitly convert expression `6` of type `int` to `T` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1266): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1308): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1355): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1447): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int, int, int, int, int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1601): Error: none of the overloads of `this` are callable using argument types `(int, int, int, int, int)`, candidates are: /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1727): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(T[] elems...)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1743): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this()` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1748): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.this(RBNode!(T)* end, ulong length)` /snap/dmd/40/bin/../import/phobos/std/container/rbtree.d(1736): `std.container.rbtree.RedBlackTree!(T, "a < b", false).RedBlackTree.__ctor(Stuff)(Stuff stuff) if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, Elem))` app.d(6): Error: template instance `std.container.rbtree.RedBlackTree!(T, "a < b", false)` error instantiating
Comment #1 by porton — 2019-01-28T18:30:12Z
I forgot to say that it is DMD from Snap store on Ubuntu. 2.080.1
Comment #2 by bugzilla — 2019-10-16T10:46:19Z
The bug can be found in ``` static if (is(typeof(less) == string)) { private enum doUnittest = isIntegral!T && (less == "a < b" || less $ } else enum doUnittest = false; ``` This is currently lines 750-755 in rbtree.d. The check "isIntegral!T" is too weak. It's assumed, that this implies T contains the numbers from 1 to 5. The check should test, whether T contains these numbers.
Comment #3 by dlang-bot — 2019-10-16T13:53:34Z
@berni44 created dlang/phobos pull request #7232 "Fix issue 19626 - RedBlackTree of an enum fails in unittest mode" fixing this issue: - Fix issue 19626 - RedBlackTree of an enum fails in unittest mode https://github.com/dlang/phobos/pull/7232
Comment #4 by dlang-bot — 2019-10-18T22:30:16Z
dlang/phobos pull request #7232 "Fix issue 19626 - RedBlackTree of an enum fails in unittest mode" was merged into master: - 79ef683f5ca423b1e62dfbe9267b563e988bf6c3 by Bernhard Seckinger: Fix issue 19626 - RedBlackTree of an enum fails in unittest mode https://github.com/dlang/phobos/pull/7232