{
 "number": 36033,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/36033",
 "title": "[wip,nomerge,rfc] build: Require C++23 compiler",
 "author": "maflcko",
 "author_association": "MEMBER",
 "created_at": "2026-08-20T09:06:27Z",
 "updated_at": "2026-09-09T11:34:04Z",
 "age_days": 28,
 "draft": true,
 "labels": [
  "Needs rebase",
  "CI failed"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "450acb901e1c9d0a3b320a0f414720afbc563f88",
 "head_ref": "2608-cpp23",
 "head_repo": "maflcko/bitcoin-core",
 "head_history": [
  {
   "t": "2026-08-20T10:16:59Z",
   "sha": "d43cdbae8e4b5ecbb73a37e466187dee357351a5"
  },
  {
   "t": "2026-08-21T05:43:01Z",
   "sha": "edede385cab47020124bba6db98d69319168afb5"
  },
  {
   "t": "2026-08-24T11:05:38Z",
   "sha": "d8f09be70949b0ef2d21a71430c468dd57a99fc7"
  },
  {
   "t": "2026-08-24T11:07:29Z",
   "sha": "19f2a55d73927c496cabdc8f9d8913599c70ac92"
  },
  {
   "t": "2026-08-24T14:55:29Z",
   "sha": "450acb901e1c9d0a3b320a0f414720afbc563f88"
  }
 ],
 "additions": 112,
 "deletions": 280,
 "changed_files": 50,
 "commit_count": 8,
 "size_bucket": "M",
 "mergeable_state": "dirty",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {
    "concept_ack": [
     {
      "login": "l0rinc",
      "url": "https://github.com/bitcoin/bitcoin/pull/36033#issuecomment-5372931579"
     }
    ]
   },
   "conflicts": [
    {
     "number": 36160,
     "title": "refactor: Minor improvements to HTTP unit tests",
     "author": "hodlinator"
    },
    {
     "number": 36052,
     "title": "ci: Doc: Move all config comments right next to the option they explain",
     "author": "maflcko"
    },
    {
     "number": 36042,
     "title": "build: Bump g++ minimum supported version to 13",
     "author": "maflcko"
    },
    {
     "number": 35998,
     "title": "wallet: Handle or explicitly ignore `WalletBatch` write failures",
     "author": "achow101"
    },
    {
     "number": 35752,
     "title": "wallet: make encryption state updates atomic",
     "author": "l0rinc"
    },
    {
     "number": 35445,
     "title": "wallet, descriptor: Revert `StringType::COMPAT` for Miniscript expressions and drop the concept of a Descriptor ID that can be validated",
     "author": "achow101"
    },
    {
     "number": 34909,
     "title": "wallet, refactor: modularise wallet by extracting out legacy wallet migration",
     "author": "rkrux"
    },
    {
     "number": 31507,
     "title": "build: Use clang-cl to build on Windows natively",
     "author": "hebasto"
    }
   ]
  }
 },
 "acks_parsed": {
  "l0rinc": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2026-08-21T17:08:15Z",
   "stale": false
  }
 },
 "acks_tally": {
  "ack": 0,
  "stale_ack": 0,
  "concept_ack": 1,
  "approach_ack": 0,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 0,
  "changes_requested": 0,
  "distinct_reviewers": [
   "hebasto",
   "l0rinc"
  ]
 },
 "signals": {
  "needs_rebase": true,
  "ci_failed": true,
  "mergeable_state": "dirty",
  "last_author_activity": "2026-08-24T14:55:29Z",
  "last_reviewer_activity": "2026-08-23T16:34:45Z",
  "last_reviewer": "hebasto",
  "author_silent_days": 24,
  "waiting_on_author_days": 0,
  "days_since_update": 8
 },
 "refs": {
  "mentioned": [],
  "depends_on": [],
  "fixes": [],
  "linked_issues": [],
  "references": [],
  "conflicts": [
   36160,
   36052,
   36042,
   35998,
   35752,
   35445,
   34909,
   31507
  ]
 },
 "stack": {
  "shares_commits_with": [],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [],
 "body": "C++23 for Bitcoin Core is mostly a \"style update\" on top of C++20. However, the workarounds to avoid C++23 keep accumulating and some parts of the code already use C++23 features, such as lambda attributes (https://github.com/bitcoin-core/libmultiprocess/commit/bdd0cd69418d189f62699d274a751cbf6d36bb43).\n\nI don't know when it is fine to switch, but at some point, I think it is fine to require a C++23 compiler, so that [new stuff](https://github.com/bitcoin/bitcoin/issues/34979#issuecomment-4448399166) is unlocked. Of course this requires bumping the minimum required compiler versions:\n\n* GCC: 13\n* Clang: 19\n\nThere are some C++23 features that aren't implemented (such as `<stacktrace>` not really shipped in any vanilla stdlib today), or e.g. `ranges::starts_with` not implemented until libstdc++-16. But overall I think we are better off using C++23 without those few features instead of waiting longer?",
 "commits": [
  {
   "sha": "c895086a33899519eb1b11c55c0b984e29e44daf",
   "date": "2026-08-24T11:07:20Z",
   "message": "build: Require C++23 compiler"
  },
  {
   "sha": "b70b939dd3c0b7f556e80629c4bb695de8e86fa2",
   "date": "2026-08-24T11:07:20Z",
   "message": "util: Remove ALWAYS_FALSE type"
  },
  {
   "sha": "a5e1fa71bbf6807b08a425fa82f2889fd5b34793",
   "date": "2026-08-24T11:07:20Z",
   "message": "compat: Use std::byteswap"
  },
  {
   "sha": "3d7742cbbd7849586e4cd64b2791c634dc03aef3",
   "date": "2026-08-24T11:07:20Z",
   "message": "test: Adjust util::Expected tests for C++23\n\n1) value() might be marked [[nodiscard]], so add the missing (void),\n   where the value is ignored.\n\n2) std::expected::value() must be able to throw\n   std::bad_expected_access<E> if the expected contains an error. That\n   requires copying the error type, which is not possible in this unit\n   test that uses a non-copyable error type.\n\n   Fix it by using the non-throwing value accessor."
  },
  {
   "sha": "5f5d9b16530511abd6e65c22242c3f798f3ee309",
   "date": "2026-08-24T11:07:20Z",
   "message": "util: Use std::expected"
  },
  {
   "sha": "a22fc2ee9823d2ada116e97bcdab87213721cb4b",
   "date": "2026-08-24T11:07:20Z",
   "message": "refactor: Use std::views::zip in btck import blocks"
  },
  {
   "sha": "19f2a55d73927c496cabdc8f9d8913599c70ac92",
   "date": "2026-08-24T11:07:20Z",
   "message": "refactor: Make iwyu happy\n\nIWYU will now apply the\nhttps://github.com/include-what-you-use/include-what-you-use/blob/master/docs/WhatIsAUse.md#automatic-re-export-function-return-values\nheuristic."
  },
  {
   "sha": "450acb901e1c9d0a3b320a0f414720afbc563f88",
   "date": "2026-08-24T14:55:15Z",
   "message": "refactor: clang-tidy readability-container-contains for C++23"
  }
 ],
 "timeline": [
  {
   "t": "2026-08-20T10:16:59Z",
   "kind": "force_push",
   "who": "maflcko",
   "commit": "d43cdbae8e4b5ecbb73a37e466187dee357351a5"
  },
  {
   "t": "2026-08-21T05:43:01Z",
   "kind": "force_push",
   "who": "maflcko",
   "commit": "edede385cab47020124bba6db98d69319168afb5"
  },
  {
   "t": "2026-08-21T17:08:15Z",
   "kind": "comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "text": "Concept ACK"
  },
  {
   "t": "2026-08-23T16:34:45Z",
   "kind": "review",
   "who": "hebasto",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "c9e5b85d1049c10e5ada784b09328e05521b86fd",
   "text": "edede385cab47020124bba6db98d69319168afb5\n\n[quoted text omitted]\nThis looks like IWYU's [\"Automatic re-export: function return values\"](https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/WhatIsAUse.md#automatic-re-export-function-return-values) heuristics in action."
  },
  {
   "t": "2026-08-24T11:05:38Z",
   "kind": "force_push",
   "who": "maflcko",
   "commit": "d8f09be70949b0ef2d21a71430c468dd57a99fc7"
  },
  {
   "t": "2026-08-24T11:07:29Z",
   "kind": "force_push",
   "who": "maflcko",
   "commit": "19f2a55d73927c496cabdc8f9d8913599c70ac92"
  },
  {
   "t": "2026-08-24T14:55:29Z",
   "kind": "force_push",
   "who": "maflcko",
   "commit": "450acb901e1c9d0a3b320a0f414720afbc563f88"
  }
 ],
 "labels_log": [
  {
   "t": "2026-08-20T10:17:25Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-09T11:34:03Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  }
 ],
 "state_log": [
  {
   "t": "2026-08-20T09:06:30Z",
   "kind": "renamed",
   "who": "DrahtBot",
   "from": "[wip,nomerge,rfc] build: Require C++23 compiler ",
   "to": "[wip,nomerge,rfc] build: Require C++23 compiler"
  },
  {
   "t": "2026-08-20T09:06:36Z",
   "kind": "convert_to_draft",
   "who": "maflcko"
  }
 ],
 "text_chars": 2124,
 "text_tokens_estimate": 531,
 "changed_paths": [
  "CMakeLists.txt",
  "ci/test/00_setup_env_native_asan.sh",
  "contrib/devtools/bitcoin-tidy/CMakeLists.txt",
  "depends/Makefile",
  "depends/README.md",
  "doc/release-notes-36033.md",
  "src/.clang-format",
  "src/bitcoin-cli.cpp",
  "src/bitcoin-tx.cpp",
  "src/common/args.cpp",
  "src/common/config.cpp",
  "src/common/license_info.cpp",
  "src/compat/byteswap.h",
  "src/compat/endian.h",
  "src/httpserver.cpp",
  "src/i2p.cpp",
  "src/index/txospenderindex.cpp",
  "src/kernel/bitcoinkernel.cpp",
  "src/logging/timer.h",
  "src/node/blockstorage.cpp",
  "src/qt/askpassphrasedialog.cpp",
  "src/qt/guiutil.cpp",
  "src/qt/optionsmodel.cpp",
  "src/qt/transactiondesc.cpp",
  "src/rpc/net.cpp",
  "src/rpc/server.cpp",
  "src/rpc/util.cpp",
  "src/script/descriptor.cpp",
  "src/test/argsman_tests.cpp",
  "src/test/descriptor_tests.cpp",
  "src/test/fuzz/rpc.cpp",
  "src/test/fuzz/strprintf.cpp",
  "src/test/fuzz/system.cpp",
  "src/test/getarg_tests.cpp",
  "src/test/httpserver_tests.cpp",
  "src/test/netbase_tests.cpp",
  "src/test/system_tests.cpp",
  "src/test/util/common.h",
  "src/test/util/logging.cpp",
  "src/test/util_expected_tests.cpp",
  "src/util/bip32.cpp",
  "src/util/expected.h",
  "src/util/strencodings.cpp",
  "src/util/string.h",
  "src/util/types.h",
  "src/wallet/rpc/encrypt.cpp",
  "src/wallet/test/coinselection_tests.cpp",
  "src/wallet/test/coinselector_tests.cpp",
  "src/wallet/test/wallet_tests.cpp",
  "src/wallet/wallet.cpp"
 ],
 "files": [
  {
   "path": "CMakeLists.txt",
   "add": 1,
   "del": 1
  },
  {
   "path": "ci/test/00_setup_env_native_asan.sh",
   "add": 4,
   "del": 3
  },
  {
   "path": "contrib/devtools/bitcoin-tidy/CMakeLists.txt",
   "add": 1,
   "del": 1
  },
  {
   "path": "depends/Makefile",
   "add": 1,
   "del": 1
  },
  {
   "path": "depends/README.md",
   "add": 1,
   "del": 1
  },
  {
   "path": "doc/release-notes-36033.md",
   "add": 4,
   "del": 0
  },
  {
   "path": "src/.clang-format",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/bitcoin-cli.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/bitcoin-tx.cpp",
   "add": 6,
   "del": 6
  },
  {
   "path": "src/common/args.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/common/config.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/common/license_info.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/compat/byteswap.h",
   "add": 7,
   "del": 60
  },
  {
   "path": "src/compat/endian.h",
   "add": 12,
   "del": 12
  },
  {
   "path": "src/httpserver.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/i2p.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/index/txospenderindex.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/kernel/bitcoinkernel.cpp",
   "add": 6,
   "del": 3
  },
  {
   "path": "src/logging/timer.h",
   "add": 1,
   "del": 2
  },
  {
   "path": "src/node/blockstorage.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/qt/askpassphrasedialog.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/qt/guiutil.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/qt/optionsmodel.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/qt/transactiondesc.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/rpc/net.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/rpc/server.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/rpc/util.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/script/descriptor.cpp",
   "add": 0,
   "del": 1
  },
  {
   "path": "src/test/argsman_tests.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/descriptor_tests.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/rpc.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/fuzz/strprintf.cpp",
   "add": 4,
   "del": 4
  },
  {
   "path": "src/test/fuzz/system.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/getarg_tests.cpp",
   "add": 5,
   "del": 5
  },
  {
   "path": "src/test/httpserver_tests.cpp",
   "add": 7,
   "del": 7
  },
  {
   "path": "src/test/netbase_tests.cpp",
   "add": 5,
   "del": 5
  },
  {
   "path": "src/test/system_tests.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/test/util/common.h",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/util/logging.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/test/util_expected_tests.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/util/bip32.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/util/expected.h",
   "add": 5,
   "del": 117
  },
  {
   "path": "src/util/strencodings.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/util/string.h",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/util/types.h",
   "add": 0,
   "del": 12
  },
  {
   "path": "src/wallet/rpc/encrypt.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/wallet/test/coinselection_tests.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/wallet/test/coinselector_tests.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/wallet/test/wallet_tests.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/wallet/wallet.cpp",
   "add": 1,
   "del": 1
  }
 ],
 "test_lines": 85,
 "git": {
  "head": "450acb901e1c9d0a3b320a0f414720afbc563f88",
  "head_matches_backup": true,
  "base": "994c17d6c0a1453a1d7cc44ee2bbc49afa2d1155",
  "commits": [
   {
    "sha": "c895086a33",
    "subject": "build: Require C++23 compiler",
    "files": 7,
    "add": 13,
    "del": 8
   },
   {
    "sha": "b70b939dd3",
    "subject": "util: Remove ALWAYS_FALSE type",
    "files": 2,
    "add": 1,
    "del": 14
   },
   {
    "sha": "a5e1fa71bb",
    "subject": "compat: Use std::byteswap",
    "files": 2,
    "add": 19,
    "del": 72
   },
   {
    "sha": "3d7742cbbd",
    "subject": "test: Adjust util::Expected tests for C++23",
    "files": 1,
    "add": 2,
    "del": 2
   },
   {
    "sha": "5f5d9b1653",
    "subject": "util: Use std::expected",
    "files": 2,
    "add": 7,
    "del": 119
   },
   {
    "sha": "a22fc2ee98",
    "subject": "refactor: Use std::views::zip in btck import blocks",
    "files": 1,
    "add": 6,
    "del": 3
   },
   {
    "sha": "19f2a55d73",
    "subject": "refactor: Make iwyu happy",
    "files": 4,
    "add": 3,
    "del": 1
   },
   {
    "sha": "450acb901e",
    "subject": "refactor: clang-tidy readability-container-contains for C++23",
    "files": 32,
    "add": 62,
    "del": 62
   }
  ],
  "patch_truncated": true
 },
 "input_hash": "4c149c9b701011be",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}