http://d.puremagic.com/issues/show_bug.cgi?id=8729


monarchdo...@gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |monarchdo...@gmail.com


--- Comment #1 from monarchdo...@gmail.com 2012-09-26 13:48:08 PDT ---
(In reply to comment #0)
> This code
> 
> import std.conv;
> import std.stdio;
> 
> void main()
> {
>     auto str = "123 456.7 false";
> 
>     auto i = parse!int(str);
>     auto d = parse!double(str);
>     auto b = parse!bool(str);
> 
>     assert(i == 123);
>     assert(d == 456.7);
>     assert(b == false);
> }
> 
> results in this exception when you run it
> 
> std.conv.ConvException@std/conv.d(2654): Can't parse string: bool should be
> case-insensive 'true' or 'false'
> ----------------
> ./q(bool std.conv.parse!(bool, immutable(char)[]).parse(ref
> immutable(char)[])+0x183) [0x43867b]
> ./q(_Dmain+0x42) [0x430ec2]
> ./q(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x1c) [0x43b240]
> ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void
> delegate())+0x2a) [0x43abba]
> ./q(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x3b) [0x43b287]
> ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void
> delegate())+0x2a) [0x43abba]
> ./q(main+0xd1) [0x43ab45]
> /usr/lib/libc.so.6(__libc_start_main+0xf5) [0x7fd238fc1725]
> ----------------
> 
> If you change it to
> 
> import std.conv;
> import std.stdio;
> 
> void main()
> {
>     auto str = "false 123 456.7";
> 
>     auto b = parse!bool(str);
>     auto i = parse!int(str);
>     auto d = parse!double(str);
> 
>     assert(i == 123);
>     assert(d == 456.7);
>     assert(b == false);
> }
> 
> you get
> 
> std.conv.ConvException@std/conv.d(1771): Unexpected ' ' when converting from
> type string to type int
> ----------------
> ./q(int std.conv.parse!(int, immutable(char)[]).parse(ref
> immutable(char)[])+0x1b8) [0x431984]
> ./q(_Dmain+0x33) [0x430eb3]
> ./q(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x1c) [0x43b240]
> ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void
> delegate())+0x2a) [0x43abba]
> ./q(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x3b) [0x43b287]
> ./q(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void
> delegate())+0x2a) [0x43abba]
> ./q(main+0xd1) [0x43ab45]
> /usr/lib/libc.so.6(__libc_start_main+0xf5) [0x7f1286cc0725]
> ----------------
> 
> Just parsing out bool when it's first and then parsing _nothing_ else works,
> but it seems like parsing it under any other circumstances fails (from what I
> can tell anyway).

Sounds like the implementation is looking for a literal "true" or "false", and
is forgetting to skip leading ws.

This works:

import std.conv;
import std.stdio;

void main()
{
   auto str = "123 456.7 false";

   auto i = parse!int(str);
   auto d = parse!double(str);
   str = str[1..$]; //manually skip ws.
   auto b = parse!bool(str);

   assert(i == 123);
   assert(d == 456.7);
   assert(b == false);
}

I can look into it for next week, unless somebody else solves it by then.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------

Reply via email to