Repository: bitcoin/bitcoin (language: cpp)

Issue:
build: Boost 1.74.0 incompatible with Clang 18
Pointed out here: https://github.com/bitcoin/bitcoin/pull/30739#pullrequestreview-2267576746.
Compiling with Clang 18 and Boost 1.74.0 fails:
```bash
In file included from /usr/include/boost/mpl/integral_c.hpp:32:
/usr/include/boost/mpl/aux_/integral_wrapper.hpp:73:31: error: integer value -1 is outside the valid range of values [0, 3] for the enumeration type 'udt_builtin_mixture_enum' [-Wenum-constexpr-conversion]
   73 |     typedef AUX_WRAPPER_INST( BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (value - 1)) ) prior;
      |                               ^
/usr/include/boost/mpl/aux_/static_cast.hpp:24:47: note: expanded from macro 'BOOST_MPL_AUX_STATIC_CAST'
   24 | #   define BOOST_MPL_AUX_STATIC_CAST(T, expr) static_cast<T>(expr)
      |                                               ^
In file included from ../../../src/test/validation_chainstatemanager_tests.cpp:8:
In file included from ../../../src/node/chainstatemanager_args.h:9:
In file included from ../../../src/validation.h:28:
In file included from ../../../src/txmempool.h:26:
In file included from /usr/include/boost/multi_index/hashed_index.hpp:38:
In file included from /usr/include/boost/multi_index/detail/node_handle.hpp:22:
In file included from /usr/include/boost/multi_index_container_fwd.hpp:18:
In file included from /usr/include/boost/multi_index/indexed_by.hpp:17:
In file included from /usr/include/boost/mpl/vector.hpp:36:
In file included from /usr/include/boost/mpl/vector/vector20.hpp:18:
In file included from /usr/include/boost/mpl/vector/vector10.hpp:18:
In file included from /usr/include/boost/mpl/vector/vector0.hpp:24:
In file included from /usr/include/boost/mpl/vector/aux_/clear.hpp:18:
In file included from /usr/include/boost/mpl/vector/aux_/vector0.hpp:22:
In file included from /usr/include/boost/mpl/vector/aux_/iterator.hpp:19:
In file included from /usr/include/boost/mpl/plus.hpp:19:
In file included from /usr/include/boost/mpl/aux_/arithmetic_op.hpp:17:
In file included from /usr/include/boost/mpl/integral_c.hpp:32:
/usr/include/boost/mpl/aux_/integral_wrapper.hpp:73:31: error: integer value -1 is outside the valid range of values [0, 3] for the enumeration type 'int_float_mixture_enum' [-Wenum-constexpr-conversion]
/usr/include/boost/mpl/aux_/static_cast.hpp:24:47: note: expanded from macro 'BOOST_MPL_AUX_STATIC_CAST'
   24 | #   define BOOST_MPL_AUX_STATIC_CAST(T, expr) static_cast<T>(expr)
      |                                               ^
2 errors generated.
```

The same failure does not happen with GCC (12), but may do with later versions: https://sourceware.org/bugzilla/show_bug.cgi?id=31331.

Given our documentation currently claims that Boost `1.73.0` is supported, this should be fixed in some way, the documentation updated to drop support for this version, etc. Although, it looks like part of the fix for the Boost code only landed as of 1.86.0? https://github.com/boostorg/mpl/issues/69 (currently the latest release).


Discussion / hints:
> Boost code only landed as of 1.86.0?

Ugh. I guess depends can be bumped, but using that as the minimum requirement seems a bit strict.

While this is technically UB, is it actually observable in the compiled `bitcoind`?
> Compiling with Clang 18 and Boost 1.74.0 fails:

Clang 18 is used for macOS targets in Guix. Why does it work?
Because it's not using 1.74.0? The change to Boost Numeric in 1.81.0 may be enough to avoid the issue.
Maybe the fixes can be reverted, then an objdump of `bitcoind` can be compared to see if it differs? If not, then it could be dead code that just happens to be compiled.

In that case, maybe turning the error into a warning could be an alternative?
can confirm this issue exists with boost 1.76 as well, under the same environment.
Fwiw, I also ran across this problem (Ubuntu 20.04) while trying to run `clang-tidy-diff` on my code. A workaround is to just install and use clang-17.
```
cmake -B build -DCMAKE_C_COMPILER=clang-17 -DCMAKE_CXX_COMPILER=clang++-17 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
cmake --build build -j $(nproc)
git diff HEAD~2 | ( cd ./src/ && clang-tidy-diff -p2 -path ../build -j $(nproc) )
```
> Fwiw, I also ran across this problem (Ubuntu 20.04)

I guess you also installed a different boost version, because the 1.71 boost version in Ubuntu Focal 20.04 is not supported starting with https://github.com/bitcoin/bitcoin/pull/29066 and shouldn't even pass the `cmake -B` command.
> > Fwiw, I also ran across this problem (Ubuntu 20.04)
> 
> I guess you also installed a different boost version, because the 1.71 boost version in Ubuntu Focal 20.04 is not supported starting with #29066 and shouldn't even pass the `cmake -B` command.

Yup, I have boost 1.74.0.3 installed.
```sh
dpkg -s libboost-dev | grep 'Version'
Version: 1.74.0.3ubuntu7
```

Fix patch:
diff --git a/src/txmempool.h b/src/txmempool.h
index d0cb41a078ec2..7fdf1c5a39ae9 100644
--- a/src/txmempool.h
+++ b/src/txmempool.h
@@ -23,7 +23,17 @@
 #include <util/result.h>
 #include <util/feefrac.h>
 
+// This works around a bug in Boost <= 1.80.0 when using Clang >=18.
+// See https://github.com/bitcoin/bitcoin/issues/30751.
+#if defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wenum-constexpr-conversion"
+#endif
 #include <boost/multi_index/hashed_index.hpp>
+#if defined(__clang__)
+#pragma clang diagnostic pop
+#endif
+
 #include <boost/multi_index/identity.hpp>
 #include <boost/multi_index/indexed_by.hpp>
 #include <boost/multi_index/ordered_index.hpp>


Test patch: