Bug 5843 – Unable to convert a struct with an alias-this to long/ulong to int, using std.conv.to!int.

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
phobos
Product
D
Version
D2
Platform
Other
OS
Mac OS X
Creation time
2011-04-13T09:03:00Z
Last change time
2012-04-23T10:42:36Z
Keywords
rejects-valid
Assigned to
nobody
Creator
kennytm

Comments

Comment #0 by kennytm — 2011-04-13T09:03:00Z
Test case: ----- import std.stdio; struct S { ulong a; alias a this; } void main() { writeln(S.init); } ----- As of 2.052, this code generates compile-time error with /usr/include/phobos/std/conv.d(99): Error: template std.conv.toImpl(T,S) if (!implicitlyConverts!(S,T) && isSomeString!(T) && isInputRange!(Unqual!(S)) && isSomeChar!(ElementType!(S))) does not match any function template declaration /usr/include/phobos/std/conv.d(99): Error: template std.conv.toImpl(T,S) if (!implicitlyConverts!(S,T) && isSomeString!(T) && isInputRange!(Unqual!(S)) && isSomeChar!(ElementType!(S))) cannot deduce template function from argument types !(int)(S) /usr/include/phobos/std/conv.d(99): Error: template instance errors instantiating template /usr/include/phobos/std/format.d(1630): Error: template instance std.conv.to!(int).to!(S) error instantiating /usr/include/phobos/std/format.d(335): instantiated from here: getNthInt!(S) /usr/include/phobos/std/stdio.d(660): instantiated from here: formattedWrite!(LockingTextWriter,immutable(char),S) /usr/include/phobos/std/stdio.d(1493): instantiated from here: write!(S,char) x.d(9): instantiated from here: writeln!(S) /usr/include/phobos/std/format.d(335): Error: template instance std.format.getNthInt!(S) error instantiating /usr/include/phobos/std/stdio.d(660): instantiated from here: formattedWrite!(LockingTextWriter,immutable(char),S) /usr/include/phobos/std/stdio.d(1493): instantiated from here: write!(S,char) x.d(9): instantiated from here: writeln!(S)
Comment #1 by kennytm — 2011-06-02T10:28:36Z
The underlying problem is to!int of the struct isn't defined. ------------------------- import std.conv; struct SSSS { long a; alias a this; } void main() { to!int(SSSS.init); } ------------------------- /usr/include/phobos/std/conv.d(99): Error: template std.conv.toImpl(T,S) if (!implicitlyConverts!(S,T) && isSomeString!(T) && isInputRange!(Unqual!(S)) && isSomeChar!(ElementType!(S))) does not match any function template declaration /usr/include/phobos/std/conv.d(99): Error: template std.conv.toImpl(T,S) if (!implicitlyConverts!(S,T) && isSomeString!(T) && isInputRange!(Unqual!(S)) && isSomeChar!(ElementType!(S))) cannot deduce template function from argument types !(int)(SSSS) /usr/include/phobos/std/conv.d(99): Error: template instance errors instantiating template x.d(7): Error: template instance std.conv.to!(int).to!(SSSS) error instantiating -------------------------
Comment #2 by lovelydear — 2012-04-23T09:06:43Z
Both examples compile and run with 2.059 Win32. The first one displays 0.
Comment #3 by k.hara.pg — 2012-04-23T10:42:36Z
In 2.059, std.format module treats alias this type properly. It was fixed by the pull request: https://github.com/D-Programming-Language/phobos/pull/488