digitalmars.D.bugs - [Issue 20539] New: std.conv.to: internal overload conflict for enums
- d-bugmail puremagic.com (53/53) Jan 27 2020 https://issues.dlang.org/show_bug.cgi?id=20539
https://issues.dlang.org/show_bug.cgi?id=20539 Issue ID: 20539 Summary: std.conv.to: internal overload conflict for enums with base types that have a catch-all opEquals overload (?) Product: D Version: D2 Hardware: x86_64 OS: Linux Status: NEW Severity: minor Priority: P1 Component: phobos Assignee: nobody puremagic.com Reporter: asumface gmail.com I've got my code reduced down to this with the help of dustmite: import std.conv : to; struct Vector() { bool opEquals(U)(U) { return true; } } Vector!() read_color_string(const(char)[] input) { enum css_colors { red = Vector!()() } return input.to!css_colors; } The error given is: /dlang/dmd/linux/bin64/../../src/phobos/std/conv.d(222): Error: std.conv.toImpl called with argument types (const(char)[]) matches both: /dlang/dmd/linux/bin64/../../src/phobos/std/conv.d(1894): std.conv.toImpl!(css_colors, const(char)[]).toImpl(const(char)[] value) and: /dlang/dmd/linux/bin64/../../src/phobos/std/conv.d(2011): std.conv.toImpl!(css_colors, const(char)[]).toImpl(const(char)[] value) onlineapp.d(18): Error: template instance std.conv.to!(css_colors).to!(const(char)[]) error instantiating The message omits the constraints, the first overload's full signature is: private T toImpl(T, S)(S value) if (isInputRange!S && isSomeChar!(ElementEncodingType!S) && !isExactSomeString!T && is(typeof(parse!T(value)))) and the second's: private T toImpl(T, S)(S value) if (is(T == enum) && !is(S == enum) && is(typeof(value == OriginalType!T.init)) && !isFloatingPoint!(OriginalType!T) && !isSomeString!(OriginalType!T)) I believe both functions would handle this case correctly, not sure what constraints opEquals touches to create this pathological case. --
Jan 27 2020