Thread overview
toChars Bug?
Dec 12
ketmar
Dec 12
ketmar
Dec 12
ketmar
December 12
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.
December 12
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.
December 12
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.
December 12
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.
December 12
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.
December 12
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.
December 12
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