)]}'
{
  "log": [
    {
      "commit": "68fcbfd45543e8a56c4355fa25ad7571003cf7c8",
      "tree": "c787f741796b9b1ac55c93bb62f8ac835a8a6c50",
      "parents": [
        "e353b5b1951d8dc6162556dee17ba6b8acfbcfd1"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Wed Oct 21 08:30:53 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 21 08:32:21 2026"
      },
      "message": "Split cc_bindings_from_rs\u0027s generate_bindings into one crate per module\n\n`generate_bindings` was a single 15K-line crate that took ~13s to compile\non every edit, and every unit test of `cc_bindings_from_rs` waits for it.\nThe preceding CLs made its module graph acyclic; this CL turns each module\ninto its own `rust_library` so that an edit only recompiles the crate it\ntouches and its dependents, and independent crates compile in parallel:\n\n  avoid_colliding_types, generate_comment, get_generic_args and format_type\n  at the bottom; generate_function_thunk, generate_ctor, generate_enum,\n  generate_unsupported, generate_function, generate_struct_and_union and\n  generate_template_specialization above them; and `generate_bindings`\n  (lib.rs, now 1886 lines) as the root that wires the `BindingsGenerator`\n  queries together.\n\nThe source changes are mechanical: `crate::module::item` paths become\n`module::item`, `pub(crate)` becomes `pub` where an item crosses a crate\nboundary, and each module gains the `#![feature]`/`extern crate`\ndeclarations it needs as a crate root. `generate_bindings` re-exports the\nfew names tests reach through it. The Cargo manifests are regenerated.\n\nPiperOrigin-RevId: 1003746076\n"
    },
    {
      "commit": "e353b5b1951d8dc6162556dee17ba6b8acfbcfd1",
      "tree": "dcb40abdd625b85a8b6fa8c323194b5560cd64d8",
      "parents": [
        "8708a7f8a87f64c4a4585f2a9549280e28bdef14"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Wed Oct 21 07:53:36 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 21 07:56:30 2026"
      },
      "message": "Move the remaining shared helpers out of cc_bindings_from_rs\u0027s lib.rs\n\nLast preparatory step before splitting the `generate_bindings` crate into\nper-module crates: after this, no module depends on anything defined in\n`lib.rs`, so the module graph is a DAG rooted at `lib.rs`:\n\n  * `query_compiler` gains the `TyCtxt`/`BindingsGenerator` queries\n    `should_receive_bindings`, `matches_qualified_name`, `normalize_ty` /\n    `try_normalize_ty`, `field_def_is_pub_and_stable` and `SortedByDef`.\n  * `format_type` gains `CcType`, `check_slice_layout` and\n    `check_feature_enabled_on_self_and_all_deps`, which only it used.\n  * New `generate_comment` module: doc comments, source locations and the\n    `[[deprecated]]` / `[[nodiscard]]` tags (with `must_use_attr_of` from\n    `generate_function`).\n  * New `generate_unsupported` module: `error_scope!`,\n    `item_name_for_error_report`, the \"unsupported item\" placeholder\n    snippets, and `report_must_bind_error`.\n  * `thunk_qualifier` and `are_generics_enabled` move to their only users.\n\nEverything is moved verbatim except `stable_def_id_cmp`, which now compares\n`(def_path_str, def_path_hash)` tuples directly instead of going through\n`NodeSortKey` (which stays with the toposort code in `lib.rs`); the ordering\nis identical. `lib.rs` keeps `pub use` re-exports for the few names that\ntests reach through `generate_bindings::`, and shrinks to 1,900 lines.\n\nPiperOrigin-RevId: 1003728366\n"
    },
    {
      "commit": "8708a7f8a87f64c4a4585f2a9549280e28bdef14",
      "tree": "ee09665adc3406cecc56de9f9b464ee65623080f",
      "parents": [
        "347dc44d24a92736e57a7ecd0f0c80eedcef5ca5"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Wed Oct 21 01:19:14 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 21 01:20:55 2026"
      },
      "message": "Update Starlark rules and MODULE.bazel for OSS Bazel support\n\nPiperOrigin-RevId: 1003549655\n"
    },
    {
      "commit": "347dc44d24a92736e57a7ecd0f0c80eedcef5ca5",
      "tree": "df1ccf08713ff25c02296fab4266050d6c65683e",
      "parents": [
        "639482057ef171c11c8082c0edd6ea37859909a8"
      ],
      "author": {
        "name": "Lukasz Anforowicz",
        "email": "lukasza@google.com",
        "time": "Wed Oct 21 00:59:01 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 21 01:00:49 2026"
      },
      "message": "rs_bindings_from_cc: Accept default visibility attrs on namespaces.\n\nlibc++ marks [1] `namespace std` with\n`__attribute__((__type_visibility__(\"default\")))` (or `__visibility__`)\nunless it is configured with `_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS`.\nChromium doesn\u0027t define this macro, because Chromium\u0027s component builds\n(many shared libraries, `-fvisibility\u003dhidden`) need the visibility\nannotations.  Before this CL, rs_bindings_from_cc treated the attribute\nas unknown and could not bind anything in `namespace std` in Chromium.\n\nDefault namespace visibility does not affect Rust layout or FFI.  This\nCL accepts `VisibilityAttr` / `TypeVisibilityAttr` with the \"default\"\nvalue on namespaces.  Other visibility values (`hidden`, `protected`)\nstay unsupported for now, to minimize risk (e.g. link errors when\nbindings and the C++ library end up in different shared libraries).\nThis is not inherently wrong and can be relaxed later if needed.  It\nalso matches the function importer, which accepts only \"default\"\nvisibility.  The check is shared with the function importer through a\nnew `IsDefaultVisibilityAttr` helper in `ast_util`.\n\n[1] https://source.chromium.org/chromium/chromium/src/+/main:third_party/angle/third_party/libc++/src/include/__configuration/attributes.h;l\u003d103-109;drc\u003d174f548d08cc66e294ccec62df8462eaf6edd394\n\nPiperOrigin-RevId: 1003539588\n"
    },
    {
      "commit": "639482057ef171c11c8082c0edd6ea37859909a8",
      "tree": "ecb85e0f828879ddc5c466095dd9d76c5d97f7f0",
      "parents": [
        "22c80c179f8c0e2653bc84e3fd2b297aa9e267eb"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Oct 21 00:44:55 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 21 00:47:13 2026"
      },
      "message": "Expose the C++-to-Rust error report file in GeneratedBindingsInfo.\n\nWhen error reports are enabled, `rs_bindings_from_cc` writes a JSON error report\nper target, but it\u0027s only reachable through the target\u0027s `out` output group,\nwhich isn\u0027t transitive. An aspect that wants the reports of a target and its\ndependencies (for example, to explain why an API used across targets doesn\u0027t\nget bindings) has no way to collect them from the dependencies.\n\nAdd `error_report_file` to `GeneratedBindingsInfo`. It is `None` when error\nreports are disabled (`generate_error_report`). Analysis tests cover both cases.\n\nPiperOrigin-RevId: 1003531842\n"
    },
    {
      "commit": "22c80c179f8c0e2653bc84e3fd2b297aa9e267eb",
      "tree": "a987369a7f6892b5072926ea9bf97ea7d4ab42f8",
      "parents": [
        "bd2040830585b6f58c976978e4be0941e4162ed6"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Oct 20 23:55:21 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 23:56:42 2026"
      },
      "message": "Shard cc_bindings_from_rs\u0027s generate_bindings_test by switching it to googletest\n\n`generate_bindings_test` was the longest-running Crubit unit test: each of\nits 85 tests runs rustc on a snippet, and plain `#[test]`s neither shard\nnor run in parallel on the remote test executors, so the target took ~24s\nper run. `#[gtest]` supports Bazel test sharding, so with `shard_count \u003d 8`\nthe longest shard now takes ~8.5s.\n\nThe test bodies are unchanged; only the attribute, one import, the BUILD\ndeps, and the generated Cargo.toml golden change.\n\nPiperOrigin-RevId: 1003500152\n"
    },
    {
      "commit": "bd2040830585b6f58c976978e4be0941e4162ed6",
      "tree": "3e35c18491f250baaf68c2e0bdacd99b26a2d038",
      "parents": [
        "a426087c0878944e8ec237e7a622e38f937b461c"
      ],
      "author": {
        "name": "Lukasz Anforowicz",
        "email": "lukasza@google.com",
        "time": "Tue Oct 20 23:25:24 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 23:29:11 2026"
      },
      "message": "Support `__declspec(empty_bases)` in `rs_bindings_from_cc`.\n\nBefore this CL, `rs_bindings_from_cc` treated `__declspec(empty_bases)`\nas an unknown attribute, and therefore did not generate bindings for\nrecords that use it.  On Windows, libc++ uses this attribute for\n`std::optional` [1], `std::variant` and `std::tuple` (see\n`_LIBCPP_DECLSPEC_EMPTY_BASES` [2]).  Therefore, for example, Rust code\ncould not call C++ functions that take or return `std::optional`\n(including some `absl::Cord` APIs).\n\nThe attribute only changes the record layout, and Crubit takes the\nlayout from Clang.  After this CL, `rs_bindings_from_cc` treats the\nattribute as known.  This CL also re-enables the Windows cross-compile\ntests that failed because of this.\n\n[1] https://github.com/llvm/llvm-project/blob/4fa92e8e51e6833f8d70ab9fa136d899e497f135/libcxx/include/__optional/optional.h#L309-L313\n[2] https://github.com/llvm/llvm-project/blob/4fa92e8e51e6833f8d70ab9fa136d899e497f135/libcxx/include/__configuration/attributes.h#L373-L377\n\nPiperOrigin-RevId: 1003480319\n"
    },
    {
      "commit": "a426087c0878944e8ec237e7a622e38f937b461c",
      "tree": "3b1b50231849b65c1e4234d307d138b7230ddcd9",
      "parents": [
        "fb9a87ffc2d84073861c550d0145032672ce9f91"
      ],
      "author": {
        "name": "Lukasz Anforowicz",
        "email": "lukasza@google.com",
        "time": "Tue Oct 20 22:57:58 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 22:58:54 2026"
      },
      "message": "Thunks for constructors and destructors of classes w/ virtual bases.\n\nBefore this CL, the Rust bindings called non-inline constructors and\ndestructors of classes with virtual bases directly (via `link_name`).\nThis is wrong in the Microsoft C++ ABI:\n\n- Such constructors take an extra, hidden `is_most_derived` parameter\n  [1] that the Rust code did not pass.\n- Normally only the callers emit the complete destructor (\"vbase\n  dtor\") [2][3], so the link failed with an undefined symbol.\n\nAfter this CL, the IR records whether a class has virtual bases, and\nthe bindings call constructors and destructors of such classes through\na C++ thunk.  This is done on all target platforms, so that the\ngenerated bindings do not depend on the target platform.\n\n[1] `MicrosoftCXXABI::buildStructorSignature`:\n    https://github.com/llvm/llvm-project/blob/4fa92e8e51e6833f8d70ab9fa136d899e497f135/clang/lib/CodeGen/MicrosoftCXXABI.cpp#L1382-L1395\n[2] `MicrosoftCXXABI::EmitCXXDestructors`:\n    https://github.com/llvm/llvm-project/blob/4fa92e8e51e6833f8d70ab9fa136d899e497f135/clang/lib/CodeGen/MicrosoftCXXABI.cpp#L1453-L1464\n[3] `linkonce_odr` linkage of `Dtor_Complete` in\n    `MicrosoftCXXABI::getCXXDestructorLinkage`:\n    https://github.com/llvm/llvm-project/blob/4fa92e8e51e6833f8d70ab9fa136d899e497f135/clang/lib/CodeGen/MicrosoftCXXABI.cpp#L1425-L1433\n\nPiperOrigin-RevId: 1003461896\n"
    },
    {
      "commit": "fb9a87ffc2d84073861c550d0145032672ce9f91",
      "tree": "10e78aa9e01fad61b002c801f8bc0a92d602a7fd",
      "parents": [
        "f4166c771546a905da17e93c8cba4678f2d76aec"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Oct 20 22:27:46 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 22:32:21 2026"
      },
      "message": "Stop emitting redundant `+ use\u003c...\u003e` bounds on non-Unpin return types.\n\nGenerated Rust bindings compile as Edition 2024 (`compile_rust.bzl`), where both return-position `impl Trait` (`-\u003e ::ctor::Ctor![T]`) and `impl_trait_in_assoc_type` (`type CtorType \u003d ::ctor::Ctor![Self];`, `type Output \u003d ::ctor::Ctor![T];`) capture all in-scope generic type parameters and lifetimes by default.\n\nThe explicit `+ use\u003c...\u003e` precise-capturing bound (originally added before the Edition 2024 migration in https://github.com/google/crubit/commit/37095e399c0fe6a4183273dfb4a912feab6fabd6) is therefore unnecessary, and required rewriting `::ctor::Ctor![T]` argument-position `impl Trait` parameters into named `__CtorParam_...` type parameters. Emit `::ctor::Ctor![#ty]` directly for all non-`Unpin` return types instead.\n\nPiperOrigin-RevId: 1003440598\n"
    },
    {
      "commit": "f4166c771546a905da17e93c8cba4678f2d76aec",
      "tree": "211413e61ca682f5bf53586648a291b41ffb5030",
      "parents": [
        "fe858455cb16ef6c5f73c0b9519b22b98882d6e3"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Tue Oct 20 22:18:57 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 22:23:18 2026"
      },
      "message": "Helper methods for generics.\n\n* Add get_validated_layout to share logic to validate layout\n* Adds generate_generic_adt_fwd_decl and wires it into generate_fwd_decl\n* Rejects cpp_enum on generic structs in get_generic_adt_header.\n\nPiperOrigin-RevId: 1003434214\n"
    },
    {
      "commit": "fe858455cb16ef6c5f73c0b9519b22b98882d6e3",
      "tree": "97f64b377fa9c7f929eb1bff402e7461333790b7",
      "parents": [
        "22a6c472a8e9715d3c95870c67ab70aa5c4fe1d3"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Tue Oct 20 22:16:30 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 22:17:22 2026"
      },
      "message": "Migrate cc_deps usages to rust_api_from_cpp and deps within Crubit.\n\nThis is helpful for OSS where cc_deps isn\u0027t available.\n\nPiperOrigin-RevId: 1003432477\n"
    },
    {
      "commit": "22a6c472a8e9715d3c95870c67ab70aa5c4fe1d3",
      "tree": "865b1f6aa22c6c4883c98b24d97717b66ecdd12a",
      "parents": [
        "70fe3e9ea30918dfce924c3d335a901bff5b2b3e"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Oct 20 22:01:59 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 22:03:23 2026"
      },
      "message": "Refresh Crubit documentation for operator overloading and ABI assumptions.\n\nPiperOrigin-RevId: 1003422376\n"
    },
    {
      "commit": "70fe3e9ea30918dfce924c3d335a901bff5b2b3e",
      "tree": "cbef166aaeb96e22a5f2c7ff7d4c74c3fc7d3928",
      "parents": [
        "f3237135cd048be862cbd896caa7a704ec0a3ee2"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Oct 20 21:48:59 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 21:54:28 2026"
      },
      "message": "Implement `Send` and `Sync` for `cc_std::std::string_view` and `raw_string_view`\n\n`cc_std::std::string_view\u003c\u0027a\u003e` is a `#[repr(transparent)]` wrapper around `raw_string_view` whose invariant guarantees that the underlying bytes are live and immutable for lifetime `\u0027a` (semantically equivalent to `\u0026\u0027a [u8]`). However, because `raw_string_view` received negative `!Send` and `!Sync` impls from `rs_bindings_from_cc`, neither `string_view\u003c\u0027a\u003e` nor `raw_string_view` implemented `Send` or `Sync`.\n\n- Add `unsafe impl Send for string_view\u003c\u0027_\u003e {}` and `unsafe impl Sync for string_view\u003c\u0027_\u003e {}` in `support/cc_std_impl/string_view.rs` so `string_view\u003c\u0027_\u003e` implements `Send` and `Sync` immediately (including against the pre-release `cc_std` bindings).\n- Update `send_sync_impl_polarity` and `record_trait_assertions` in `rs_bindings_from_cc/generate_bindings/generate_struct_and_union.rs` so `raw_string_view` receives positive `unsafe impl Send` and `unsafe impl Sync` (matching how `raw_string_view` is special-cased there and aligning with b/480821248). Emitting the `raw_string_view` impls in `rs_bindings_from_cc` avoids a coherence conflict (`E0119`) with the `impl !Send`/`impl !Sync` emitted by the currently-released `rs_bindings_from_cc` binary for `//third_party/crosstool/rust/stable/crubit/support/cc_std`.\n\nPiperOrigin-RevId: 1003412407\n"
    },
    {
      "commit": "f3237135cd048be862cbd896caa7a704ec0a3ee2",
      "tree": "4239a4e4414652f8869b151190dd6793c965a69a",
      "parents": [
        "e470924dec8ee61f897c18cfa3feb87ac8f94a74"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Oct 20 21:46:05 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 21:49:30 2026"
      },
      "message": "Remove unnecessary `Sync` bound from `dyn FnOnce` callable bindings\n\n`Callable::dyn_fn_spelling` previously emitted `+ ::core::marker::Send + ::core::marker::Sync + \u0027static` for all `FnTrait` variants. While `Fn` (used for both `const` and non-`const` lvalue callables) requires `Sync` because C++ `AnyInvocable` permits non-exclusive invocation, `FnOnce` (used for rvalue-qualified `\u0026\u0026` / `const \u0026\u0026` callables in `absl::AnyInvocable\u003cSig \u0026\u0026\u003e` and `rs_std::DynCallable\u003cSig \u0026\u0026\u003e`) can only be invoked once by consuming ownership (`std::move` in C++, `ptr::replace` in the Rust invoker) or destroyed.\n\nBecause `dyn FnOnce` has no `\u0026self` methods and is never accessed concurrently by shared reference, `Sync` is unnecessary and prevents passing `Send + !Sync` single-use closures (such as closures capturing `Cell` or `!Sync` futures/handles) to C++. Omit `+ ::core::marker::Sync` when `rust_fn_trait` is `FnTrait::FnOnce`.\n\nPiperOrigin-RevId: 1003410259\n"
    },
    {
      "commit": "e470924dec8ee61f897c18cfa3feb87ac8f94a74",
      "tree": "511cb12a42542f8a3456a95aa7788d00818d551d",
      "parents": [
        "8d4450453aecf0fcce5a8f7b0ee9f1d3021da40d"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Tue Oct 20 19:48:35 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 19:50:10 2026"
      },
      "message": "Add missing rustc_private and extern crate declarations in generate_bindings tests\n\nThis is needed in OSS where the feature tells rustc to dynamically link against the rustc_driver for these tests.\n\nPiperOrigin-RevId: 1003321952\n"
    },
    {
      "commit": "8d4450453aecf0fcce5a8f7b0ee9f1d3021da40d",
      "tree": "3414ba6cf9ab05da3cad82d7ae3b35b68b7c7d99",
      "parents": [
        "89c609e0d52ef63307d2e831bdc6af147a3f523c"
      ],
      "author": {
        "name": "Lukasz Anforowicz",
        "email": "lukasza@google.com",
        "time": "Tue Oct 20 19:18:13 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 19:25:04 2026"
      },
      "message": "Use the base destructor symbol in the Microsoft C++ ABI.\n\nBefore this CL, `rs_bindings_from_cc` used the mangled name of the\ncomplete destructor (`Dtor_Complete` [1]) on all target platforms.  In\nthe Microsoft C++ ABI this is the \"vbase dtor\" (`??_D` [2]).  The\ntranslation unit that defines a destructor normally only emits the base\ndestructor (`??1`) [3], and callers emit the \"vbase dtor\" on demand\n[4].  Therefore Rust code that called the destructor directly failed to\nlink on Windows (undefined `vbase dtor` symbols).\n\nAfter this CL, `rs_bindings_from_cc` uses the base destructor\n(`Dtor_Base` [1]) when targeting the Microsoft C++ ABI and the class\nhas no virtual bases.  This matches what Clang does\n(`MicrosoftCXXABI::EmitDestructorCall` [5]).  This CL also re-enables\nthe Windows cross-compile tests that failed to link because of this.\n\n[1] `CXXDtorType`:\n    https://github.com/llvm/llvm-project/blob/4fa92e8e51e6833f8d70ab9fa136d899e497f135/clang/include/clang/Basic/ABI.h#L34-L41\n[2] `MicrosoftCXXNameMangler::mangleCXXDtorType`:\n    https://github.com/llvm/llvm-project/blob/4fa92e8e51e6833f8d70ab9fa136d899e497f135/clang/lib/AST/MicrosoftMangle.cpp#L1485-L1488\n[3] `MicrosoftCXXABI::EmitCXXDestructors`:\n    https://github.com/llvm/llvm-project/blob/4fa92e8e51e6833f8d70ab9fa136d899e497f135/clang/lib/CodeGen/MicrosoftCXXABI.cpp#L1453-L1464\n[4] `linkonce_odr` linkage of `Dtor_Complete` in\n    `MicrosoftCXXABI::getCXXDestructorLinkage`:\n    https://github.com/llvm/llvm-project/blob/4fa92e8e51e6833f8d70ab9fa136d899e497f135/clang/lib/CodeGen/MicrosoftCXXABI.cpp#L1425-L1433\n[5] `MicrosoftCXXABI::EmitDestructorCall`:\n    https://github.com/llvm/llvm-project/blob/4fa92e8e51e6833f8d70ab9fa136d899e497f135/clang/lib/CodeGen/MicrosoftCXXABI.cpp#L1700-L1704\n\nPiperOrigin-RevId: 1003298873\n"
    },
    {
      "commit": "89c609e0d52ef63307d2e831bdc6af147a3f523c",
      "tree": "28e78794977cfee862db483467338da3b5de6e33",
      "parents": [
        "3bb3eca85ed055f48a1cbadf32f7c4ac56d2e092"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Oct 20 19:10:57 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 19:12:26 2026"
      },
      "message": "Generate enum_api_v2 C++ bindings for non-Copy Rust enums.\n\nUnder `CrubitFeature::EnumApiV2`, non-`Copy` enums (`Clone`, move-only, and enums with drop glue or custom `Drop` impls) now receive `enum_api_v2` bindings instead of falling back to an opaque blob of bytes, provided all variant fields are movable in C++.\n\n- Remove the `is_copy` requirement in `analyze_enum`, and check `db.is_cpp_move_constructible(ty)` for each variant field in `analyze_field`.\n- Only mark a variant\u0027s `VariantKey` constructor `constexpr` when all of its fields are C++ literal types with `constexpr` move constructors.\n- Emit a `constexpr` destructor (`if (!::std::is_constant_evaluated()) { ... }`) for `EnumApiV2` enums that require drop glue from their variants without implementing `Drop` directly, allowing trivially destructible variants (such as `None`) to be constructed in constant expressions.\n- Constrain `VariadicUnionStorage`\u0027s defaulted copy and move operations on `VariadicUnion\u003cVs...\u003e` and `kTriviallyDestructible` rather than `std::is_trivially_copyable_v\u003cVs\u003e`, keeping non-`Copy` enums without drop glue trivially movable in C++ even when a variant holds a `Clone` type with a non-trivial C++ copy constructor.\n\nPiperOrigin-RevId: 1003293000\n"
    },
    {
      "commit": "3bb3eca85ed055f48a1cbadf32f7c4ac56d2e092",
      "tree": "50a6fbd9f4a536a9e3d7f049e5fe8d6f146510ff",
      "parents": [
        "6d9fc97d4d2976040a633fac65e93dd123ca694d"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Oct 20 18:18:24 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 18:20:12 2026"
      },
      "message": "rs_bindings_from_cc: Support std::string_view and absl::string_view constants\n\nScalar C++ `std::string_view` and `absl::string_view` constants (`constexpr`, or\n`const`/`inline` with constant initialization) are now bound in Rust as\n`\u0026\u0027static str` when their contents are valid UTF-8, and as `\u0026\u0027static [u8]`\notherwise.\n\nPiperOrigin-RevId: 1003249385\n"
    },
    {
      "commit": "6d9fc97d4d2976040a633fac65e93dd123ca694d",
      "tree": "15ffb1cc42d80624914bf6596d3177e14f2d2a6b",
      "parents": [
        "32a2035a7595823c2d3214a970ccf20093a9d5e4"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Tue Oct 20 17:37:37 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 17:38:56 2026"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 1003215512\n"
    },
    {
      "commit": "32a2035a7595823c2d3214a970ccf20093a9d5e4",
      "tree": "4108fbb1073b6432a4c21676b52a72bb3ec9d05b",
      "parents": [
        "88b35411529f3c794698414e3f8fc1e7e0afda18"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Oct 20 16:49:01 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 16:56:16 2026"
      },
      "message": "Remove dangling types/visibility.md reference from SUMMARY.md.\n\n`types/visibility.md` was moved to `errors/visibility.md` previously, but the\nentry in `SUMMARY.md` was left behind. When building the mdbook site\n(crubit.rs), mdbook generates an empty placeholder for any missing chapter\nlisted in `SUMMARY.md`, resulting in the empty page at\nhttps://crubit.rs/types/visibility.html.\n\nPiperOrigin-RevId: 1003177875\n"
    },
    {
      "commit": "88b35411529f3c794698414e3f8fc1e7e0afda18",
      "tree": "0206839ebe7bcedf9e08d6e18965bf277a470e08",
      "parents": [
        "f5fabb542d629c0d19a576b0befcdb34dd6f5341"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Oct 20 16:47:55 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 16:50:14 2026"
      },
      "message": "Prominently link crubit.rs in README.md.\n\nAdd a docs badge pointing to https://crubit.rs, and link to crubit.rs at the end of Getting Started in the GitHub README while using mdBook include anchors in g3doc/index.md to keep the sidebar note on crubit.rs.\n\nPiperOrigin-RevId: 1003177063\n"
    },
    {
      "commit": "f5fabb542d629c0d19a576b0befcdb34dd6f5341",
      "tree": "cb0ad387118d5e829323e1dbc061ac4db3029e48",
      "parents": [
        "eb9f60c6a0756b4799a71dd6fe90f75ef59db1da"
      ],
      "author": {
        "name": "Peter Foley",
        "email": "pefoley@google.com",
        "time": "Tue Oct 20 15:20:41 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 15:22:53 2026"
      },
      "message": "Internal-only change.\n\nPiperOrigin-RevId: 1003120065\n"
    },
    {
      "commit": "eb9f60c6a0756b4799a71dd6fe90f75ef59db1da",
      "tree": "371c4d0a6b5f12202b0e7a83b8f60f22c38a45d9",
      "parents": [
        "823b3456912d5d78a7ea7c432f637ee7f25145d5"
      ],
      "author": {
        "name": "Rostyslav Toch CA",
        "email": "rtoch@google.com",
        "time": "Tue Oct 20 09:18:59 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 09:19:49 2026"
      },
      "message": "Migrate `//third_party/crubit/rs_bindings_from_cc/test/bridging` Rust tests off deprecated `status_matchers`\n\n`//third_party/absl/status:status_rs_matchers` only re-exports `googletest::matchers::status_is`, which is already available via `googletest::prelude::*`, and is slated for deletion once users migrate to googletest directly.\n\nPiperOrigin-RevId: 1002941689\n"
    },
    {
      "commit": "823b3456912d5d78a7ea7c432f637ee7f25145d5",
      "tree": "6ccc000502697e2bcc2bf878c02cbae706e5ea6d",
      "parents": [
        "01b47ffbbc1b6308bddffc883fcfe97c72f53a7f"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Oct 20 07:51:33 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 07:52:55 2026"
      },
      "message": "Annotate `cc_std::std::string` with `#[crubit_annotate::cpp_move_constructible]`\n\nUnlike generated C++ struct bindings (which emit `///CRUBIT_ANNOTATE: cpp_move_constructible\u003d` when a C++ move constructor is available), the hand-written layout-compatible `cc_std::std::string` wrapper was missing `#[crubit_annotate::cpp_move_constructible]`. Because `cc_std::std::string` is `!Unpin` (due to SSO self-referential pointers), `cc_bindings_from_rs` did not recognize it as C++ move-constructible when used as a type argument to generic `cpp_layout_equivalent` types such as `cc_std::std::optional\u003ccc_std::std::string\u003e` or `status::NewStatusOr\u003ccc_std::std::string\u003e`.\n\nAdding `#[crubit_annotate::cpp_move_constructible]` to `cc_std::std::string` allows generic bridged containers instantiated with `cc_std::std::string` to derive C++ movability from their type argument and pass across the C++/Rust boundary.\n\nPiperOrigin-RevId: 1002899495\n"
    },
    {
      "commit": "01b47ffbbc1b6308bddffc883fcfe97c72f53a7f",
      "tree": "860ecb8e249d9134cd784a40f9cbdcced3287177",
      "parents": [
        "3efe4de062b79d2ef0bbdcb64ae28a143e558cce"
      ],
      "author": {
        "name": "Luke Zarko",
        "email": "zarko@google.com",
        "time": "Tue Oct 20 07:39:49 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 07:41:09 2026"
      },
      "message": "Enable ThinLTO for rs_bindings_from_cc bindings crates.\n\nPiperOrigin-RevId: 1002893958\n"
    },
    {
      "commit": "3efe4de062b79d2ef0bbdcb64ae28a143e558cce",
      "tree": "d01506acde8b4c0ecf2015ad47bc9feeb9f0b3cc",
      "parents": [
        "45f6f7d767891b4a75289f0426d4a8fb1b431deb"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Oct 20 07:30:58 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 07:31:58 2026"
      },
      "message": "Add `unsafe_template_params` feature gate to treat parameter types with unsafe template arguments as unsafe.\n\nFunctions taking parameter types with unsafe template arguments (such as\nstd::vector\u003cconst T*\u003e, std::optional\u003cT*\u003e, unique_ptr\u003cT*\u003e, Span\u003cT*\u003e, etc.)\nshould be marked `pub unsafe fn`, because constructing or passing such\ntypes with unsafe contents (such as raw pointers) requires unsafe invariants\nto be maintained by the caller.\n\nThis behavior is feature-gated behind the `unsafe_template_params` feature\nflag (aspect hint: `//third_party/crubit/features:unsafe_template_params`)\nto avoid regressions in existing Crubit targets.\n\nPiperOrigin-RevId: 1002889807\n"
    },
    {
      "commit": "45f6f7d767891b4a75289f0426d4a8fb1b431deb",
      "tree": "651a2005f98cdf982ab14fc8e5e8894591f30104",
      "parents": [
        "4debc0c3f4d8314e05bf94a3473ad019b61f5915"
      ],
      "author": {
        "name": "Luke Zarko",
        "email": "zarko@google.com",
        "time": "Tue Oct 20 06:06:47 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 06:07:45 2026"
      },
      "message": "Give class template specializations a lifetime parameter for their template argument\n\nThis is part of the resugaring-lite effort to make lifetimes+templates happy.\n\nUnder assume_lifetimes, a lifetime written on a class template argument was\nignored. Given\n\n  template \u003cclass T\u003e struct View { T value; };\n  View\u003cint\u0026 $a\u003e make(int\u0026 $a x);\n\nCrubit generated a `View` with no lifetime, so `make` returned a `View` that\nborrowed from nothing.\n\nThe reason is that `View\u003cint\u0026 $a\u003e` and `View\u003cint\u0026 $b\u003e` are the same C++ type,\n`View\u003cint\u0026\u003e`, so there was no place to record `$a`.\n\nThis change gives `View\u003cint\u0026\u003e` a lifetime parameter, `\u0027T`, that stands for the\nlifetime of its argument:\n\n  pub struct View\u003c\u0027T\u003e { ... }          // `T value` has lifetime \u0027T\n  pub fn make\u003c\u0027a\u003e(x: \u0026\u0027a mut c_int) -\u003e View\u003c\u0027a\u003e\n\nA specialization gets this parameter when it has a single type argument that\ncarries a single lifetime: a reference, a pointer, or a record with one\nlifetime parameter. Writing a lifetime on both the argument and the type,\n`View\u003cint\u0026 $a\u003e $b`, is an error.\n\nTwo rules keep `\u0027T` from being chosen freely by the caller:\n\n* A constructor that takes a reference, pointer or lifetime-carrying record\n  must take it as `T`/`const T\u0026` or mark it `[[clang::lifetimebound]]`;\n  otherwise the constructor gets no bindings. Without this, `Box(int\u0026 other)`\n  would let safe Rust build a `Box\u003c\u0027static\u003e` from a short-lived reference.\n* In member functions and in-class friends, `View` parameters and returned\n  `View\u0026` get `\u0027T`. Without this, a copy constructor would turn a `View\u003c\u0027a\u003e`\n  into a `View\u003c\u0027b\u003e`.\n\nExcluded: partial and explicit specializations, bridged types, templates in\nstd/absl/c9/rs_std, and templates with their own LIFETIME_PARAMS. Not yet\nhandled (the written lifetime is still dropped): more than one template\nargument, arguments with more than one lifetime (`View\u003cint**\u003e`), member\ntypedefs (`Holder\u003cint* $a\u003e::type`), and type aliases with a lifetime\n(`using V \u003d View\u003cint\u0026 $a\u003e`, b/498977848).\n\nThe IR gets a new field, `Record.has_template_argument_lifetime`. No golden\nfiles change.\n\nAlso fixes the importer test helper `IrFromCcWithoutAssumedLifetimes`: it\nenabled no Crubit features, so class templates were never instantiated and\nthe tests using it passed without testing anything. It now enables\n`supported`.\n\nPiperOrigin-RevId: 1002852411\n"
    },
    {
      "commit": "4debc0c3f4d8314e05bf94a3473ad019b61f5915",
      "tree": "6ab5c43243e3c819c624879c68a9976bad85cec3",
      "parents": [
        "6f47d3c1d2448a71e982a34c03f14827f88f9100"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Oct 20 04:39:35 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 04:45:05 2026"
      },
      "message": "Add diagnostic Clone impl and docs for cpp_std::string.\n\nBecause `cpp_std::string` is `!Unpin` (non-Rust-movable), it cannot implement `Clone`.\n\nAdd an unsatisfied `Clone` impl on `cpp_std::string` backed by a `#[diagnostic::on_unimplemented]` marker trait so callers attempting to clone `cpp_std::string` receive a compiler diagnostic explaining why `Clone` is unavailable and suggesting `ctor::emplace!(ctor::copy(s))`. Also document `cpp_std::string` in[] the `cpp_std::string` rustdoc examples, and the `using-crubit` skill and evaluation suite.\n\nPiperOrigin-RevId: 1002817300\n"
    },
    {
      "commit": "6f47d3c1d2448a71e982a34c03f14827f88f9100",
      "tree": "3785faea3b352b53b53c5833980df2c8e59d4c09",
      "parents": [
        "bca99f27c659871b7ba3836684f8c85fb9b56364"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Oct 20 04:37:39 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 04:40:25 2026"
      },
      "message": "Use layout-compatible std::pair when layout_compat_tuple or requires_layout_compatible is set.\n\n- Route `BridgeType::StdPair` through `BridgeRsTypeKind::bridge_type_args_if_not_layout_compatible` (shared with `BridgeType::StdOptional`) so that `std::pair\u003cT1, T2\u003e` uses its layout-compatible C++ struct representation when `options.requires_layout_compatible` is set (such as inside `std::optional\u003cstd::pair\u003c...\u003e\u003e` or struct fields) or when `layout_compat_tuple` is enabled on the target.\n- Add tests in `optional_test` covering `std::optional\u003cstd::pair\u003cint, int\u003e\u003e` and `std::pair\u003cstd::optional\u003cint\u003e, int\u003e` with `layout_compat_optional` and `layout_compat_tuple`.\n- Fix `generate_struct_and_union.rs` so that `std::pair`\u0027s layout-compatible C++ struct definition is emitted (rather than skipped via `is_bridge_type()`) since it is required for layout-compatible fallback contexts.\n- Add test `optional_nested_pair_test` covering `std::optional\u003cstd::pair\u003cint, int\u003e\u003e` with ONLY `layout_compat_optional` enabled to verify the layout-compatible fallback for nested bridged types.\n\nPiperOrigin-RevId: 1002816551\n"
    },
    {
      "commit": "bca99f27c659871b7ba3836684f8c85fb9b56364",
      "tree": "925179121f2ade8b8b305ea2ef842d65055a1a80",
      "parents": [
        "c7025c63411a4ad77bfb4073710ee23b5d61fd39"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Oct 20 04:34:56 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 04:36:08 2026"
      },
      "message": "Make the Slot construction helpers used by emplace! unsafe fns.\n\n`Slot::unsafe_construct`, `Slot::try_unsafe_construct`, and\n`Slot::unsafe_as_pin_unchecked` were safe (`#[doc(hidden)]`) `pub fn`s with\nunchecked memory-safety preconditions, so safe code could e.g. get a\n`Pin\u003c\u0026mut T\u003e` to uninitialized memory with\n`Slot::unsafe_new().unsafe_as_pin_unchecked()`. They were safe only so that\n`emplace!` / `try_emplace!` could call them without an `unsafe` block that would\nalso cover the user\u0027s ctor expression.\n\nThey are now `pub unsafe fn`s with `# Safety` docs. `emplace!` and\n`try_emplace!` evaluate the ctor expression in a `match` scrutinee outside of a\nnarrow `unsafe` block (a `match` rather than a `let`, so that temporaries the\nctor borrows still live until construction finishes), and `Slot::as_opt_mut`\ncalls `unsafe_as_pin_unchecked` inside its existing `unsafe` block. The only\ncallers of these functions are in ctor.rs.\n\nAdded tests that `emplace!` / `try_emplace!` still accept ctors borrowing\ntemporaries and still work under `#[forbid(unsafe_code, unused_unsafe)]`.\n\nPiperOrigin-RevId: 1002815336\n"
    },
    {
      "commit": "c7025c63411a4ad77bfb4073710ee23b5d61fd39",
      "tree": "9f19f634edac5b21f04e0bdd974d2d5a073bc558",
      "parents": [
        "82ffa9c090ae31309e924c94cec8e6a526dee82c"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Oct 20 04:25:08 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 04:28:39 2026"
      },
      "message": "Make vector::mutate_self_as_vec panic-safe.\n\n`mutate_self_as_vec` lends the storage of a `vector\u003cT\u003e` to a temporary\n`ManuallyDrop\u003cVec\u003cT, Allocator\u003e\u003e` and only wrote the new buffer, length and\ncapacity back into `self` after the closure returned. If the closure panicked\n(e.g. a user callback passed to `retain`, `dedup_by`, `resize_with`, or a\npanicking iterator passed to `extend`) after the `Vec` had reallocated or\ndropped elements, `self` kept a stale pointer, length or capacity. Dropping it\nduring unwinding then freed the old buffer a second time or dropped elements\ntwice.\n\nWrite the state back from the `Drop` impl of a new `VecMutationGuard`, so it\nalso happens during unwinding, and re-poison the ASan tail there as well.\n\nAll other `vector` methods that mutate the storage go through\n`mutate_self_as_vec`. `clone`, `into_vec`, `into_iter` and\n`From\u003cVec\u003cT, Allocator\u003e\u003e` don\u0027t run user code between taking and handing back\nownership of the buffer.\n\nPiperOrigin-RevId: 1002811270\n"
    },
    {
      "commit": "82ffa9c090ae31309e924c94cec8e6a526dee82c",
      "tree": "99afaf8469b30673d1c773dfcf0b4782544d81c4",
      "parents": [
        "939d13143407029bf3afe5a363040e9bb96e2acf"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Oct 20 04:16:44 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 04:18:46 2026"
      },
      "message": "Compile multiplatform_rust_test binaries once instead of once per platform\n\n`multiplatform_rust_test` used to instantiate five identical `rust_test`\ntargets whose only difference was the runtime value of\n`CRUBIT_TEST_PLATFORM`, so every edit under `rs_bindings_from_cc` compiled\nand linked each affected test binary five times (and, for the `crate \u003d`\nbased `database_test`, compiled the `database` crate under `cfg(test)` five\ntimes). Now only `\u003cname\u003e-x86_linux` is a `rust_test`; the other four\nplatforms are thin test rules that re-run the same binary with a different\n`CRUBIT_TEST_PLATFORM`, forwarding the wrapped test\u0027s environment, runfiles,\nexecution requirements and coverage information. Target names are\nunchanged.\n\nFor an edit to `generate_function.rs`, testing\n`//third_party/crubit/rs_bindings_from_cc/generate_bindings:generate_function_test`\nnow compiles one test binary instead of five (CPU 66s -\u003e 50s, wall-clock\n16s -\u003e 13s). Across the eight `multiplatform_rust_test` suites this removes\n32 compile+link actions per affected rebuild.\n\nAlso shard `ir_from_cc_test` (217 tests, the slowest multi-platform test at\n7-15s per platform) four ways, which brings each run down to 2-6s.\n\nThe Cargo generator\u0027s `rule_info` aspect now looks through the per-platform\nwrapper: Bazel sorts `test_suite.tests`, so `tests[0]` is no longer the\n`rust_test`. The generated Cargo files are unchanged.\nPiperOrigin-RevId: 1002808056\n"
    },
    {
      "commit": "939d13143407029bf3afe5a363040e9bb96e2acf",
      "tree": "a5ff5c017caab56ce79584a109f444e7a6589f5e",
      "parents": [
        "e684b7a0886d4cf125b6d26a2bda25aced61f6ef"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Oct 20 02:59:00 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 03:00:16 2026"
      },
      "message": "Import helpers from their defining crates in cc_bindings_from_rs\u0027s generate_bindings modules\n\nThe modules of `generate_bindings` imported ~20 names through `lib.rs`\n(`use crate::{get_layout, is_copy, BridgedType, RsSnippet, ...}`) even\nthough those names are defined in `query_compiler`, `database`,\n`format_type` or `generate_function_thunk`. Import them from where they are\ndefined, and drop the `lib.rs` imports that only existed to re-export them.\n\nNo behavior change; this removes the last dependencies of the modules on\n`lib.rs` that are not genuine `lib.rs` items, in preparation for splitting\nthe crate.\n\nPiperOrigin-RevId: 1002776427\n"
    },
    {
      "commit": "e684b7a0886d4cf125b6d26a2bda25aced61f6ef",
      "tree": "e8499885ef50aac9e419e5cf1cd23063c6d568e8",
      "parents": [
        "08313c3c767ce81bd06bb0cbd462769cd1fb9539"
      ],
      "author": {
        "name": "Lukasz Anforowicz",
        "email": "lukasza@google.com",
        "time": "Tue Oct 20 01:28:08 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 01:29:39 2026"
      },
      "message": "Mostly internal-only changes.\n\nPiperOrigin-RevId: 1002739714\n"
    },
    {
      "commit": "08313c3c767ce81bd06bb0cbd462769cd1fb9539",
      "tree": "a627159e0cfa6984b312a4a9fd6eb3dc55cc78da",
      "parents": [
        "7afdef9c168d5d21d7cc487e528e63778e305da1"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Oct 20 01:07:43 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 01:09:19 2026"
      },
      "message": "Move constructor and constant generation out of cc_bindings_from_rs\u0027s lib.rs\n\nSecond preparatory step towards splitting the `generate_bindings` crate\ninto per-module crates. This is a pure code move with no behavior change:\n\n  * The default/copy/move constructor and assignment-operator generators\n    (and the `BindingsGenerator` queries that pick a codegen style for them)\n    move from `lib.rs` into a new `generate_ctor` module, which depends only\n    on `generate_function_thunk`.\n  * `generate_const`, its helper `format_const_value`, and\n    `create_type_alias_with_rs_type` move from `lib.rs` into\n    `generate_struct_and_union`, next to the helpers they call.\n\nFour functions that were private to `lib.rs` become `pub(crate)` because\n`new_database` now registers them from another module. `lib.rs` shrinks\nfrom 3,016 to 2,444 lines.\n\nPiperOrigin-RevId: 1002730907\n"
    },
    {
      "commit": "7afdef9c168d5d21d7cc487e528e63778e305da1",
      "tree": "7cf124e377078dc2afe8367ecd8ceb218cbeca0c",
      "parents": [
        "bec37ff62b729b78ef35213a2beae45a906e2e86"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Oct 20 00:45:21 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 00:46:35 2026"
      },
      "message": "docs: Update stale \"unsupported\" claims in Crubit documentation\n\nThis removes or updates claims about Crubit limitations that have been resolved.\nFindings were automatically verified against current implementation tests and goldens.\n\nUpdates include:\n- `cookbook.md`: Public mutable fields are now supported via `std::cell::Cell`.\n- `std.md`: Layout-compatible `std::string` is available behind the `layout_compat_string` feature flag.\n- `functions.md` \u0026 `index.md`: Returned references are now supported.\n- `use_declarations.md`: Renaming function re-exports is supported.\n- `enums.md`: Removed TODO for constexpr enum constructors (b/489085607 is fixed).\n- `unsupported_type.md`: Bridged protos can be passed by reference via `proto_references`.\n- `types/index.md`: Removed `const Status\u0026` as an example of an unsupported bridged reference type.\n- `features/README.md`: Replaced the move-constructor `:experimental` example with `:layout_compat_string`.\n\nPiperOrigin-RevId: 1002719620\n"
    },
    {
      "commit": "bec37ff62b729b78ef35213a2beae45a906e2e86",
      "tree": "4cedb97c3603c207a3cc7b6e836884ee5dc9cac4",
      "parents": [
        "ab44239dfc4dc97f8d0152e8dbc37171e9d26aa4"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Oct 20 00:34:18 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 00:40:42 2026"
      },
      "message": "Turn on nonnull_smart_pointers by default, denylisting targets that break.\n\nWith `nonnull_smart_pointers` []\n\n*   C++ -\u003e Rust: a smart pointer (`std::unique_ptr`, `std::shared_ptr`) annotated\n    as non-null maps to the bare Rust `Ptr` type, which is non-null and\n    implements `Deref` (panicking if it is null anyway). Every other smart\n    pointer maps to `cc_std::std::Nullable\u003cPtr\u003e`, which must be checked before\n    use (e.g. via `OptionLike::into_option`).\n*   Rust -\u003e C++: a bare `Ptr` is spelled `Ptr crubit_nonnull`, and\n    `Nullable\u003cPtr\u003e` is spelled `Ptr crubit_nullable`.\n\nThis adds the feature to `SUPPORTED_FEATURES`. Targets that break are listed in\n`SUPPORTED_FEATURE_DENYLISTS` and will be migrated separately. Like other\nrecently flipped features, it is not part of the `all` feature set, so\n`:experimental` targets don\u0027t get it yet.\n\nPiperOrigin-RevId: 1002714143\n"
    },
    {
      "commit": "ab44239dfc4dc97f8d0152e8dbc37171e9d26aa4",
      "tree": "aea4f6708201ba94f0488ab525a71de2e6bb87fe",
      "parents": [
        "5b4f82db9a76188ab2423993a119f839d26c2736"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Oct 20 00:34:15 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 00:35:31 2026"
      },
      "message": "rs_bindings_from_cc: Move ParameterizedByTAndStdTraitT into ast_util\n\nMove `ParameterizedByTAndStdTraitT` out of `importers/cxx_record.cc` into\n`ast_util`, taking a `clang::ASTContext` instead of an `ImportContext`, so that\nother importers can recognize specializations such as\n`std::basic_string_view\u003cchar, std::char_traits\u003cchar\u003e\u003e`.\n\nPiperOrigin-RevId: 1002714123\n"
    },
    {
      "commit": "5b4f82db9a76188ab2423993a119f839d26c2736",
      "tree": "5cf285533602512d7db81661367a9c4733465d36",
      "parents": [
        "31c7493ffb7cce6be99d3f801d992019e506be96"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Oct 20 00:14:08 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 00:15:55 2026"
      },
      "message": "Keep the failed dependency\u0027s error in NoBindingsReason::DependencyFailed.\n\n`NoBindingsReason::DependencyFailed` stored the reason its dependency can\u0027t be\nbound as a `String`, so everything but the message was lost as soon as the\nfailure propagated to a dependent item.\n\nStore the dependency\u0027s `arc_anyhow::Error` (`source`) instead, and the item name\nas the `Rc\u003cstr\u003e` that `debug_name` already returns. The rendered message is\nunchanged. This lets a follow-up carry metadata about the failed dependency, such\nas which item caused the failure, through to the error report.\n\nPiperOrigin-RevId: 1002703449\n"
    },
    {
      "commit": "31c7493ffb7cce6be99d3f801d992019e506be96",
      "tree": "486982b48a6a03f33fd9e0b27aa9613e3de459fe",
      "parents": [
        "356f53115d0802bba23ece0def3685f47d29eab3"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Oct 20 00:08:29 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 20 00:10:28 2026"
      },
      "message": "Add `explicit operator bool` and implicit `std::nullopt_t` conversion to `rs_std::Option`.\n\nThese mirror `std::optional\u003cT\u003e` so that existing C++ callers using `if (opt)`\nand `cond ? opt : std::nullopt` keep compiling when Rust APIs returning\n`Option\u003cT\u003e` switch from `std::optional\u003cT\u003e` to `rs_std::Option\u003cT\u003e` under\n`always_specialize_generics_in_cpp_api_from_rust`.\n\nTEMP API: these are being added for migration purposes, and are subject to be removed later possibly.\n\nPiperOrigin-RevId: 1002700546\n"
    },
    {
      "commit": "356f53115d0802bba23ece0def3685f47d29eab3",
      "tree": "9876b937a34060c01998a8388e2acda9c94e26f3",
      "parents": [
        "1596fe77362b5eada319e78cf3b0c57d0f71fffb"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Mon Oct 19 23:32:43 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 23:33:55 2026"
      },
      "message": "Update Crubit build system docs to focus on what works outside Google.\n\nRewrite the Build System Integrations page as an overview (support matrix,\ntoolchain requirements, releases), and split the per-build-system setup into\nnew Bazel and CMake pages. The Bazel page includes the example MODULE.bazel,\nBUILD.bazel, and main.cpp directly so that versions do not go stale, and\ndocuments rust_api_from_cpp alongside cpp_api_from_rust.\n\nAlso:\n* rust/building.md and cpp/building.md: point readers at the Bazel and CMake\n  pages, cross-link the two directions in case readers landed on the wrong\n  page, and replace the stale rs_bindings_from_cc build instructions\n  (rs_bindings_from_cc_impl, LLVM_INSTALL_PATH) with the commands CI uses,\n  including the proto header, PROTOC, and CRUBIT_LLVM_DEV_DATE steps.\n* README.md: add \"Why Crubit?\" and \"Using Crubit in your project\" sections,\n  and export the example as plain headings so that GitHub renders it without\n  literal mdbook tab markers.\n* Document that cc_bindings_from_rs works with nightly toolchains and the two\n  most recent stable releases with the rustc-dev component.\n* status.md: refresh the stale Build System section.\n* SUMMARY.md: add the new pages, plus limits.md and cargo_build_protobuf.md,\n  which were linked but not in the mdbook sidebar.\nPiperOrigin-RevId: 1002679100\n"
    },
    {
      "commit": "1596fe77362b5eada319e78cf3b0c57d0f71fffb",
      "tree": "3e62b461bb48e0e015ecb1b8073ef77066be1910",
      "parents": [
        "f9d1854b29537c291b92ccef29ed353e41b185ed"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Mon Oct 19 23:25:08 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 23:26:00 2026"
      },
      "message": "Refresh Crubit documentation for overview.\n\nPiperOrigin-RevId: 1002674326\n"
    },
    {
      "commit": "f9d1854b29537c291b92ccef29ed353e41b185ed",
      "tree": "c0731934d7d02474f30d45124bf7468e99c456a8",
      "parents": [
        "406356b0e99a4eeb970a692835ab806417a277e2"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Mon Oct 19 23:18:20 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 23:19:40 2026"
      },
      "message": "Document and test absl::Span and std::span support for exported \u0026[T] parameters.\n\nRust slice parameters (`\u0026[T]`) are bound to `rs_std::SliceRef\u003cconst T\u003e` in C++,\nwhich already provides implicit converting constructors from `absl::Span\u003cconst T\u003e`,\n`absl::Span\u003cT\u003e`, `std::span\u003cconst T\u003e`, and `std::span\u003cT\u003e`.\n\nThis change:\n- Adds test cases in `functions_test.cc` calling an exported `fn sum_bytes(bytes: \u0026[u8])`\n  with `absl::Span\u003cconst uint8_t\u003e`, `absl::Span\u003cuint8_t\u003e`, `std::span\u003cconst uint8_t\u003e`,\n  and `std::span\u003cuint8_t\u003e`.\n- Improves the `using-crubit` skill and `g3doc/rust/functions.md` to document\n  implicit conversions from `absl::Span` and `std::span` for slice parameters.\n- Adds eval cases to `using_crubit/EVAL.txtpb`.\n\nPiperOrigin-RevId: 1002670381\n"
    },
    {
      "commit": "406356b0e99a4eeb970a692835ab806417a277e2",
      "tree": "39371f2c794f41a09a158fc76df773472e06f414",
      "parents": [
        "74437aaba71d87da2ef1a948d922959eac5cc1e4"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Mon Oct 19 23:05:22 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 23:06:35 2026"
      },
      "message": "Move leaf helpers so cc_bindings_from_rs\u0027s generate_bindings modules form a DAG\n\nThis is a pure code move with no behavior change, in preparation for\nsplitting the 15K-line `generate_bindings` crate into per-module crates\n(like `rs_bindings_from_cc`). Three direct-call cycles kept the modules\nfrom being separable:\n\n  * `format_type` \u003c-\u003e `generate_function` / `generate_function_thunk`:\n    `check_fn_sig`, `is_thunk_required` and `replace_all_regions_with_static`\n    move down into `format_type`; `fn_arg_idents`, `function_symbol_name`\n    and `get_async_future_output_ty` move from `generate_function` into\n    `generate_function_thunk`.\n  * `generate_enum` \u003c-\u003e `generate_struct_and_union`: `anonymous_field_ident`\n    and `scalar_value_to_string` move into `generate_enum`.\n\nModule dependencies now flow in one direction only: `format_type` -\u003e\n`generate_function_thunk` -\u003e `generate_function` -\u003e\n`generate_struct_and_union` -\u003e `generate_template_specialization`, with\n`generate_enum`, `get_generic_args` and `avoid_colliding_types` as leaves.\n\nPiperOrigin-RevId: 1002661540\n"
    },
    {
      "commit": "74437aaba71d87da2ef1a948d922959eac5cc1e4",
      "tree": "bf745bc5dcdf1c30cd51034a6fed63e090da3ce5",
      "parents": [
        "5e892f1d74b66d05ae72de5c63101399f9a6d35d"
      ],
      "author": {
        "name": "Lukasz Anforowicz",
        "email": "lukasza@google.com",
        "time": "Mon Oct 19 22:54:19 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 22:55:30 2026"
      },
      "message": "Propagate `crate_features` into generated `BUILD.gn` files.\n\n`bazel_to_builds` now copies `crate_features` of `rust_library` and\n`rust_proc_macro` targets into the GN `features` parameter.  This\nmakes Chromium build `support:forward_declare` with the \"unstable\"\nfeature (and `support:ctor` with \"same_abi\", and `ffi_11` with\n\"crubit\"), the same as Bazel does.\n\nPiperOrigin-RevId: 1002654570\n"
    },
    {
      "commit": "5e892f1d74b66d05ae72de5c63101399f9a6d35d",
      "tree": "04c2bc53d401f9c72ad7331e2928d48086d89310",
      "parents": [
        "bad7c13e2e2677e6b4206e90536ff47912d35e9a"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Mon Oct 19 22:26:51 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 22:28:05 2026"
      },
      "message": "Keep missing-feature reasons as errors instead of strings.\n\n`missing_feature_descriptions` and `RsTypeKind::missing_feature_descriptions_of_type`\nreturned the reasons an item can\u0027t receive bindings as `Vec\u003cString\u003e`, and\n`NoBindingsReason::MissingRequiredFeatures` stored them that way. Converting to a\nstring early throws away everything an `Error` carries except its message, including\nany metadata attached to it.\n\nReturn and store `arc_anyhow::Error`s instead and only render them when building\nthe final message. Messages are unchanged: reasons are still deduplicated and\nsorted by their message, and joined in the same way. This prepares for recording,\nin the error report, which items without bindings caused an error, which must\nsurvive these conversions.\n\nPiperOrigin-RevId: 1002637250\n"
    },
    {
      "commit": "bad7c13e2e2677e6b4206e90536ff47912d35e9a",
      "tree": "698251885539b2fc2046b2b1324095343fa6c12d",
      "parents": [
        "dcae583091ec076d656aae3fe00e0dbd70867103"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Mon Oct 19 21:12:08 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 21:13:16 2026"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 1002584821\n"
    },
    {
      "commit": "dcae583091ec076d656aae3fe00e0dbd70867103",
      "tree": "f4930296b64dd7882dafffc2103ef838357d68fa",
      "parents": [
        "cc629004971a3bdf7087bec64b573b392e1e5332"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Mon Oct 19 20:26:26 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 20:28:03 2026"
      },
      "message": "Enable `iterator_item_references` by default.\n\nRust `Iterator` and `IntoIterator` implementations whose `Item` associated type is a reference (`\u0026T` or `\u0026mut T`) now generate C++ `Iterator` / `IntoIterator` bindings with `const T\u0026` or `T\u0026` as the `Item` type instead of `const T* crubit_nonnull` or `T* crubit_nonnull`.\n\nPiperOrigin-RevId: 1002552808\n"
    },
    {
      "commit": "cc629004971a3bdf7087bec64b573b392e1e5332",
      "tree": "7d1258449dc07800be17bef6bc0b6d30134e98fd",
      "parents": [
        "8371c42acb082400b53b47ca76f54f5337a67c68"
      ],
      "author": {
        "name": "Michael VanBemmel",
        "email": "mvanbem@google.com",
        "time": "Mon Oct 19 18:54:00 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 18:55:44 2026"
      },
      "message": "Document the `RUSTC_BOOTSTRAP\u003d1` workaround\n\nFor building Crubit with stable Rust. We support this; if it breaks it\u0027s our problem and not Rust\u0027s.\n\nPiperOrigin-RevId: 1002492617\n"
    },
    {
      "commit": "8371c42acb082400b53b47ca76f54f5337a67c68",
      "tree": "52f41249ba35a2b693a0935cedf4394103fa6051",
      "parents": [
        "34cbb0ab42cd975cd9d9d1caa69155e2fb6a5131"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Mon Oct 19 18:37:13 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 18:38:34 2026"
      },
      "message": "Match DefKind::Const with a struct pattern in generate_item_impl.\n\nIn Rust 1.98.0 and 1.99.0 (prior to rust-lang/rust@06e076ee7e on 2026-09-11), `DefKind::Const` was a struct variant (`DefKind::Const { is_type_const: bool }`) rather than a unit variant. Restore `DefKind::Const { .. }` (which was accidentally replaced with `DefKind::Const` in https://github.com/google/crubit/commit/980e5003e42f925ba4d8701140bdad0147d10834) with `#[allow(clippy::unneeded_struct_pattern)]` so `cc_bindings_from_rs` compiles across both stable and nightly toolchains.\n\nfixes #2429\nfixes #2431\nfixes #2438\n\nPiperOrigin-RevId: 1002481229\n"
    },
    {
      "commit": "34cbb0ab42cd975cd9d9d1caa69155e2fb6a5131",
      "tree": "eb573b6fe84013323e0e10e179a5634c1e1f6a7e",
      "parents": [
        "cc3f070f0a95baef49e84a765b0a5989f6e3f1ea"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Mon Oct 19 18:27:16 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 18:28:59 2026"
      },
      "message": "Let Crubit find a wrapped error anywhere in an arc_anyhow error chain.\n\n`arc_anyhow::Error` wraps an `anyhow::Error`, and adding context to an\n`arc_anyhow::Error` wraps it again in a private `StdError`. That wrapper hides\nthe outermost error of the inner chain, so `chain()` and `downcast_ref()` can\u0027t\nreach an error once context has been added on top of it.\n\nAdd `Error::find_cause`, which returns the outermost error of a given type,\nalso looking inside `StdError` wrappers, and `Error::source`, mirroring\n`std::error::Error::source`. Both are unused for now: they let a follow-up\nattach a transparent marker error to an error (to record which items caused it\nin the error report) that survives added context.\n\nPiperOrigin-RevId: 1002474360\n"
    },
    {
      "commit": "cc3f070f0a95baef49e84a765b0a5989f6e3f1ea",
      "tree": "8e2e31b4163885165a01831f78e2d49ca9cefc66",
      "parents": [
        "5265e46090c9b2c8e4eaccc567efa51b1a9ad2b5"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Mon Oct 19 18:14:16 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 18:15:40 2026"
      },
      "message": "Share Into trait thunks between conversion operators and constructors.\n\nAn Into trait impl can be used as both a conversion operator and a\nconstructor. When this happens we emit duplciate thunks (because they\nboth call the same Into impl), causing compile errors.\n\nPreviously, we had logic to supress emitting one of the thunks when we\ndetected one had already been emitted. This logic was brittle and prone\nto missing edge cases. Now we deduplicate trait thunks that appear in\nRsSnippets, so that both can be emitted and we\u0027ll only emit one in the\nfinal binary.\n\nPiperOrigin-RevId: 1002465295\n"
    },
    {
      "commit": "5265e46090c9b2c8e4eaccc567efa51b1a9ad2b5",
      "tree": "f52e717f9d6046215cde3fbcc354e3fb8cf3fffd",
      "parents": [
        "dedd2bf42476933bd9aebd29b7396daefceeb701"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Mon Oct 19 17:52:49 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 17:56:05 2026"
      },
      "message": "Make bridge ABI encoding unsafe and use wrapping subtraction in Encoder and Decoder.\n\n- Mark `encode` on the bridge ABI trait as `unsafe fn`, matching `decode`, since callers must guarantee that the encoder buffer has at least `Self::SIZE` bytes remaining.\n- Replace checked `-\u003d` subtraction on `remaining_bytes` in `TransmuteAbi::{encode, decode}` with `wrapping_sub` so buffer encoding and decoding do not emit panic branches.\n- Add `#[inline(always)]` to bridge encode/decode implementations to ensure multi-field tuple/option bridging inlines cleanly before LTO.\n\nPiperOrigin-RevId: 1002449960\n"
    },
    {
      "commit": "dedd2bf42476933bd9aebd29b7396daefceeb701",
      "tree": "b5c653014f99c7d99f106fa8ec5a5a71f4444ba1",
      "parents": [
        "cf764305b3d4d5a579b66bc37e1a4f38e4ef88a6"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Mon Oct 19 16:54:01 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 16:55:25 2026"
      },
      "message": "Support generic ADT methods/constructors in generate_function and guard operator impls against recursive specializations.\n\nPiperOrigin-RevId: 1002408360\n"
    },
    {
      "commit": "cf764305b3d4d5a579b66bc37e1a4f38e4ef88a6",
      "tree": "b476a943c3a850148073dc7374121915fc3fd904",
      "parents": [
        "617f42f21287eb5097cd33b4d28da38e9ebcc074"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Mon Oct 19 16:40:30 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 16:42:30 2026"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 1002400069\n"
    },
    {
      "commit": "617f42f21287eb5097cd33b4d28da38e9ebcc074",
      "tree": "558a617b0cb2115d80b86f7ce5a6b398534efb73",
      "parents": [
        "58aea8ab93ac5274192cfe0cf78d1af8c126a3af"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Mon Oct 19 14:53:28 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 14:56:15 2026"
      },
      "message": "Use @rules_rust//rust/toolchain targets instead of hardcoded nightly_tools repo\n\nThis should let `rust_toolchains` instead of having to `use_repo` a\nspecific toolchain.\n\nPiperOrigin-RevId: 1002337233\n"
    },
    {
      "commit": "58aea8ab93ac5274192cfe0cf78d1af8c126a3af",
      "tree": "cf717c0d0a81fb85382eac81904920e5be109f35",
      "parents": [
        "89ff8f47fc3009d22fe330e4bd9a0c1c0ed63681"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Mon Oct 19 14:50:42 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 14:55:27 2026"
      },
      "message": "Add missing annotations_internal dependency to support/internal:bindings_support\n\ncheck.h uses CRUBIT_MUST_USE_RESULT without including annotations_internal.h\n\nPiperOrigin-RevId: 1002335744\n"
    },
    {
      "commit": "89ff8f47fc3009d22fe330e4bd9a0c1c0ed63681",
      "tree": "aa6b8a0499d2fe4c822c7522158902aef1542334",
      "parents": [
        "40ebea1f9d9fdba9bba449a7a9951730227ce260"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Mon Oct 19 14:49:08 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 14:50:29 2026"
      },
      "message": "Minor cc_bindings_from_rs test hygiene fixes\n\nAdd missing #![feature(rustc_private)] and extern crate declarations to unit test files, switch the_answer.md from runtime data to compile_data in include_str, and remove an unused libc dependency in primitive_types.\n\nPiperOrigin-RevId: 1002334881\n"
    },
    {
      "commit": "40ebea1f9d9fdba9bba449a7a9951730227ce260",
      "tree": "341d6731daac5f3b69a1f01813c5648dd4308db2",
      "parents": [
        "2d01c8b6d07dc25506d3ac7ee9c5ee154cdb74e8"
      ],
      "author": {
        "name": "Rostyslav Toch CA",
        "email": "rtoch@google.com",
        "time": "Mon Oct 19 13:50:49 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 13:52:46 2026"
      },
      "message": "Add borrowing conversions from cpp_std strings to `string_view`.\n\nIn C++, `std::string` converts implicitly to `std::string_view`, but in Rust\ncallers currently have to spell this as `s.as_slice().into()`. Add\n`From\u003c\u0026string\u003e` / `From\u003c\u0026string_wrapper\u003e` for `string_view`, which borrow the\nstring\u0027s buffer without copying.\n\nPiperOrigin-RevId: 1002305341\n"
    },
    {
      "commit": "2d01c8b6d07dc25506d3ac7ee9c5ee154cdb74e8",
      "tree": "66110528034225c8134b1000c2ea9f135b315fd2",
      "parents": [
        "fb2451952008156835f69a62454e70025d20e24d"
      ],
      "author": {
        "name": "Rostyslav Toch CA",
        "email": "rtoch@google.com",
        "time": "Mon Oct 19 12:52:08 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 19 12:53:31 2026"
      },
      "message": "Add conversions from `string_view` to cpp_std strings.\n\nRust callers holding a `cpp_std::string_view` currently have to go through\n`as_bytes()` to build an owned C++ string. Add `From\u003cstring_view\u003e` for\n`string_wrapper` and `CtorNew\u003cstring_view\u003e` for `string`, matching the existing\nconversions from `\u0026str` / `\u0026[u8]`.\n\nPiperOrigin-RevId: 1002278986\n"
    },
    {
      "commit": "fb2451952008156835f69a62454e70025d20e24d",
      "tree": "df5caa9fdac4d7ee7f866ea197857e513de23683",
      "parents": [
        "52ad8335e12860925626d6c20e0d8567937d5dcc"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Sun Oct 18 21:24:30 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sun Oct 18 21:25:23 2026"
      },
      "message": "Add a feature to bind operators that are hidden friends of base classes.\n\nArgument-dependent lookup also finds the hidden friends of a class\u0027s base\nclasses, which CRTP mixins commonly rely on to define operators for the derived\nclass:\n\n```c++\ntemplate \u003ctypename T\u003e\nstruct EqualityMixin {\n  friend bool operator\u003d\u003d(const T\u0026 lhs, const T\u0026 rhs) { ... }\n};\n\nstruct S final : EqualityMixin\u003cS\u003e { ... };\n```\n\nCrubit didn\u0027t generate bindings for such operators, because they are declared by\nthe base class (typically a class template specialization from another target)\nrather than by `S`. So `S` didn\u0027t implement `PartialEq` in Rust, even though\n`s1 \u003d\u003d s2` works in C++.\n\nWith the new `inherited_friend_operators` feature, `rs_bindings_from_cc` imports\nthese operators as if they were hidden friends of the derived class: they belong\nto the derived class\u0027s target, even if the base class is defined in another\ntarget, and are placed in the innermost namespace that encloses the derived\nclass. Only operators whose first parameter is (a reference to) the derived class\nare imported, so that each operator is imported for at most one class.\n\nThe feature is opt-in (and part of `experimental`), because the generated trait\nimpls conflict with any existing manual impls of the same traits.\n\nPiperOrigin-RevId: 1001937174\n"
    },
    {
      "commit": "52ad8335e12860925626d6c20e0d8567937d5dcc",
      "tree": "747ea9cf79ece5a4d83c83577e6c810af4362b96",
      "parents": [
        "3a08fb6cdeda8b28761bd34e61e5c43d27817073"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Sun Oct 18 20:22:20 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sun Oct 18 20:23:28 2026"
      },
      "message": "Propagate `clang::AlwaysInlineAttr` (`__attribute__((always_inline))`) to generated C++ thunks.\n\nWhen a C++ function (or its template instantiation pattern) is annotated with `__attribute__((always_inline))` / `[[gnu::always_inline]]` / `[[clang::always_inline]]`, record `is_always_inline` in Crubit\u0027s `Func` IR and emit `__attribute__((always_inline))` on the generated `extern \"C\"` C++ thunk (`__rust_thunk_...`). This ensures Cross-Language ThinLTO honors explicit `always_inline` annotations across the FFI boundary without forcing aggressive inlining on unannotated thunks.\n\nPiperOrigin-RevId: 1001920548\n"
    },
    {
      "commit": "3a08fb6cdeda8b28761bd34e61e5c43d27817073",
      "tree": "235f4c959a5a53480587dfff0d8cbac2c3e5ad4d",
      "parents": [
        "0acecd5577f83327bfac8ffe5b4c0822019aec82"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Sun Oct 18 20:11:08 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sun Oct 18 20:12:49 2026"
      },
      "message": "Update Crubit documentation for recent bindings changes.\n\nPiperOrigin-RevId: 1001917571\n"
    },
    {
      "commit": "0acecd5577f83327bfac8ffe5b4c0822019aec82",
      "tree": "d20669add6eca81000b98fbc64b216e768576a3f",
      "parents": [
        "d6c79682c5287e249625751cfdb803e5d05e1b9b"
      ],
      "author": {
        "name": "Luke Zarko",
        "email": "zarko@google.com",
        "time": "Sat Oct 17 08:24:24 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat Oct 17 08:25:19 2026"
      },
      "message": "Make Rust/C++ callable manager calls pass CFI in both directions.\n\nPiperOrigin-RevId: 1001369553\n"
    },
    {
      "commit": "d6c79682c5287e249625751cfdb803e5d05e1b9b",
      "tree": "03ab540e0fbcd4d57567789f74cfffa81ee7fa71",
      "parents": [
        "ad4168e885a2123c7bf12c32d814f57d3c00fce0"
      ],
      "author": {
        "name": "Luke Zarko",
        "email": "zarko@google.com",
        "time": "Sat Oct 17 07:25:27 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat Oct 17 07:26:24 2026"
      },
      "message": "Compile Crubit\u0027s generated _rust_api_impl.cc files against precompiled header modules.\n\nBefore this change, the C++ compile of every `_rust_api_impl.cc` file turned off\n`module_maps`. That meant it re-parsed the target\u0027s entire transitive header\nclosure as text, even when every header already had a precompiled `.pcm` from\nits `cc_library`. For targets with large include graphs, this compile was a\nlarge share of the cost of a C++ header edit.\n\nThis change keeps `module_maps` and `use_header_modules` on for that compile, so\nit imports the existing `.pcm` files of the wrapped target and its dependencies\ninstead of parsing their headers again.\n\nPiperOrigin-RevId: 1001351483\n"
    },
    {
      "commit": "ad4168e885a2123c7bf12c32d814f57d3c00fce0",
      "tree": "bbafff75ebf85e42c5b1a85b61d68d6329781858",
      "parents": [
        "d0706130e4db975146644dc97c00c9de7a3ef1c4"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Sat Oct 17 02:39:53 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat Oct 17 02:41:32 2026"
      },
      "message": "Don\u0027t forward inherited methods whose base-class bindings were suppressed.\n\nWith `oo_casting`, derived classes get forwarding methods for unambiguous\npublic base-class methods. `filter_out_ambiguous_member_functions` only checked\nthat `generate_function` succeeded for the base method, but `generate_item`\nadditionally suppresses items whose `has_bindings` check fails (e.g. methods\nusing a type from a target without Crubit,[]\nFor those methods, no thunk was emitted on the base class, while the derived\nclass still forwarded to it, causing `E0425: cannot find function\n__rust_thunk___...` compile errors in the generated bindings.\n\nNow we also require `has_bindings` to succeed before forwarding. The check is\napplied after the ambiguity count, so that an overload without bindings still\nmakes the overload set ambiguous (otherwise e.g. `AddPort(int)` would be\nforwarded even though `Base::AddPort` is suppressed as an overloaded function).\n\nPiperOrigin-RevId: 1001254142\n"
    },
    {
      "commit": "d0706130e4db975146644dc97c00c9de7a3ef1c4",
      "tree": "af8c788d0d03c5c98d85f8efdec84c3e7767baa9",
      "parents": [
        "980e5003e42f925ba4d8701140bdad0147d10834"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Fri Oct 16 23:51:31 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Oct 16 23:53:09 2026"
      },
      "message": "rs_bindings_from_cc: Deduplicate AsTopLevelNamespace into ast_util\n\n`importer.cc` and `importers/cxx_record.cc` each had an identical copy of\n`AsTopLevelNamespace`. Move it into `ast_util` so it can be shared.\n\nPiperOrigin-RevId: 1001186585\n"
    },
    {
      "commit": "980e5003e42f925ba4d8701140bdad0147d10834",
      "tree": "2de9fd920b2d42afcdc44bc1b2d492d4d1ffdbe7",
      "parents": [
        "ef767a28240542bdaa5781aeb362d1d9883bf322"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Fri Oct 16 23:19:08 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Oct 16 23:20:49 2026"
      },
      "message": "Support constants on generic types.\n\nPlumbs generic_args into generate_const so associated constants on generic impl blocks can be instantiated and evaluated.\nFix up a host of issues that turned over around generics consts:\n * Reject constants with explicit predicates\n * Emit const_eval_poly errors as diagnostics\n * Compares region-erased types when checking for self-referential constants\n\nPiperOrigin-RevId: 1001168489\n"
    },
    {
      "commit": "ef767a28240542bdaa5781aeb362d1d9883bf322",
      "tree": "19b08aeaf411f46eecd7193f7d4529e350b94de3",
      "parents": [
        "76b720a53a4a7550177848f782640c1270274ece"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Fri Oct 16 22:50:03 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Oct 16 22:51:57 2026"
      },
      "message": "Fix support/cc_std for non-len_capacity_encoding and OSS builds\n\nPiperOrigin-RevId: 1001151243\n"
    },
    {
      "commit": "76b720a53a4a7550177848f782640c1270274ece",
      "tree": "7b52d28694c2429f144c3d5c55ebf1f4ed790291",
      "parents": [
        "ffb7105185253640ab5e9f13a658d4a7bfc55667"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Fri Oct 16 22:28:44 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Oct 16 22:30:35 2026"
      },
      "message": "Preserve bound regions in replace_all_regions_with_static.\n\nPreserves ty::RegionKind::ReBound(..) in replace_all_regions_with_static so higher-ranked binders are not lost.\nReplace the panic on const generic arguments in format_ty_for_rs_with_lifetime_mode with an unsupported_type error while propagating parse_adt_template_specialization errors.\n\nPiperOrigin-RevId: 1001138419\n"
    },
    {
      "commit": "ffb7105185253640ab5e9f13a658d4a7bfc55667",
      "tree": "fea71c72115eecf85cfe473adb06bd58082819af",
      "parents": [
        "ad7a09d79c0df499bfc4197a63ad35fcb72740ab"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Fri Oct 16 13:19:46 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Oct 16 20:46:16 2026"
      },
      "message": "rs_bindings_from_cc: Bind string literal rows of `char` array constants\n\nRows of plain `char` C-array constants which are initialized by a string\nliteral (e.g. `constexpr char kNames[][8] \u003d {\"NOOP\", \"DROP\"};`) are now bound\nusing `::crubit_support::array::c_char_array_from_string_literal`, instead of\nelement by element.\n\nPiperOrigin-RevId: 1000812456\n"
    },
    {
      "commit": "ad7a09d79c0df499bfc4197a63ad35fcb72740ab",
      "tree": "3775c25eecc0b33e3a2fa5b72ca68759c1074688",
      "parents": [
        "ca243fbdfc622c6d6b7e8509180a6db8e771092e"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Fri Oct 16 13:16:40 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Oct 16 20:45:05 2026"
      },
      "message": "Generate enum_api_v2 C++ bindings for niche-encoded Copy Rust enums.\n\nUnder `CrubitFeature::EnumApiV2`, `Copy` enums using `rustc_abi::TagEncoding::Niche` now emit `::crubit::internal::tag_encoding::Niche\u003cDiscriminant, Offset, Untagged, Start, End, NicheStart\u003e` instead of falling back to an opaque blob of bytes.\n\n- `DiscriminantTy::of_tag` maps pointer-primitive tags (such as in `Option\u003c\u0026T\u003e`) to the pointer-sized unsigned integer, matching rustc\u0027s `Primitive::to_int_ty`.\n- Each variant\u0027s `kDiscriminant` is its variant index, matching the value decoded by `tag_encoding::Niche`.\n- The untagged variant omits `__crubit_tag`; each niche variant writes its encoded tag value at the niche\u0027s offset (with leading padding when the niche is at a non-zero offset).\n\nPiperOrigin-RevId: 1000811095\n"
    },
    {
      "commit": "ca243fbdfc622c6d6b7e8509180a6db8e771092e",
      "tree": "e97150eecb264adbe32509a6c2c99c645c35ba97",
      "parents": [
        "0a5f5f90fe7d7273cee9738efc4286a4eb9f3e6d"
      ],
      "author": {
        "name": "Fabian Wolff",
        "email": "fwolff@google.com",
        "time": "Fri Oct 16 10:20:22 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Oct 16 20:43:19 2026"
      },
      "message": "Use IDE fallback mode when internal rust-analyzer environment variable is set.\n\nPiperOrigin-RevId: 1000738035\n"
    },
    {
      "commit": "0a5f5f90fe7d7273cee9738efc4286a4eb9f3e6d",
      "tree": "559e6fa26174a048ea8f891b23080f73cf148c24",
      "parents": [
        "015020b38088ac480d4b0a0da4fb8aae6c529d8c"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Fri Oct 16 05:42:07 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Oct 16 20:42:07 2026"
      },
      "message": "Automatic code cleanup.\n\nPiperOrigin-RevId: 1000620249\n"
    },
    {
      "commit": "015020b38088ac480d4b0a0da4fb8aae6c529d8c",
      "tree": "b0afa349b9c03082be9280fc926b6e7f76187b42",
      "parents": [
        "caa7b2d3ecefad91fb69e115c7dde03b70f3cf21"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Fri Oct 16 04:19:54 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Oct 16 20:41:00 2026"
      },
      "message": "Register Windows as a non-prod platform for Crubit.\n\nPiperOrigin-RevId: 1000590635\n"
    },
    {
      "commit": "caa7b2d3ecefad91fb69e115c7dde03b70f3cf21",
      "tree": "f62fb6604cc31aac88de40660cb314351a6962b2",
      "parents": [
        "0af6bcd9dfd1d31c67db93a6c99251719258cb8a"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Fri Oct 16 00:10:25 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Oct 16 20:39:10 2026"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 1000491401\n"
    },
    {
      "commit": "0af6bcd9dfd1d31c67db93a6c99251719258cb8a",
      "tree": "71ff77a5433f6ee7accc2c086790210eec8b47db",
      "parents": [
        "50564c9a0cf29ff238032a55eae0ff594608f020"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Oct 15 23:25:37 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 23:29:14 2026"
      },
      "message": "Sync annotations.swig with annotations.h and document SWIG usage.\n\n* Add no-op SWIG definitions for `CRUBIT_BRIDGE(...)` and\n  `CRUBIT_UNSAFE_IGNORE_ATTR(...)`. Both macros are defined in `annotations.h`\n  but had no entries in `annotations.swig`.\n* Add a comment to `annotations.h` explaining that SWIG does not follow\n  `#include` directives, and how to pull in `annotations.swig`.\n* Mark `:annotations_swig` `compatible_with \u003d [\"//buildenv/target:non_prod\"]`\n  so that non_prod-constrained filegroups such as `//base/swig:google_swig`\n  can depend on it.\n\nPiperOrigin-RevId: 1000466606\n"
    },
    {
      "commit": "50564c9a0cf29ff238032a55eae0ff594608f020",
      "tree": "e0b181fcedd830c2fc36da1abb0188c1bac4a550",
      "parents": [
        "50f7998d106352c5086d43045f5d089ae95b5d5e"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Oct 15 23:20:53 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 23:24:36 2026"
      },
      "message": "Skip `quote!` blocks in `parse_inline_cpp_macros` and resolve default tool paths in `rust_with_cpp_fmt`.\n\n`parse_inline_cpp_macros` previously scanned all tokens in a Rust file for `inline_cpp!` and `global_cpp!` invocations, including macro tokens nested inside `quote!` or `quote_spanned!` blocks (such as in `generate_function_thunk.rs` and `generate_comment.rs`). Because `quote!` bodies contain Rust token interpolation (`#var`, `#(...)*`) rather than pure C++, running `clang-format` on them treated `#` interpolations as C preprocessor directives and mangled the formatting. Update `MacroParser` to skip balanced delimiter groups of `quote!` and `quote_spanned!` invocations.\n\nAdditionally, when `rust_with_cpp_fmt` was invoked outside of a build runfiles directory without explicit `--rustfmt-exe-path` or `--clang-format-exe-path` flags, it unconditionally used the relative runfiles paths from `external_binaries`, failing with `No such file or directory`. Resolve default `rustfmt` and `clang-format` paths by checking for a sibling binary next to `current_exe()`, then the compiled-in `external_binaries` path if present, then standard system paths (`/usr/bin/clang-format`, `/usr/local/bin/clang-format`), before falling back to `PATH`.\n\nPiperOrigin-RevId: 1000463877\n"
    },
    {
      "commit": "50f7998d106352c5086d43045f5d089ae95b5d5e",
      "tree": "dee5695ac6042ac5e0f58eaefc4dc48a9808e2f6",
      "parents": [
        "18da61bd08cd47d82aec3d00b0006dc6b62ba3dc"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Oct 15 23:17:48 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 23:19:04 2026"
      },
      "message": "Fix rs_bindings_from_cc crashes on implicit and non-template deduction guides.\n\n`Importer::GetDeclItems` erases the comments that lie within each child decl\u0027s\nsource range. The implicit copy deduction guide of a class template that is\ndeclared more than once can have an inverted source range: it begins at the\n`template` keyword of the most recent declaration (see\n`Sema::GetTemplateParameterList`), but ends at the name of the declaration that\nthe deduced type refers to. If a comment lies between the two (e.g. one attached\nto the non-canonical redeclaration, which is skipped), `std::map::erase(first,\nlast)` with `last` before `first` walks past `end()` and segfaults. Don\u0027t erase\ncomments for decls with an inverted source range.\n\nWith that fixed, non-template deduction guides (e.g. `S(int) -\u003e S\u003cint\u003e;`)\nreached `GetSourceOrderKey`, which mangles function names and hits\n`llvm_unreachable(\"Can\u0027t mangle a deduction guide name!\")`. Like deduction guide\ntemplates, don\u0027t import them.\n\nPiperOrigin-RevId: 1000462163\n"
    },
    {
      "commit": "18da61bd08cd47d82aec3d00b0006dc6b62ba3dc",
      "tree": "bef6ce4ce16d15c2ac4b57b58e5f8af78ed43848",
      "parents": [
        "74ed45251b8649841fd5aca75f9ffe9b09340395"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Thu Oct 15 23:08:45 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 23:10:04 2026"
      },
      "message": "Add documentation for the zero-sized type (ZST) limitation (b/258259459) and placeholder-field workaround to using_crubit/SKILL.md and g3doc/rust/structs.md.\n\nPiperOrigin-RevId: 1000457023\n"
    },
    {
      "commit": "74ed45251b8649841fd5aca75f9ffe9b09340395",
      "tree": "a75de2cc8694caad43e808dc3572fa77cc004f65",
      "parents": [
        "15539757085f652404b204313fcebc09eb1645fb"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Thu Oct 15 22:55:38 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 22:56:47 2026"
      },
      "message": "Clean up our copybara strips.\n\nWe had instances of incomplete or partial copybara strips that were\nimpacting OSS. This CL takes a pass over them to clean them up.\n\nclose #2362, close #2359\n\nPiperOrigin-RevId: 1000448986\n"
    },
    {
      "commit": "15539757085f652404b204313fcebc09eb1645fb",
      "tree": "184ea9115c4f17a2a3eaf34d8e4b68c0d43cf7d0",
      "parents": [
        "7b93acc4805e8bab3cbb0eea72e29e404c8dd9ae"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Thu Oct 15 22:46:37 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 22:49:34 2026"
      },
      "message": "Migrate cc_deps to rust_api_from_cpp in cpp_api_from_rust tests\n\nPiperOrigin-RevId: 1000443711\n"
    },
    {
      "commit": "7b93acc4805e8bab3cbb0eea72e29e404c8dd9ae",
      "tree": "28afc1e3ab24468b3d7f8e0a28ea9958625f6285",
      "parents": [
        "46508c6b1c5ae8c69543b5a9afdbdcfd4663afd2"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Oct 15 19:54:11 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 19:55:31 2026"
      },
      "message": "Use raw_string_view::size in raw_string_view::len instead of end - begin.\n\nNow that Crubit generates a safe `raw_string_view::size(\u0026self) -\u003e usize` method, `raw_string_view::len` can call `self.size()` directly instead of `(end(self) as usize) - (begin(self) as usize)`.\n\nThis resolves two issues:\n- Calling `end()` on a dangling `raw_string_view` performed pointer arithmetic on a dangling pointer, which was undefined behavior in Clang (b/249376862). Because `size()` only reads the length field without dereferencing or offsetting the data pointer, `raw_string_view::len(\u0026self)` no longer has any safety preconditions and can be a safe function.\n- Assuming `std::string_view::const_iterator` can be cast to `usize` fails to compile when libc++ wrapped or bounded iterators (`_LIBCPP_ABI_USE_WRAP_ITER_IN_STD_STRING_VIEW` or `_LIBCPP_ABI_BOUNDED_ITERATORS`) are enabled.\n\nPiperOrigin-RevId: 1000330136\n"
    },
    {
      "commit": "46508c6b1c5ae8c69543b5a9afdbdcfd4663afd2",
      "tree": "d89a6e67ae0364947b1dd48464e2b8d8909c1569",
      "parents": [
        "0e1a3c381cc1efbeeaa84f7257c1ee52737ac99e"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Oct 15 19:40:21 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 19:42:54 2026"
      },
      "message": "Add \u003cnetinet/udp.h\u003e to LIBC_HEADERS in cc_std\n\nExposes `udphdr` from `\u003cnetinet/udp.h\u003e` in `cc_std` so C++ headers that\nreference `struct udphdr` can generate Rust bindings.\n\nPiperOrigin-RevId: 1000321640\n"
    },
    {
      "commit": "0e1a3c381cc1efbeeaa84f7257c1ee52737ac99e",
      "tree": "667d415f3004bec90b55864a92a38ff61f91a524",
      "parents": [
        "4097f66c681438651c03a0dbe6798c1016fb573d"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Oct 15 18:09:06 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 18:10:55 2026"
      },
      "message": "Ignore `[[maybe_unused]]` (`clang::UnusedAttr`) on C++ records and fields.\n\n`[[maybe_unused]]` only suppresses unused diagnostics in C++ and does not affect memory layout or ABI. Previously, `CXXRecordDeclImporter::ImportFields` and `IsKnownAttr` did not list `clang::UnusedAttr` as a known attribute, causing fields with `[[maybe_unused]]` to be emitted as opaque byte blobs unless experimental features were enabled.\n\nPiperOrigin-RevId: 1000259165\n"
    },
    {
      "commit": "4097f66c681438651c03a0dbe6798c1016fb573d",
      "tree": "d2b5e3b652d6355347253fa9358ad97eab52f3a8",
      "parents": [
        "6e676efa3edb86af51a4938a5dc727873e37a4ff"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Oct 15 17:59:24 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 18:02:45 2026"
      },
      "message": "Clarify that tuples are only supported when calling Rust from C++.\n\nThe \"Are we Crubit Yet?\" status table listed `rs_std::Tuple\u003cT1, T2, ...\u003e` \u003c-\u003e\n`(T1, T2, ...)` as layout compatible without any caveat, which suggested tuples\nwork in both directions. They don\u0027t: `rs_std::Tuple` only has specializations\nemitted by `cc_bindings_from_rs` for Rust APIs, and C++ functions that take or\nreturn `rs_std::Tuple` or `std::tuple` don\u0027t get a Rust tuple in\n`rs_bindings_from_cc` bindings. Add a note saying so and suggesting a named\nstruct instead.\n\nPiperOrigin-RevId: 1000251571\n"
    },
    {
      "commit": "6e676efa3edb86af51a4938a5dc727873e37a4ff",
      "tree": "64b9f91975824c935168f19cbd4f409f242f4d6f",
      "parents": [
        "7fc30480a6280c3cd9a06a4f1c742a15ea24103f"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Thu Oct 15 17:14:04 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 17:17:46 2026"
      },
      "message": "Update OSS Bazel to import non-native rules.\n\nWith Bazel 9, some rules have shifted to be available in libraries\ninstead of natively. This updates our starlark to use the library\nversion of the rules and not the native version.\n\nfixes #2360\n\nPiperOrigin-RevId: 1000219492\n"
    },
    {
      "commit": "7fc30480a6280c3cd9a06a4f1c742a15ea24103f",
      "tree": "dba3119acbb7af418bcabd9b8c6dc33010430ffa",
      "parents": [
        "e7277629c7fc17727be3cec6f9aa474a1eb9f690"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Thu Oct 15 16:59:00 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 17:00:41 2026"
      },
      "message": "Automatically use layout-compatible types for ExistingRustType template arguments.\n\nWhen lowering template arguments for types mapped to `ExistingRustType`\n(such as `absl::StatusOr\u003cT\u003e`), require layout-compatible representations\nrather than bridged types. This allows types like `absl::StatusOr\u003cstd::string\u003e`,\n`absl::StatusOr\u003cstd::optional\u003cT\u003e\u003e`, and nested combinations to receive Crubit\nbindings automatically without explicitly enabling `layout_compat_string` or\n`layout_compat_optional` feature flags on the target.\n\nAlso fix `use\u003c...\u003e` emission on non-`Unpin` (`Ctor`) return types when the\nfunction has both lifetimes and non-`Unpin` (`PassingConvention::Ctor`)\nvalue parameters: emit named generic type parameters (`__CtorParam_...`)\ninstead of argument-position `impl Trait` (`::ctor::Ctor![...]`) so they\ncan be listed in `use\u003c...\u003e`, as required by Rust.\n\nPiperOrigin-RevId: 1000208882\n"
    },
    {
      "commit": "e7277629c7fc17727be3cec6f9aa474a1eb9f690",
      "tree": "b54a62da333a988aa418afc522b7a2f5e0f16238",
      "parents": [
        "fd98d338993c2a7d0649bf4462798522902b783e"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Oct 15 15:09:34 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 15:11:20 2026"
      },
      "message": "Fix double drop in Slot::clear when the value\u0027s Drop panics.\n\n`Slot::clear` called `drop_in_place` before resetting `is_initialized`. If\n`T::drop` panicked, the slot stayed marked as initialized, so `Slot::drop`\n(run during unwinding) called `clear()` again and dropped the value a second\ntime. Reset `is_initialized` first, so a panicking drop leaves the slot empty.\n\nAdds a regression test with a `Drop` impl that panics on the first drop; it\nsaw two drops without this fix.\n\nPiperOrigin-RevId: 1000145443\n"
    },
    {
      "commit": "fd98d338993c2a7d0649bf4462798522902b783e",
      "tree": "a63ed6e69c118e1073a0af2752169a0afbe7047c",
      "parents": [
        "48e949bf512a4fb1c646350b21a59a7c5d4ceb51"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Oct 15 14:36:12 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 14:37:28 2026"
      },
      "message": "Add operator\u003d\u003d and std::optional compatibility shims to rs_std::OptionBase.\n\nThis temporarily makes `rs_std::Option` a drop-in replacement for `std::optional`, and will be removed shortly.\n\nPiperOrigin-RevId: 1000126958\n"
    },
    {
      "commit": "48e949bf512a4fb1c646350b21a59a7c5d4ceb51",
      "tree": "c78a84357f01e5023b372b5b21d7c424ffc3d237",
      "parents": [
        "a5c6a126b270000eb33507e883aa22cb1d0315b3"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Oct 15 13:58:15 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 14:00:02 2026"
      },
      "message": "Support C array constants\n\nC arrays of booleans and integers (including `char`) with constant\ninitializers, e.g. `constexpr int kPrimes[] \u003d {2, 3, 5};`, are now bound as\nRust array consts: `pub const kPrimes: [c_int; 3] \u003d [2, 3, 5];`. This includes\nmultidimensional arrays and static data members.\n\nIR: for arrays, `Constant.value` is an `ArrayValue` and `Constant.type` is the\ninnermost element type. An `ArrayValue` has a length, and either integer\nelements (innermost dimension) or nested `ArrayValue` elements (outer\ndimensions). Only the explicitly initialized elements are recorded\nindividually; the value of the remaining (value-initialized) elements is\nrecorded once, as the filler. This keeps e.g. `int x[100000] \u003d {};` small.\n\nEach dimension is generated as one of:\n- all elements explicitly initialized: an array expression, `[1, 2, 3]`;\n- none: a repeat expression of the filler, `[0; 4]`;\n- some: `::crubit_support::array::padded_array(\u0026[7, 8], 0)` (added in\n  https://github.com/google/crubit/commit/94d901b880684e13a3cb7a52c0440b6200f43c2c), which pads the explicit elements with the filler.\n\n`char` arrays initialized by string literals are bound element by element for\nnow; unknown commit binds them using `c_char_array_from_string_literal` (also\nfrom https://github.com/google/crubit/commit/94d901b880684e13a3cb7a52c0440b6200f43c2c).\n\nZero-length arrays, dimensions over INT32_MAX, non-integer elements, and arrays\nwith more than 1024 explicitly initialized elements (to bound the size of the\ngenerated bindings) are reported as unsupported.\n\nPiperOrigin-RevId: 1000107647\n"
    },
    {
      "commit": "a5c6a126b270000eb33507e883aa22cb1d0315b3",
      "tree": "497beeefcf8ca1e143576aa9c937a231a3642f63",
      "parents": [
        "293cb52eac52e2fa051057dc99fe807325d473a3"
      ],
      "author": {
        "name": "Krasimir Georgiev",
        "email": "krasimir@google.com",
        "time": "Thu Oct 15 10:54:37 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 10:55:59 2026"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 1000028637\n"
    },
    {
      "commit": "293cb52eac52e2fa051057dc99fe807325d473a3",
      "tree": "814945bf804228266b22882528b20b8d6265c3fd",
      "parents": [
        "d757594f6f7ac27c0cf9c8ea63d9136f8e1f77ae"
      ],
      "author": {
        "name": "Vinh Tran",
        "email": "vinhdaitran@google.com",
        "time": "Thu Oct 15 10:39:16 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 10:40:30 2026"
      },
      "message": "Enable macos on all remaining golden tests.\n\nPiperOrigin-RevId: 1000022208\n"
    },
    {
      "commit": "d757594f6f7ac27c0cf9c8ea63d9136f8e1f77ae",
      "tree": "3b110091f1bfe2f562753545809bc445dc7eec72",
      "parents": [
        "57ca80e537288c09d46501f206f212fd0672f3a4"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Oct 15 01:45:11 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 01:46:32 2026"
      },
      "message": "Don\u0027t drop zero-sized outputs in ErasedFuture::poll_erased.\n\n`poll_erased` transfers ownership of the future\u0027s output to the caller by\nwriting it to `out`. For zero-sized output types it skipped the write (`out`\nmay be null in that case) but then let `val` fall out of scope, so a ZST with a\n`Drop` impl was dropped inside `poll_erased`, and dropped a second time once\nthe caller dropped the output it now owns.\n\nForget `val` in the zero-sized case instead. That\u0027s what `ptr::write` would do\nat runtime for a ZST. An unconditional `ptr::write` isn\u0027t an option, because the\ncontract allows `out` to be null for zero-sized `T` and `ptr::write` requires a\nnon-null pointer even then. The doc comment now says explicitly that ownership\nis always transferred.\n\nApplied to both copies of the trait (`support/rs_std/erased_future.rs` and\n`support/crubit_support/src/erased_future.rs`), with a regression test for\neach that counts drops of a zero-sized output type.\n\nPiperOrigin-RevId: 999770988\n"
    },
    {
      "commit": "57ca80e537288c09d46501f206f212fd0672f3a4",
      "tree": "9eb91b02afda9f4591874e202136d285756af806",
      "parents": [
        "b0f2ddfd5578322c0c855de7e9a82ee38a88fe02"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Oct 15 01:34:06 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 01:35:19 2026"
      },
      "message": "Fix null reference creation in shared_ptr::from_ptr_and_deleter.\n\n`shared_ptr::from_ptr_and_deleter` documents that `ptr` may be null (matching\nC++ `std::shared_ptr\u003cT\u003e(nullptr, deleter)`), but it built the result with\n`project_unchecked(delete_on_drop, |d| \u0026*d.ptr)`, which creates a `\u0026T` from\n`ptr`. For a null `ptr`, that is undefined behavior; in debug builds rustc\u0027s\nnull-pointer check panics there.\n\nInstead, take the control block from the `DeleteOnDrop` allocation with\n`into_raw_parts` and pair it with `ptr` via `from_raw_parts`, without ever\nforming a reference. A null `ptr` still gets a control block (`use_count() \u003d\u003d 1`)\nand the deleter is still called with null exactly once, as in C++.\n\nAdds tests for both the non-null and null cases; the null test panicked at the\nold `\u0026*d.ptr` before this change.\n\nPiperOrigin-RevId: 999765860\n"
    },
    {
      "commit": "b0f2ddfd5578322c0c855de7e9a82ee38a88fe02",
      "tree": "12c0e821310afe69efcbeae94dc4a8d222d6e603",
      "parents": [
        "3fd0890312f645ca5642bbcef3b0a5d7435c40c7"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Oct 15 01:12:46 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 15 01:14:02 2026"
      },
      "message": "Drop the constructed value in CtorThen if the closure fails or panics.\n\n`CtorThen::ctor` initializes `*dest` with the inner `Ctor`, then passes it\npinned to the user closure. If the closure returned `Err` or panicked, the\nvalue was neither dropped nor reported as initialized: callers such as\n`try_emplace!`, `Slot::try_replace`, and `Box::try_emplace` treat `dest` as\nuninitialized after a failed `ctor`, so the pinned value was deallocated or\noverwritten without running `Drop`. This violates the `Pin` drop guarantee.\n\nGuard `*dest` with a drop guard while the closure runs, and only disarm it if\nthe closure returns `Ok`. This matches the equivalence documented on\n`ctor_then` (`let mut x \u003d emplace!(y); x.mutating_method();`), where a panic in\n`mutating_method` drops `x`.\n\nAlso document on `Ctor::ctor` that an implementation which initializes `*dest`\nand then fails must drop it, and on `ctor_then` that the value is dropped if\n`f` fails.\n\nThe other combinators in ctor.rs (`ctor_map_err`, `ctor_or_else`,\n`ctor_expect`, `ctor_unwrap`, `ctor_unwrap_or_default`, `ctor_make_fallible`,\n`ctor_err_into`) only run user code after the inner `Ctor` has failed, when\n`dest` is still uninitialized, so they aren\u0027t affected. `ctor!` already uses\nper-field drop guards.\n\nPiperOrigin-RevId: 999756261\n"
    },
    {
      "commit": "3fd0890312f645ca5642bbcef3b0a5d7435c40c7",
      "tree": "886fb17ae606253c8b6204e1439872555de7b5db",
      "parents": [
        "b83e756497c2d3772dbf9b640ceaf1fec2e2b023"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Wed Oct 14 23:46:36 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 14 23:47:49 2026"
      },
      "message": "Mark user headers that are included in a public re-export as\nExportedUserHeader.\n\nThis is useful generally, but also specifically for `std` which wants to\ngenerate it\u0027s includes of `alloc` and `core` with `// IWYU pragma:\nexport`.\n\nPiperOrigin-RevId: 999712200\n"
    },
    {
      "commit": "b83e756497c2d3772dbf9b640ceaf1fec2e2b023",
      "tree": "dbc969069bf5aab3c389a34a37f8fa51525f4b5e",
      "parents": [
        "c3d55ef79eb652f80b243805108a23b7142bac18"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Oct 14 23:38:12 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 14 23:39:38 2026"
      },
      "message": "Automatic code cleanup.\n\nPiperOrigin-RevId: 999707231\n"
    },
    {
      "commit": "c3d55ef79eb652f80b243805108a23b7142bac18",
      "tree": "aabc942a9a182b7cdc434f0034db698469c0f930",
      "parents": [
        "e1e9acfc0dc6b7dc0d6a0b2bd0e2f1ef79e8e1c8"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Oct 14 22:44:24 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 14 22:47:59 2026"
      },
      "message": "Update Crubit documentation for recent bindings changes.\n\nPiperOrigin-RevId: 999673423\n"
    },
    {
      "commit": "e1e9acfc0dc6b7dc0d6a0b2bd0e2f1ef79e8e1c8",
      "tree": "f32644ecb0b8a4cce1279457119aca07b3c581df",
      "parents": [
        "0b24fb79c60992f36be347259a014e508a5ef1da"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Wed Oct 14 22:43:52 2026"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 14 22:47:24 2026"
      },
      "message": "Short-circuit AvoidCollidingTypes::avoid_colliding_types when there are \u003c\u003d 1 items.\n\nPiperOrigin-RevId: 999673100\n"
    }
  ],
  "next": "0b24fb79c60992f36be347259a014e508a5ef1da"
}
