dlangBugzillaToGithub / migration_test

0 stars 0 forks source link

[CTFE] compile time parsing of hex floats #711

Open dlangBugzillaToGithub opened 12 years ago

dlangBugzillaToGithub commented 12 years ago

ellery-newcomer reported this on 2012-08-08T12:55:19Z

Transfered from https://issues.dlang.org/show_bug.cgi?id=8523

CC List

Description

doesn't work, but should.

enum string s = "0x9.D70A3D70A3D70A4p-3";
enum d2 = to!real(s);
pragma(msg, d2);

gives me:

/usr/include/dmd-d/std/conv.d(2305): Error: Cannot convert &real to long* at compile time
/usr/include/dmd-d/std/conv.d(1592):        called from here: parse(value)
/usr/include/dmd-d/std/conv.d(268):        called from here: toImpl(_param_0)
test.d(14):        called from here: to("0x9.D70A3D70A3D70A4p-3")
/usr/include/dmd-d/std/conv.d(2305): Error: Cannot convert &real to long* at compile time
/usr/include/dmd-d/std/conv.d(1592):        called from here: parse(value)
/usr/include/dmd-d/std/conv.d(268):        called from here: toImpl(_param_0)
test.d(15):        called from here: to("0x9.D70A3D70A3D70A4p-3")
to("0x9.D70A3D70A3D70A4p-3")

however,

double d = to!real(s);
writeln(d);

compiles and prints

1.23
dlangBugzillaToGithub commented 11 years ago

peter.alexander.au commented on 2013-01-05T12:03:21Z

Added CTFE tag. I don't think there's any sane way to do this without CTFE support for the pointer cast, or at least unions.
dlangBugzillaToGithub commented 9 years ago

clem commented on 2015-05-22T13:05:03Z

pull:
https://github.com/D-Programming-Language/dmd/pull/4674
dlangBugzillaToGithub commented 6 years ago

dbugz commented on 2018-08-07T05:18:05Z

Got rid of all the hex bit-packing in `std.conv.parse`, only missing bit is the call to C's `ldexp`, which still causes this to fail at compile-time. You can replace that with manual exponentiation if wanted to fix this, just as done for decimal strings now.