FreeBSD build broken following _Static_assert commit
On FreeBSD 10.1 with clang 3.4.1, a standard "gmake" build now fails with:
libfio.c:309:21: error: static_assert expression is not an integral constant expression
compiletime_assert((offsetof(struct thread_stat,percentile_list) % 8) == 0, "stat percentile_list"); ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^
libfio.c:309:22: note: cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression
compiletime_assert((offsetof(struct thread_stat,
percentile_list) % 8) == 0, "stat percentile_list");
^
./flist.h:10:33: note: expanded from macro 'offsetof'
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
^
./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^libfio.c:310:21: error: static_assert expression is not an integral constant expression
compiletime_assert((offsetof(struct thread_stat,total_run_time) % 8) == 0, "total_run_time"); ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^
libfio.c:310:22: note: cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression
compiletime_assert((offsetof(struct thread_stat,
total_run_time) % 8) == 0, "total_run_time");
^
./flist.h:10:33: note: expanded from macro 'offsetof'
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
^
./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^libfio.c:311:21: error: static_assert expression is not an integral constant expression
compiletime_assert((offsetof(struct thread_stat,total_err_count) % 8) == 0, "total_err_count"); ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^
libfio.c:311:22: note: cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression
compiletime_assert((offsetof(struct thread_stat,
total_err_count) % 8) == 0, "total_err_count");
^
./flist.h:10:33: note: expanded from macro 'offsetof'
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
^
./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^libfio.c:312:21: error: static_assert expression is not an integral constant expression
compiletime_assert((offsetof(struct thread_stat,latency_percentile) % 8) == 0, "stat latency_percentile"); ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^
libfio.c:312:22: note: cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression
compiletime_assert((offsetof(struct thread_stat,
latency_percentile) % 8) == 0, "stat latency_percentile");
^
./flist.h:10:33: note: expanded from macro 'offsetof'
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
^
./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^libfio.c:313:21: error: static_assert expression is not an integral constant expression
compiletime_assert((offsetof(struct thread_options_pack,zipf_theta) % 8) == 0, "zipf_theta"); ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^
libfio.c:313:22: note: cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression
compiletime_assert((offsetof(struct thread_options_pack,
zipf_theta) % 8) == 0, "zipf_theta");
^
./flist.h:10:33: note: expanded from macro 'offsetof'
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
^
./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^libfio.c:314:21: error: static_assert expression is not an integral constant expression
compiletime_assert((offsetof(struct thread_options_pack,pareto_h) % 8) == 0, "pareto_h"); ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^
libfio.c:314:22: note: cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression
compiletime_assert((offsetof(struct thread_options_pack,
pareto_h) % 8) == 0, "pareto_h");
^
./flist.h:10:33: note: expanded from macro 'offsetof'
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
^
./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^libfio.c:315:21: error: static_assert expression is not an integral constant expression
compiletime_assert((offsetof(struct thread_options_pack,percentile_list) % 8) == 0, "percentile_list"); ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^
libfio.c:315:22: note: cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression
compiletime_assert((offsetof(struct thread_options_pack,
percentile_list) % 8) == 0, "percentile_list");
^
./flist.h:10:33: note: expanded from macro 'offsetof'
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
^
./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^libfio.c:316:21: error: static_assert expression is not an integral constant expression
compiletime_assert((offsetof(struct thread_options_pack,latency_percentile) % 8) == 0, "latency_percentile"); ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^
libfio.c:316:22: note: cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression
compiletime_assert((offsetof(struct thread_options_pack,
latency_percentile) % 8) == 0, "latency_percentile");
^
./flist.h:10:33: note: expanded from macro 'offsetof'
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
^
./compiler/compiler.h:39:59: note: expanded from macro 'compiletime_assert'
#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
^8 errors generated.
Signature · 1 line
Bruce
Quoted 6 lines · Bruce Cran
On FreeBSD 10.1 with clang 3.4.1, a standard "gmake" build now fails with:
libfio.c:309:21: error:
static_assertexpression is not an integral constant expression
compiletime_assert((offsetof(structthread_stat,percentile_list) % 8) == 0, "statpercentile_list");
Thanks for reporting this, Bruce. No idea why clang complains about that, it's definitely a constant expression. Anyway, committed this:
http://git.kernel.dk/cgit/fio/commit/?id=94815a5c8366a9290167e8539f29994c2d43d15c
which adds this sort of check to the configure _Static_assert() check.
Signature · 1 line
Jens Axboe
Quoted 6 lines · Jens Axboe
Thanks for reporting this, Bruce. No idea why clang complains about that, it's definitely a constant expression. Anyway, committed this:
http://git.kernel.dk/cgit/fio/commit/?id=94815a5c8366a9290167e8539f29994c2d43d15c
which adds this sort of check to the configure
_Static_assert()check.
It seems the relevant text is:
note: cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression
Is there something about our use of offsetof that means we can't depend on the version from <stddef.h>?
Signature · 1 line
Bruce
Quoted 7 lines · Bruce Cran
Quoted 6 lines · Jens Axboe
Thanks for reporting this, Bruce. No idea why clang complains about that, it's definitely a constant expression. Anyway, committed this:
http://git.kernel.dk/cgit/fio/commit/?id=94815a5c8366a9290167e8539f29994c2d43d15c
Quoted 6 lines
Quoted 1 line
which adds this sort of check to the configure
_Static_assert()check.It seems the relevant text is:
note: cast that performs the conversions of a
reinterpret_castis not allowed in a constant expression
But it's bogus, it's nothing but static pointer math.
Quoted 2 lines
Is there something about our use of offsetof that means we can't depend on the version from <
stddef.h>?
No other reason than having a generic solution is superior to depending on whatever might be supplied with the given system.
Signature · 1 line
Jens Axboe
Quoted 1 line · Jens Axboe
But it's bogus, it's nothing but static pointer math.
Apparently it's a known bug: https://llvm.org/bugs/show_bug.cgi?id=17410 .
It looks like on FreeBSD there's no __compiler_offsetof (which on Linux ends up being defined as __builtin_offsetof) but clang _does_ provide __builtin_offsetof.
Signature · 1 line
Bruce
Quoted 7 lines · Bruce Cran
Quoted 1 line · Jens Axboe
But it's bogus, it's nothing but static pointer math.
Apparently it's a known bug: https://llvm.org/bugs/show_bug.cgi?id=17410 . It looks like on FreeBSD there's no
__compiler_offsetof(which on Linux ends up being defined as__builtin_offsetof) but clang _does_ provide__builtin_offsetof.
I used clang 3.6.0 to reproduce it, so apparently still not fixed. If you want to do a cleanup around what I committed, feel free, but as far as I'm concerned, it's resolved.
Signature · 1 line
Jens Axboe