Actions
Bug #13545
closedRuby built by clang 4.0.0 parses Float literal wrongly
Description
$ ./configure --prefix=/home/mame/work/local CC=clang
$ make -j 4 miniruby
$ ./miniruby -e 'p 1.1851510441583988e+30'
1.1851510441583981e+30
See the last digit. While the original literal ends with "8e+30", the result ends with "1e+30". The version of clang is 4.0.0-1ubuntu1.
There seems to be a bug in ruby_strtod
. It manipulates a double variable as an integer variable by using cast. I think that this is undefined behavior, and clang seems to optimize some operations out.
We can fix this issue by adding volatile
to its variable declaration, but I'm unsure if this is a good solution.
diff --git a/util.c b/util.c
index 4ae7c4fc96..ecd55bb0c5 100644
--- a/util.c
+++ b/util.c
@@ -1832,7 +1832,7 @@ d2b(double d_, int *e, int *bits)
static double
ratio(Bigint *a, Bigint *b)
{
- double_u da, db;
+ volatile double_u da, db;
int k, ka, kb;
dval(da) = b2d(a, &ka);
Actions
Like0
Like0Like0Like0Like0