toChars Bug?

2017-12-12 Thread Bottled Gin via Digitalmars-d

Greetings

This small code snippet works:

//
import std.conv;
import std.stdio;

void main() {
  writeln(toChars!10(45));
}


But if I change toChars!10 with toChars!2, I get:

/tmp/test.d(6): Error: template std.conv.toChars cannot deduce 
function from argument types !(2)(int), candidates are:
[snip]std/conv.d(6020):std.conv.toChars(ubyte radix = 10, 
Char = char, LetterCase letterCase = LetterCase.lower, T)(T 
value) if ((radix == 2 || radix == 8 || radix == 10 || radix == 
16) && (is(Unqual!T == uint) || is(Unqual!T == ulong) || radix == 
10 && (is(Unqual!T == int) || is(Unqual!T == long


toChars!8 and toChars!16 do not work either.


Re: toChars Bug?

2017-12-12 Thread ketmar via Digitalmars-d

see documentation: http://dpldocs.info/experimental-docs/std.conv.toChars.html

"...Can be uint or ulong. If radix is 10, can also be int or long."

45 is int, not uint. so no radices except `10` will work.


Re: toChars Bug?

2017-12-12 Thread John Colvin via Digitalmars-d

On Tuesday, 12 December 2017 at 12:49:32 UTC, ketmar wrote:
see documentation: 
http://dpldocs.info/experimental-docs/std.conv.toChars.html


"...Can be uint or ulong. If radix is 10, can also be int or 
long."


45 is int, not uint. so no radices except `10` will work.


I think it would be possible to alter toChars such that it had a 
set of overloads, such that value range propagation would allow 
an implicit conversion here.


Re: toChars Bug?

2017-12-12 Thread ketmar via Digitalmars-d

p.s.: but no, i am wrong.

foo(-42);

this is perfectly valid for `foo (uint n)`, as D converts negative ints to 
uints without any warnings.


so no, overloads won't fit.


Re: toChars Bug?

2017-12-12 Thread ketmar via Digitalmars-d

John Colvin wrote:


On Tuesday, 12 December 2017 at 12:49:32 UTC, ketmar wrote:
see documentation: 
http://dpldocs.info/experimental-docs/std.conv.toChars.html


"...Can be uint or ulong. If radix is 10, can also be int or long."

45 is int, not uint. so no radices except `10` will work.


I think it would be possible to alter toChars such that it had a set of 
overloads, such that value range propagation would allow an implicit 
conversion here.


yeah, i think that overloads with explicit `uint` and `ulong` args should 
take care of that.


Re: toChars Bug?

2017-12-12 Thread John Colvin via Digitalmars-d

On Tuesday, 12 December 2017 at 15:19:48 UTC, ketmar wrote:

p.s.: but no, i am wrong.

foo(-42);

this is perfectly valid for `foo (uint n)`, as D converts 
negative ints to uints without any warnings.


so no, overloads won't fit.


hmm yes, it seems it is not possible.


Re: toChars Bug?

2017-12-12 Thread Steven Schveighoffer via Digitalmars-d

On 12/12/17 7:49 AM, ketmar wrote:
see documentation: 
http://dpldocs.info/experimental-docs/std.conv.toChars.html


"...Can be uint or ulong. If radix is 10, can also be int or long."

45 is int, not uint. so no radices except `10` will work.


So, the answer is:

toChars!2(45u);

BTW, I find this limitation is a bad code smell. IFTI needs some design 
thought on how to deal with literals.


-Steve