Files
bitcoin/src
merge-script 3a2c52f9d7 Merge bitcoin/bitcoin#35792: refactor: Make all const static class members constexpr
05c35c402c refactor: Make all `const static` class members `constexpr` (rustaceanrob)

Pull request description:

  Found in #35713. If a `static class` member is not inlined or `constexpr`, the linker will fail when attempting to ODR-use the constant (passing as `const T&`). These can be fixed by finding all member variables that are `const` qualified and inlining them with `constexpr`. There is a clang-tidy pull request that would lint these callsites: https://github.com/llvm/llvm-project/pull/162741

  A script was used to modify these sites, however it cannot run as a scripted-diff because it uses clang-query and a build folder.

  The script only queries for integer and enumeration types, as other data members would have to be marked `constexpr` or `inline` from what I understand: https://en.cppreference.com/cpp/language/static#Constant_static_members

  Removing the ZMQ forward declaration was a clang-tidy lint.

  <details>
  <summary>The script used to find these sites, LLM assisted:</summary>

  ```
  set -uxo pipefail

  cd "$(git rev-parse --show-toplevel)"

  BUILD=${BUILD:-build}
  if [ ! -f "${BUILD}/compile_commands.json" ]; then
      echo "error: ${BUILD}/compile_commands.json not found. Run cmake -B ${BUILD} first." >&2
      exit 1
  fi
  if ! command -v clang-query >/dev/null; then
      echo "error: clang-query not on PATH. Install clang-tools." >&2
      exit 1
  fi
  if ! git diff --quiet || ! git diff --cached --quiet; then
      echo "error: working tree has uncommitted changes. Commit or stash first." >&2
      exit 1
  fi

  MATCHER='match varDecl(hasParent(cxxRecordDecl()),
                        hasType(qualType(isConstQualified(),
                                         anyOf(hasCanonicalType(isInteger()),
                                               hasDeclaration(enumDecl())))),
                        hasInitializer(expr()),
                        unless(isConstexpr()),
                        isExpansionInFileMatching("/src/"))'

  RAW=$(mktemp)
  trap 'rm -f "$RAW"' EXIT

  echo "Sweeping TUs (batched, may take a few minutes)..." >&2
  find src -type d \( -name secp256k1 -o -name leveldb -o -name crc32c \
                      -o -name minisketch -o -name libmultiprocess -o -name ctaes \) -prune -o \
          -name '*.cpp' -print0 \
      | xargs -0 -n 50 clang-query -p "${BUILD}" \
            -c 'set output diag' \
            -c "${MATCHER}" \
            >>"$RAW" || true

  ROOT=$(pwd)
  LOCS=$(grep -oE "${ROOT}/src/[^:]+:[0-9]+:[0-9]+:" "$RAW" \
      | sed -E "s|^${ROOT}/||; s|:[0-9]+:$||" \
      | sort -u)

  if [ -z "$LOCS" ]; then
      echo "no matches" >&2
      exit 0
  fi

  FILTERED=""
  while IFS=: read -r file line; do
      case "$file" in
          src/secp256k1/*|src/leveldb/*|src/crc32c/*|src/minisketch/*|src/ipc/libmultiprocess/*|src/crypto/ctaes/*) continue ;;
          src/tinyformat.h) continue ;;
      esac
      src=$(sed -n "${line}p" "$file")
      case "$src" in *inline*) continue ;; esac
      FILTERED+="${file}:${line}"$'\n'
  done <<<"$LOCS"
  FILTERED=$(printf '%s' "$FILTERED" | sed '/^$/d')

  if [ -z "$FILTERED" ]; then
      echo "no matches after filtering" >&2
      exit 0
  fi

  echo "Sites to rewrite ($(echo "$FILTERED" | wc -l)):" >&2
  echo "$FILTERED" >&2

  declare -A LINES
  while IFS=: read -r file line; do
      LINES[$file]+="${line} "
  done <<<"$FILTERED"

  for file in "${!LINES[@]}"; do
      args=()
      for line in ${LINES[$file]}; do
          args+=(-e "${line}s/static const /static constexpr /")
      done
      sed -i "${args[@]}" "$file"
  done

  echo >&2
  echo "===== proposed diff =====" >&2
  git --no-pager diff
  ```
  </details>

ACKs for top commit:
  fanquake:
    ACK 05c35c402c
  sedited:
    ACK 05c35c402c

Tree-SHA512: 2b823b94ddfae1a889b50ebdb6a8828d95baaa2578756daa826b6579045f7e92ea91562be96865c1df267f4dd288f91fd84ed60090e9ad38adc4efeb865cd90a
2026-07-24 18:14:07 +01:00
..
2026-07-17 22:55:23 -07:00
2026-07-23 12:06:32 +02:00
2026-07-23 12:06:32 +02:00