www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - The BUG the size of China - std.conv.d - Target parse(Target,

reply John Carter <john.carter taitradio.com> writes:
So whilst attempt to convert from a hex string (without the 0x) 
to int I bumped into the    BUG    the size of China....

https://github.com/D-Programming-Language/phobos/blob/master/std/conv.d#L2270

Is there a bugzilla issue number tracking this?

Searching for conv and parse  in the issue tracker didn't turn it 
up....

Is this a phobos bug or a compiler bug?

I followed the example in the unit test to get a workaround.... 
but I don't understand why the workaround works!
Dec 07 2015
next sibling parent reply anonymous <anonymous example.com> writes:
On 07.12.2015 21:56, John Carter wrote:
 So whilst attempt to convert from a hex string (without the 0x) to int I
 bumped into the    BUG    the size of China....

 https://github.com/D-Programming-Language/phobos/blob/master/std/conv.d#L2270


 Is there a bugzilla issue number tracking this?

 Searching for conv and parse  in the issue tracker didn't turn it up....

 Is this a phobos bug or a compiler bug?

 I followed the example in the unit test to get a workaround.... but I
 don't understand why the workaround works!
I'm not sure if there's a bug. `parse` takes the string via `ref`, but string literals are not lvalues so they cannot be passed that way. This should also make it clear why the workaround works: A string literal is not an lvalue, but a variable is. Maybe whoever added that note thinks that string literals should be lvalues. That would make it a compiler bug. I think that would be a controversial viewpoint, though. Or the author thinks that `parse` should work with non-lvalues. That would make it a phobos issue. We have std.conv.to for that, though. So weakening the requirements on `parse` isn't exactly necessary. Just use `to` when you don't care about popping the input.
Dec 07 2015
parent reply Steven Schveighoffer <schveiguy yahoo.com> writes:
On 12/7/15 5:32 PM, anonymous wrote:
 On 07.12.2015 21:56, John Carter wrote:
 So whilst attempt to convert from a hex string (without the 0x) to int I
 bumped into the    BUG    the size of China....

 https://github.com/D-Programming-Language/phobos/blob/master/std/conv.d#L2270



 Is there a bugzilla issue number tracking this?

 Searching for conv and parse  in the issue tracker didn't turn it up....

 Is this a phobos bug or a compiler bug?

 I followed the example in the unit test to get a workaround.... but I
 don't understand why the workaround works!
I'm not sure if there's a bug. `parse` takes the string via `ref`, but string literals are not lvalues so they cannot be passed that way. This should also make it clear why the workaround works: A string literal is not an lvalue, but a variable is. Maybe whoever added that note thinks that string literals should be lvalues. That would make it a compiler bug. I think that would be a controversial viewpoint, though.
https://github.com/D-Programming-Language/phobos/commit/406bbbb9b485c01eb3afeada056ffb46924ee06b I doubt Andrei thinks string literals should be lvalues. It's an old bug, if it still exists. But in any case, the description is terrible. A real bug report should be filed. -Steve
Dec 07 2015
parent reply tsbockman <thomas.bockman gmail.com> writes:
On Monday, 7 December 2015 at 22:38:03 UTC, Steven Schveighoffer 
wrote:
 It's an old bug, if it still exists. But in any case, the 
 description is terrible. A real bug report should be filed.

 -Steve
Filed (https://issues.dlang.org/show_bug.cgi?id=15419) and fixed (https://github.com/D-Programming-Language/phobos/pull/3861). Someone still needs to review the PR, though.
Dec 07 2015
parent John Carter <john.carter taitradio.com> writes:
On Tuesday, 8 December 2015 at 00:40:29 UTC, tsbockman wrote:

 Someone still needs to review the PR, though.
Thanks! Looks like it's been merged already. It was a double problem... I failed to read the bit about advancing the ref and then the old big BUG comment in the unit test made me think it was a bug. Thanks! Great response, I appreciate it!
Dec 08 2015
prev sibling parent tsbockman <thomas.bockman gmail.com> writes:
On Monday, 7 December 2015 at 20:56:24 UTC, John Carter wrote:
 So whilst attempt to convert from a hex string (without the 0x) 
 to int I bumped into the    BUG    the size of China....

 https://github.com/D-Programming-Language/phobos/blob/master/std/conv.d#L2270

 Is there a bugzilla issue number tracking this?

 Searching for conv and parse  in the issue tracker didn't turn 
 it up....

 Is this a phobos bug or a compiler bug?

 I followed the example in the unit test to get a workaround.... 
 but I don't understand why the workaround works!
Despite the note in the unittest, it's actually not a bug after all - parse is just designed for a different use case than yours. What you want is T std.conv.to(T, S)(S value, uint radix). For example, this works fine: import std.conv; foreach (i; 2..37) { assert(to!int("0", i) == 0); assert(to!int("1", i) == 1); assert(to!byte("10", i) == i); } Or using UFCS, if you prefer: import std.conv; foreach (i; 2..37) { assert("0".to!int(i) == 0); assert("1".to!int(i) == 1); assert("10".to!byte(i) == i); } The technical reason that the compiler won't let you use parse that way, is that its first argument is annotated with ref and cannot accept rvalues for memory safety reasons.
Dec 07 2015