On 5/4/20 4:26 PM, Philippe Mathieu-Daudé wrote:
When building with Clang 10 on Fedora 32, we get:

   tests/qht-bench.c:287:29: error: implicit conversion from 'unsigned long' to 
'double' changes value from 18446744073709551615 to 18446744073709551616 
[-Werror,-Wimplicit-int-float-conversion]
           *threshold = rate * UINT64_MAX;
                             ~ ^~~~~~~~~~
   /usr/include/stdint.h:130:23: note: expanded from macro 'UINT64_MAX'
   # define UINT64_MAX             (__UINT64_C(18446744073709551615))
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   /usr/include/stdint.h:107:25: note: expanded from macro '__UINT64_C'
   #  define __UINT64_C(c) c ## UL
                           ^~~~~~~
   <scratch space>:14:1: note: expanded from here
   18446744073709551615UL
   ^~~~~~~~~~~~~~~~~~~~~~

Fix by using nextafter() from <math.h>:

   float nextafterf( float from, float to );

       Returns the next representable value of 'from'
       in the direction of 'to'.

Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
---
Cc: Emilio G. Cota <[email protected]>
Cc: Alex Bennée <[email protected]>
Cc: Richard Henderson <[email protected]>
Cc: Alexander Bulekov <[email protected]>
---
  tests/qht-bench.c | 3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tests/qht-bench.c b/tests/qht-bench.c
index e3b512f26f..f93f8e0fe2 100644
--- a/tests/qht-bench.c
+++ b/tests/qht-bench.c
@@ -10,6 +10,7 @@
  #include "qemu/qht.h"
  #include "qemu/rcu.h"
  #include "qemu/xxhash.h"
+#include <math.h>
struct thread_stats {
      size_t rd;
@@ -284,7 +285,7 @@ static void do_threshold(double rate, uint64_t *threshold)
      if (rate == 1.0) {
          *threshold = UINT64_MAX;
      } else {
-        *threshold = rate * UINT64_MAX;
+        *threshold = rate * nextafterf(0x1p64, 0.0);

NAck since of double type. Will send v2.

      }
  }


Reply via email to