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.