ITADN

Build failure against libstdc++ 14.2

#283Opennickdesaulniers 创建于 2025-06-25
N
nickdesaulnierscommented
Building against libstdc++14.2 fails: ``` external/tcmalloc+/tcmalloc/parameters.cc:253:17: error: variable does not have a constant initializer 253 | Parameters::per_cpu_caches_dynamic_slab_shrink_threshold_(0.4); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ external/tcmalloc+/tcmalloc/parameters.cc:252:1: note: required by 'constinit' specifier here 252 | ABSL_CONST_INIT std::atomic<double> | ^~~~~~~~~~~~~~~ external/abseil-cpp+/absl/base/attributes.h:755:25: note: expanded from macro 'ABSL_CONST_INIT' 755 | #define ABSL_CONST_INIT constinit | ^~~~~~~~~ [redacted]/14.2.0/include/c++/bits/atomic_base.h:1286:9: note: non-constexpr function '__clear_padding<double>' cannot be used in a constant expression 1286 | { __atomic_impl::__clear_padding(_M_fp); } | ^ [redacted]/14.2.0/../../../gcc/x86_64-conda-linux-gnu/14.2.0/include/c++/atomic:1644:38: note: in call to '__atomic_float(4.000000e-01)' 1644 | atomic(double __fp) noexcept : __atomic_float<double>(__fp) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ external/tcmalloc+/tcmalloc/parameters.cc:253:17: note: in call to 'atomic(4.000000e-01)' 253 | Parameters::per_cpu_caches_dynamic_slab_shrink_threshold_(0.4); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [redacted]/14.2.0/include/c++/bits/atomic_base.h:972:7: note: declared here 972 | __clear_padding(_Tp& __val) noexcept | ^ ``` FWICT, I think libstdc++ _had_ a bug in their 14.2 release where their `std::atomic` maybe wasn't `constinit`. This appears fixed in their 14.3 release (hence me not searching their issue tracker for a reference). https://godbolt.org/z/b1bxeGzcY I don't know if I'd call this a bug in abseil's `ABSL_CONST_INIT`; it's moreso a (now fixed) bug in libstdc++. Maybe the answer is just "move to newer libstdc++ (there is 14.3, and 15.1) or libc++." But figured I'd file this in case compatibility with 14.2 is important. One way to work around this, if libstdc++ exposes version info via preprocessor define, is to wrap `ABSL_CONST_INIT` when using it on `std::atomic`, I *think*.
0 条评论