[Issue 20539] New: std.conv.to: internal overload conflict for enums with base types that have a catch-all opEquals overload (?)
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Jan 27 18:25:43 UTC 2020
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 at puremagic.com
Reporter: asumface at 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.
--
More information about the Digitalmars-d-bugs
mailing list