)]}'
{
  "log": [
    {
      "commit": "de532b1807f0f621d8ef78601fc502b9f1b08501",
      "tree": "3ca6e964d2e62b843ffe5de7f5434e1162162421",
      "parents": [
        "56b3b30aca978475d50541f7fc5f92f5db7da95a"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Nov 11 13:29:21 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 11 13:30:37 2026 -0800"
      },
      "message": "Support anonymous associated constants in cc_bindings_from_rs\n\nUpstream rustc replaced `ty::AssocKind::Const { name }` with\n`ty::AssocKind::Const { data: AssocConstData }` in rust-lang/rust#158970\n(commit `5b3196fcd42db0cca7df744bf0efc84b4c0d8f37`) to support anonymous\nassociated constants (`const _: ...` and `pub const _: ...`).\n\nUse `assoc_item.opt_name()` instead of destructuring `name` on\n`ty::AssocKind::Const` so `cc_bindings_from_rs` builds against both old and\nnew toolchains, and skip nameless anonymous associated constants in\n`generate_cpp_enum` and `generate_associated_item` (matching module-level\nunderscore constants).\n\nPiperOrigin-RevId: 1019451675\n"
    },
    {
      "commit": "56b3b30aca978475d50541f7fc5f92f5db7da95a",
      "tree": "6d206cd1a227afd16c772e0bb30bfa1543f156c7",
      "parents": [
        "eca506dc8e0e3e819b5bf4d14456897e8999b494"
      ],
      "author": {
        "name": "Quinn Okabayashi",
        "email": "okabayashi@google.com",
        "time": "Wed Nov 11 12:16:01 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 11 12:20:51 2026 -0800"
      },
      "message": "Reject zero-sized fields in C++ bindings for Rust structs, unions, and enums.\n\nWhen a Rust struct had a field of type `[T; 0]` (or `[[T; 0]; N]`), `format_ty_for_cc` succeeded and produced `std::array\u003cT, 0\u003e`. Unlike Rust where `[T; 0]` is zero-sized, C++ `std::array\u003cT, 0\u003e` has `sizeof \u003d\u003d 1` (or `N`), which could expand C++ struct size when followed by tail padding and fail the generated `static_assert(sizeof(...))` check.\n\nRejecting `layout.size().bytes() \u003d\u003d 0` types in `format_ty_for_cc` for `TypeLocation::Field` (covering `prepare_field_type` and `is_struct_aggregate`) and in `generate_variant_ctor` routes zero-sized fields through the existing unsupported-field handling (`emit_field_err`), matching enum variants. Zero-sized fields without following padding are omitted, while those before padding or alignment gaps emit a clearer padding comment and `std::array\u003cunsigned char, N\u003e`. Function parameters and return values of type `[T; 0]` remain supported.\n\nPiperOrigin-RevId: 1019395164\n"
    },
    {
      "commit": "eca506dc8e0e3e819b5bf4d14456897e8999b494",
      "tree": "978977b9d0bdbcea04f60c8d7417aa2494500f6b",
      "parents": [
        "e6cd9788f1a5929a25eecbe552b717c9e0f7f6c2"
      ],
      "author": {
        "name": "Quinn Okabayashi",
        "email": "okabayashi@google.com",
        "time": "Wed Nov 11 12:13:55 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 11 12:15:48 2026 -0800"
      },
      "message": "Instantiate class template specializations reached as TagType.\n\nA declaration like `using F \u003d std::function\u003cstd::unique_ptr\u003cT\u003e()\u003e;` before\n`std::unique_ptr\u003cT\u003e Make();` fails to bind `Make`: importing `std::function`\neagerly imports its members, where template parameter substitution yields a\n`SubstTemplateTypeParmType` whose replacement is a `RecordType` (`TagType`)\nrather than a `TemplateSpecializationType`. Previously, the `TagType` branch in\n`ConvertUnattributedType` called `ConvertTypeDecl` directly without\ninstantiating the specialization, so `CXXRecordDeclImporter` saw\n`getDefinition() \u003d\u003d nullptr` and cached `std::unique_ptr\u003cT\u003e` as\n`IncompleteRecord`. Subsequent uses via `TemplateSpecializationType` then hit\n`HasBeenAlreadySuccessfullyImported` and reused that `IncompleteRecord`.\n\nFactor the template specialization instantiation and import logic out of\n`ConvertTemplateSpecializationType` into\n`ConvertClassTemplateSpecializationDecl` (sharing\n`CheckTemplateCrubitEnabled`), and call it from the `TagType` branch when the\n`TagDecl` is a `ClassTemplateSpecializationDecl`.\n\nPiperOrigin-RevId: 1019393570\n"
    },
    {
      "commit": "e6cd9788f1a5929a25eecbe552b717c9e0f7f6c2",
      "tree": "342c3b45b3654a3173fa465b776d1fdac653c48f",
      "parents": [
        "5c52f34ce5ea8750e86e8e33caf34f316d8850f6"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Wed Nov 11 11:21:19 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 11 11:22:54 2026 -0800"
      },
      "message": "Auto-generate `cargo/support/**/Cargo.toml` files and add them to the Cargo workspace\n\n- Add the 11 `//third_party/crubit/support/...` Rust crates (`cref`, `ctor`, `ctor_proc_macros`, `forward_declare`, `forward_declare_proc_macros`, `oops`, `operator`, `extract_cpp_from_rust:inline_cpp_macro`, `extract_cpp_from_rust:inline_cpp_utils`, `rs_std:dyn_callable_rs`, `rs_std:lossy_formatter`) to `rust_targets` in `//third_party/crubit/cargo/BUILD`.\n- Grant `//third_party/crubit/cargo:__pkg__` visibility to internal `support/` proc-macro, utility, and unit-test targets referenced by `cargo/BUILD`.\n- Generate `third_party/crubit/cargo/support/**/Cargo.toml` via `third_party/crubit/common/golden_update.sh` and register them in `third_party/crubit/Cargo.toml` and `Cargo.lock`.\n\nCloses #2725\n\nPiperOrigin-RevId: 1019350719\n"
    },
    {
      "commit": "5c52f34ce5ea8750e86e8e33caf34f316d8850f6",
      "tree": "70697cdea5df45b3477df9f521320b6a016c8961",
      "parents": [
        "d08d1c934c9a3135643d52f27c7917fd2e6f6bed"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Wed Nov 11 10:45:05 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 11 10:46:25 2026 -0800"
      },
      "message": "Parse rs_bindings_from_cc flags with llvm::cl instead of Abseil flags.\n\nReplace `ABSL_FLAG` definitions and Abseil command-line initialization in `rs_bindings_from_cc` with `llvm::cl` and `llvm::InitLLVM`, preserving flag names, defaults, case-insensitive boolean spellings, comma-separated list semantics, `@paramfile` response-file expansion (`llvm::cl::ExpandResponseFiles`), repeatable `--target_to_arg` flags, and `--stderrthreshold` severity gating across C++ and Rust logging.\n\nPiperOrigin-RevId: 1019318564\n"
    },
    {
      "commit": "d08d1c934c9a3135643d52f27c7917fd2e6f6bed",
      "tree": "d8a3d6ca41e3ffceb2c4bfa61b24558e6a39781c",
      "parents": [
        "1153b2a2511508bf65b94604f41846267bb4bdc4",
        "56bdd6f9c61f5981e48d7b55fe954ba4cd3c82f7"
      ],
      "author": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 11 10:28:00 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 11 10:28:00 2026 -0800"
      },
      "message": "Merge pull request #2847 from brontosource:skeleton\n\nPiperOrigin-RevId: 1019303768\n"
    },
    {
      "commit": "1153b2a2511508bf65b94604f41846267bb4bdc4",
      "tree": "5a4f6282c63fd1947b3978cf9a35b944b9ce39d9",
      "parents": [
        "77d21375b1f29163be84976113bef4ab43255e03"
      ],
      "author": {
        "name": "Lukasz Anforowicz",
        "email": "lukasza@google.com",
        "time": "Wed Nov 11 10:05:58 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 11 10:07:08 2026 -0800"
      },
      "message": "Turn on `strong_ordering_traits` by default.\n\nAdd `strong_ordering_traits` to `SUPPORTED_FEATURES`.  When a C++\ntype has an `operator\u003c\u003d\u003e` that returns `std::strong_ordering`, Crubit\nnow also implements `Eq` and `Ord` (in addition to `PartialEq` and\n`PartialOrd`) in the Rust bindings of the type.  Rust code can then\nuse such types as `BTreeMap` / `BTreeSet` keys, and sort them with\n`sort()`.\n\nThe new `Eq` and `Ord` impls can conflict with hand-written impls.\nTargets that break are denylisted, and will be migrated in follow-up\nCLs.  Golden files don\u0027t change.\n\nPiperOrigin-RevId: 1019286081\n"
    },
    {
      "commit": "77d21375b1f29163be84976113bef4ab43255e03",
      "tree": "684fca406542818d31982148f40e1550f4576f9a",
      "parents": [
        "b715411e29a210f059dffa4ca0356e56bb6c4002"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Wed Nov 11 09:21:08 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 11 09:22:56 2026 -0800"
      },
      "message": "Internal change.\n\nPiperOrigin-RevId: 1019254167\n"
    },
    {
      "commit": "56bdd6f9c61f5981e48d7b55fe954ba4cd3c82f7",
      "tree": "9d639077d1a25b97fcc1b45a3779d97755df90f3",
      "parents": [
        "b715411e29a210f059dffa4ca0356e56bb6c4002"
      ],
      "author": {
        "name": "Andy Soffer",
        "email": "andy@brontosource.dev",
        "time": "Tue Oct 20 09:10:37 2026 -0400"
      },
      "committer": {
        "name": "Andy Soffer",
        "email": "andy@brontosource.dev",
        "time": "Wed Nov 11 12:03:48 2026 -0500"
      },
      "message": "Add CMake module skeleton and fixture test harness for C++-\u003eRust\n\nThis does not build `//rs_bindings_from_cc` via CMake.\n\nTested:\n\n```\n# Ensure the binary exists:\nbazel build //rs_bindings_from_cc\n\n# Configure cmake\ncmake -S cmake/test -B build-cmake-test -DCRUBIT_RS_BINDINGS_FROM_CC\u003d$PWD/bazel-bin/rs_bindings_from_cc/rs_bindings_from_cc\n\n# Execute tests\nctest --test-dir build-cmake-test --output-on-failure\n```\n"
    },
    {
      "commit": "b715411e29a210f059dffa4ca0356e56bb6c4002",
      "tree": "6b96a4cb55fccedf51fd089994cc9662da7b7be8",
      "parents": [
        "e4ea00fd1e910b6992a165d860b63f3ad3a21d52"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Nov 10 18:14:08 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 18:15:04 2026 -0800"
      },
      "message": "Memoize lifetime_defaults_transform queries in rs_bindings_from_cc.\n\nThe lifetime-defaults transforms of records, functions, type aliases, and\nitems are now memoized queries keyed on the original IR handle, so each item\nis transformed once and shares a single allocation.\n\nPiperOrigin-RevId: 1018716927\n"
    },
    {
      "commit": "e4ea00fd1e910b6992a165d860b63f3ad3a21d52",
      "tree": "be971bf45424a16962fa697e88c7dcb5f9f3e377",
      "parents": [
        "c50eb023490c820a296302169601e3e22832024b"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Nov 10 16:49:53 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 16:54:29 2026 -0800"
      },
      "message": "Remove `T: Unpin` bound from non-mutating `std::vector\u003cT\u003e` functions\n\nPreviously, the `record_impl_debug` feature would break on a field of type like `std::vector\u003cstd::string\u003e` over how `std::string` isn\u0027t `Unpin`. So, remove unnecessary `T: Unpin` bound from functions that never mutate `std::vector\u003cT\u003e`.\n\nPiperOrigin-RevId: 1018667072\n"
    },
    {
      "commit": "c50eb023490c820a296302169601e3e22832024b",
      "tree": "659eeb197bf7d0cdd6a4bbb5b37f8b15462775aa",
      "parents": [
        "e2e057b85ec44f182e47fdf11d50a9d6e6da148e"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Tue Nov 10 16:48:24 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 16:50:25 2026 -0800"
      },
      "message": "Make FfiMap operations generic on K rather than hardcoded to string.\n\nRemove duplicate sorts downstream of FfiMap because Map is already\nstored sorted.\n\nPiperOrigin-RevId: 1018666172\n"
    },
    {
      "commit": "e2e057b85ec44f182e47fdf11d50a9d6e6da148e",
      "tree": "66429fff14802e6b8c354f51b3879ee0f6c5eb7b",
      "parents": [
        "71dfa0648c0605869d4cea9036a68dc704423e1d"
      ],
      "author": {
        "name": "Luke Zarko",
        "email": "zarko@google.com",
        "time": "Tue Nov 10 15:24:57 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 15:26:33 2026 -0800"
      },
      "message": "Internal-only change\n\nPiperOrigin-RevId: 1018601338\n"
    },
    {
      "commit": "71dfa0648c0605869d4cea9036a68dc704423e1d",
      "tree": "dc3bcf6cad90958abb2397ffea7ffac8020da8fd",
      "parents": [
        "580e63c25862f9e0cfa7f19abfdd7c3cec432de5"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Tue Nov 10 14:43:42 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 14:50:01 2026 -0800"
      },
      "message": "Internal change.\n\nPiperOrigin-RevId: 1018566758\n"
    },
    {
      "commit": "580e63c25862f9e0cfa7f19abfdd7c3cec432de5",
      "tree": "91460097bdfd3dbdf4a6d858bb88790491806322",
      "parents": [
        "7281f7af692ab4ae77fafdecee40874715df5d51"
      ],
      "author": {
        "name": "Ghanan Gowripalan",
        "email": "ghanan@google.com",
        "time": "Tue Nov 10 14:37:58 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 14:45:33 2026 -0800"
      },
      "message": "Support string literals in C++ macro constants\n\nMacros defined as string literals, e.g. `#define NAME \"foo\"`, were\nskipped. Now ordinary and UTF-8 string literals, including concatenated\nones, are bound too:\n\n```c++\n#define GREETING \"hello, \" \"world\"\n```\n\nbecomes a macro that expands to a string literal:\n\n```rust\n#[macro_export]\nmacro_rules! GREETING {\n    () \u003d\u003e {\n        \"hello, world\"\n    };\n}\n```\n\nStrings that aren\u0027t valid UTF-8 expand to a byte string literal (e.g.\n`b\"\\xFF\"`) instead. Wide, UTF-16, and UTF-32 string literals aren\u0027t\nsupported.\n\nThe string\u0027s bytes are read directly from the literal, so long strings\naren\u0027t evaluated element by element, and aren\u0027t subject to the limit on\nthe number of array elements.\n\nPiperOrigin-RevId: 1018562047\n"
    },
    {
      "commit": "7281f7af692ab4ae77fafdecee40874715df5d51",
      "tree": "8a06f2acb7c7c1706c3df58a37590dcbdcf9e1c2",
      "parents": [
        "222ad097f1b683a99500bcbcc5f3d900decccac3"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Tue Nov 10 14:37:45 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 14:41:25 2026 -0800"
      },
      "message": "Migrate FfiVec to use more STL style methods.\n\nWith the proto removal complete, it is now safe to migrate to a more\nidiomatic interface rather than a proto based one.\n\nPiperOrigin-RevId: 1018561894\n"
    },
    {
      "commit": "222ad097f1b683a99500bcbcc5f3d900decccac3",
      "tree": "626feabe740776051773ca9e39924e2e4a7b2bed",
      "parents": [
        "786b1fcc2fa66848705e1dd6a2c12e5c07742f6e"
      ],
      "author": {
        "name": "Ghanan Gowripalan",
        "email": "ghanan@google.com",
        "time": "Tue Nov 10 14:07:33 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 14:09:04 2026 -0800"
      },
      "message": "Support casts in C++ macro constants\n\nMacro constants often contain casts, e.g. `((uint32_t)1 \u003c\u003c 31)`, so\nsuch macros were skipped. Now they may contain C-style casts,\nfunctional casts, and `static_cast` to builtin integral types or to\nnames of such types:\n\n```c++\n#define FLAG_BIT ((uint32_t)1 \u003c\u003c 31)\n#define BIG (std::int64_t(1) \u003c\u003c 40)\n#define SMALL static_cast\u003cshort\u003e(7)\n```\n\nbecome macros that expand to\n\n```rust\n2147483648u32                // FLAG_BIT!()\n1099511627776i64             // BIG!()\n::ffi_11::new_c_short(7)     // SMALL!()\n```\n\nA cast gives the macro the type of the C++ constant, like a suffixed\nliteral does.\n\nType names are looked up from the global namespace, following `using`\ndeclarations and namespace aliases (but not using-directives or\nclass-scope names), and the casts are built with `Sema`, so they have\nthe usual C++ semantics. Typedefs are kept, so `uint32_t` maps to `u32`\nrather than `c_uint`. A macro whose type is a typedef that can\u0027t be\nbound (e.g. from a target without Crubit) is skipped silently. As in\nC++, `const` and `volatile` may each appear once, but not inside a name.\n\nCasts to other types (e.g. classes, enums, pointers, or `wchar_t`) are\nrejected before `Sema` sees them, so that skipped macros have no side\neffects such as template instantiations.\n\nPiperOrigin-RevId: 1018535896\n"
    },
    {
      "commit": "786b1fcc2fa66848705e1dd6a2c12e5c07742f6e",
      "tree": "5213c20cf64944b7877408781f6bbc7c8740e9ef",
      "parents": [
        "6ce4ac2e07631f21f2d9699499d98793380492b9"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Nov 10 13:53:23 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 14:03:46 2026 -0800"
      },
      "message": "Start the zz_template_instantiations module on a new line.\n\nWhen the first item in the module was an error comment, rustfmt kept it on the\nsame line as the opening brace of the module. Like the modules for the nested\nitems of records, the module now starts with a newline.\n\nPiperOrigin-RevId: 1018522500\n"
    },
    {
      "commit": "6ce4ac2e07631f21f2d9699499d98793380492b9",
      "tree": "74b0d4db90a18171211872329e5217edf0d48ef5",
      "parents": [
        "3c77dbd19be1f102e8667b33fde6633ca8b5cb55"
      ],
      "author": {
        "name": "Lukasz Anforowicz",
        "email": "lukasza@google.com",
        "time": "Tue Nov 10 13:50:28 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 13:59:04 2026 -0800"
      },
      "message": "Accept `__declspec(dllimport)` / `__declspec(dllexport)` in rs_bindings_from_cc.\n\nOn Windows, export macros (e.g. Chromium\u0027s `COMPONENT_EXPORT`) expand to\n`__declspec(dllimport)` or `__declspec(dllexport)` instead of\n`__attribute__((visibility(\"default\")))`.  Before this CL, Crubit did not\ngenerate bindings for such records and functions (\"unknown attribute(s):\ndllimport\").  Clang also adds an inherited copy of a class-level\nattribute to each member (or `DLL{Import,Export}StaticLocalAttr` to\ninline methods, with `/Zc:dllexportInlines-`), so all members of such a\nclass were dropped.\n\nAfter this CL, all importers use one `IsIgnoredVisibilityAttr` helper,\nwhich accepts both attributes as the Windows spelling of default\nvisibility.  Its `allow_non_default_visibility` parameter keeps the\nexisting differences between importers: functions and namespaces only\naccept the \"default\" visibility, other importers accept any visibility\n(e.g. \"hidden\" or \"protected\").  (As a side effect, records and enums\nnow also accept `type_visibility(...)`.)\n\nNon-constant `dllimport` variables stay unsupported, with an explicit\nerror: Rust refers to the symbol of a global variable directly, but a\n`dllimport` variable is only available as `__imp_\u003cmangled name\u003e`.\nPiperOrigin-RevId: 1018519870\n"
    },
    {
      "commit": "3c77dbd19be1f102e8667b33fde6633ca8b5cb55",
      "tree": "42f9f38141a6410845d38fa411ceec6b1879dca1",
      "parents": [
        "42b50d3d3c0e23dcb67477a3bc0c74e4f4c5d31b",
        "4a6bd7d0fa7aad11cbae352b27dc3a08b3c69853"
      ],
      "author": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 13:34:02 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 13:34:02 2026 -0800"
      },
      "message": "Merge pull request #2834 from brontosource:lists\n\nPiperOrigin-RevId: 1018502617\n"
    },
    {
      "commit": "42b50d3d3c0e23dcb67477a3bc0c74e4f4c5d31b",
      "tree": "dda728e1b122a1b73f77be15359db260bd8c8718",
      "parents": [
        "58ceb46686fa1f66f7cf9fc9a429c7b693f30443"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Nov 10 13:28:36 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 13:29:26 2026 -0800"
      },
      "message": "Skip non-`Copy` `mutable` fields in Crubit-generated `impl Debug`\n\nCrubit binds `mutable` C++ fields to `::core::cell::Cell\u003cT\u003e`, which only implements `Debug` when `T: Copy + Debug`. Previously, Crubit would fail to compile `impl Debug` for a struct with a `mutable` non-`Copy` field (e.g., `std::atomic\u003cData\u003e` in `rs_bindings_from_cc/test/templates/SFINAE/atomic_regression.h`). So, skip `mutable` fields that do not implement `Copy`.\n\nPiperOrigin-RevId: 1018501264\n"
    },
    {
      "commit": "58ceb46686fa1f66f7cf9fc9a429c7b693f30443",
      "tree": "07a7264d7e6038398371c00a89ef1376c0304642",
      "parents": [
        "bf54dfaf597c9d2baec1d873cb0672e07f515bb1"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Nov 10 13:12:30 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 13:14:02 2026 -0800"
      },
      "message": "`logging_test` (added in https://github.com/google/crubit/commit/7ba5af85b61ca4ac20e08c9a79c81f26e343c06a) is a unit test of Crubit\u0027s own C++ tooling that depends on `//third_party/llvm/llvm-project/llvm:Support` via `:logging`. Because `//third_party/llvm/llvm-project/llvm:google_config_defines_gen` is not compatible with the Windows target platforms, the `logging_test_on_windows_x86` and `logging_test_on_windows_x86_64` targets generated by `crubit_cc_test` fail during Bazel analysis in the `devtools.rust.cc_interop.windows_cc_tests` continuous Guitar workflow.\n\nAdd `tags \u003d [\"no_windows\"]` to `logging_test`, matching the other LLVM-dependent unit tests in `//third_party/crubit/rs_bindings_from_cc/BUILD`.\n\nPiperOrigin-RevId: 1018487481\n"
    },
    {
      "commit": "bf54dfaf597c9d2baec1d873cb0672e07f515bb1",
      "tree": "da037a085c6162405266551981dc3efaf5b67975",
      "parents": [
        "5b464830527893c32f7a4181430177d4e561d31c"
      ],
      "author": {
        "name": "Quinn Okabayashi",
        "email": "okabayashi@google.com",
        "time": "Tue Nov 10 12:31:14 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 12:32:11 2026 -0800"
      },
      "message": "Don\u0027t re-emit a function\u0027s template specializations when `use`-ing it.\n\n`resvg` re-exports `usvg::tiny_skia_path::path_geometry::valid_unit_divide`,\nwhich returns `Option\u003cNormalizedF32Exclusive\u003e`. Its header fails to compile when\n`resvg` gets `always_specialize_generics_in_cpp_api_from_rust`:\n`resvg.h` defines `rs::Option\u003c::usvg::tiny_skia_path::NormalizedF32Exclusive\u003e`,\nwhich `tiny_skia_path.h` already defines as\n`rs::Option\u003c::tiny_skia_path::NormalizedF32Exclusive\u003e`.\n\nFor a re-exported function, `cc_bindings_from_rs` only emits a `using`\ndeclaration, but it also copied all of the function\u0027s prerequisites into the\nre-exporting header, including the template specializations in its signature.\nA `using` declaration doesn\u0027t need those, and the header that defines the\nfunction already emits them. So stop copying the template specializations.\n\nRe-emitting them would be harmless if the `#ifndef` guards deduplicated them,\nbut the guard name is built from how the type is spelled. `resvg` can only name\n`NormalizedF32Exclusive` through `usvg`\u0027s re-export, because `tiny_skia_path`\nisn\u0027t a direct dependency, so the two guards differ.\n\nPiperOrigin-RevId: 1018452958\n"
    },
    {
      "commit": "5b464830527893c32f7a4181430177d4e561d31c",
      "tree": "4b22dabb6171372fcfc2657c72aa290a19b5a506",
      "parents": [
        "21a22de1b7db304bbbf305d86107f27b567fd91f"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Tue Nov 10 12:15:26 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 12:17:17 2026 -0800"
      },
      "message": "Align Copybara exclusions and path rewrites for OSS Bazel tests\n\nPiperOrigin-RevId: 1018440015\n"
    },
    {
      "commit": "21a22de1b7db304bbbf305d86107f27b567fd91f",
      "tree": "210a04a7fff57d4c9230fbebaad627b0fdde5566",
      "parents": [
        "7e0521659af5e68f2bad60fd3ddb148e96e4243c"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Tue Nov 10 11:06:59 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 11:08:12 2026 -0800"
      },
      "message": "Stop emitting a redundant `alignas` on aggregate structs in cc_bindings_from_rs.\n\nPiperOrigin-RevId: 1018378273\n"
    },
    {
      "commit": "7e0521659af5e68f2bad60fd3ddb148e96e4243c",
      "tree": "c415445a85b7cdf981989b09e80dd9ff0b21cae9",
      "parents": [
        "9d12298df912269de2516650fa36edf1a7f08384"
      ],
      "author": {
        "name": "Lukasz Anforowicz",
        "email": "lukasza@google.com",
        "time": "Tue Nov 10 10:53:50 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 10:55:09 2026 -0800"
      },
      "message": "Turn on `param_name_insensitive_operator_lookup` by default.\n\nAdd `param_name_insensitive_operator_lookup` to `SUPPORTED_FEATURES`.\nWhen Crubit looks for the `operator\u003d\u003d` that matches an `operator\u003c\u003d\u003e`\n(to generate `PartialOrd`), it now ignores parameter names (and\nlifetimes).  Before, Crubit didn\u0027t bind `operator\u003c\u003d\u003e` if, for example,\na member `operator\u003d\u003d(other)` was paired with a friend\n`operator\u003c\u003d\u003e(lhs, rhs)`.\n\nThe new `PartialOrd` impls can conflict with hand-written impls.\nTargets that break are denylisted, and will be migrated in follow-up\nCLs.\n\nPiperOrigin-RevId: 1018366680\n"
    },
    {
      "commit": "9d12298df912269de2516650fa36edf1a7f08384",
      "tree": "98cd8ea88497f15149bab24754117f2cbd1b5821",
      "parents": [
        "5fba57eca40406b4931de3c96adbcec75886373c"
      ],
      "author": {
        "name": "Quinn Okabayashi",
        "email": "okabayashi@google.com",
        "time": "Tue Nov 10 07:42:57 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 07:44:28 2026 -0800"
      },
      "message": "Always infer Send and Sync for C++ records in rs_bindings_from_cc.\n\n`infer_send_sync` is on by default, and its denylist is now empty. So\n`rs_bindings_from_cc` no longer reads the feature: records with no explicit\n`Send` / `Sync` annotation always get those traits inferred by rustc from their\nfields, and get a documented `impl !Send` / `impl !Sync` when a C++ subobject\nisn\u0027t represented as a typed Rust field.\n\nThis also applies inference to targets whose feature set doesn\u0027t include\n`supported` (for example `//third_party/crubit/features:types` or\n`template_instantiation`), which still got `impl !Send` / `impl !Sync` for every\nunannotated record.\n\nThe `infer_send_sync` feature name still parses but has no effect, so build\nfiles that mention it keep working until it is deleted.\n\nPiperOrigin-RevId: 1018213611\n"
    },
    {
      "commit": "5fba57eca40406b4931de3c96adbcec75886373c",
      "tree": "51868ae7e45f7cfc96bab6afafaa8e60de7965ba",
      "parents": [
        "fa7dec23267ef84878f927e3f706e427b8568e7d"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Tue Nov 10 07:19:33 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 07:29:17 2026 -0800"
      },
      "message": "Upgrade OSS Bzlmod and Cargo dependencies to rules_rust 0.74.0\n\nPiperOrigin-RevId: 1018198780\n"
    },
    {
      "commit": "fa7dec23267ef84878f927e3f706e427b8568e7d",
      "tree": "ab7257ccd2b516ff9afe707b63c1ec8aab933ddb",
      "parents": [
        "7843eac013cf6baa943dd441019eaf51416ffcae"
      ],
      "author": {
        "name": "Quinn Okabayashi",
        "email": "okabayashi@google.com",
        "time": "Tue Nov 10 07:15:27 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 07:22:33 2026 -0800"
      },
      "message": "Remove unused absl status deps from the cxx_record importer.\n\n`cxx_record` doesn\u0027t use `absl::Status`, `absl::StatusOr`, or\n`status_absl_compat`. Also fix a comment that described an `llvm::Expected`\nerror as an `absl::Status`.\n\nPiperOrigin-RevId: 1018196377\n"
    },
    {
      "commit": "7843eac013cf6baa943dd441019eaf51416ffcae",
      "tree": "f49e5412040cdcb61566294d13bc5d3c07e04900",
      "parents": [
        "b74a3c08e132e7ba34c2d5bd4e65a7105294d7aa"
      ],
      "author": {
        "name": "Quinn Okabayashi",
        "email": "okabayashi@google.com",
        "time": "Tue Nov 10 07:11:45 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 07:17:46 2026 -0800"
      },
      "message": "Internal change.\n\nPiperOrigin-RevId: 1018194069\n"
    },
    {
      "commit": "b74a3c08e132e7ba34c2d5bd4e65a7105294d7aa",
      "tree": "a286ee3f22ceb40a972959f74da21fda609fffe0",
      "parents": [
        "355d145e45a3414a82344557e862a2f589de8327"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Tue Nov 10 07:06:55 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 07:08:17 2026 -0800"
      },
      "message": "Move clang_tidy_nullability_replacement_macros into a cc_library.\n\ncc_embed_data doesn\u0027t have a substitute in OSS. Rather than add a shim oss_cc_embed_data rule, opt to replace the use of cc_embed_data.\n\nPiperOrigin-RevId: 1018190755\n"
    },
    {
      "commit": "355d145e45a3414a82344557e862a2f589de8327",
      "tree": "610ded3679718defcd705f40bd7917b041f94d65",
      "parents": [
        "a2b431e2c8fe40f77c244350a2a2e94829bd7316"
      ],
      "author": {
        "name": "Radoslaw Burny",
        "email": "rburny@google.com",
        "time": "Tue Nov 10 06:13:59 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 10 06:16:06 2026 -0800"
      },
      "message": "Allow destructors to set nonnull pointer fields to null\n\nDestructors often reset nonnull pointer fields (e.g. `runner_.reset();`) to\ncontrol teardown order. The fields can\u0027t be accessed after the destructor\nexits, so assigning null to them is safe; this is consistent with the existing\nexemption of destructors from the check that nonnull fields are nonnull at\nmethod exit. Following the same precedent, non-const `\u0026\u0026`-qualified methods,\nwhich consume the object, may also set its nonnull fields to null.\n\nThe exemption covers `.reset()`, `.reset(nullptr)` and assignments to raw and\nsmart pointer fields of `*this` declared in the class itself. Assignments to\nfields of other objects (including member subobjects and base classes, whose\ndestructors run later) and later dereferences of the nulled field are still\ndiagnosed.\n\nPiperOrigin-RevId: 1018159710\n"
    },
    {
      "commit": "a2b431e2c8fe40f77c244350a2a2e94829bd7316",
      "tree": "43ea0a575ff46bba0c510a94fb8e313e4b4633cd",
      "parents": [
        "a69c43909863d83dee68853e08d124d427e23531"
      ],
      "author": {
        "name": "Dino Radakovic CA",
        "email": "dinor@google.com",
        "time": "Mon Nov 09 14:21:26 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Nov 09 14:23:46 2026 -0800"
      },
      "message": "`features:supported`: deprecate direct use in favor of `rust_api_from_cpp`\n\nPiperOrigin-RevId: 1017635887\n"
    },
    {
      "commit": "a69c43909863d83dee68853e08d124d427e23531",
      "tree": "4401d8ae81bb66ccb8032d1791cd590cee8b09d5",
      "parents": [
        "fe8328fb97695d0d8c61464914df69ebb4149438"
      ],
      "author": {
        "name": "Quinn Okabayashi",
        "email": "okabayashi@google.com",
        "time": "Mon Nov 09 11:41:10 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Nov 09 11:42:27 2026 -0800"
      },
      "message": "Remove the infer_send_sync denylist entry for the thread_safety test.\n\nPiperOrigin-RevId: 1017512556\n"
    },
    {
      "commit": "fe8328fb97695d0d8c61464914df69ebb4149438",
      "tree": "3f7ddb4c396c381683173c228fcf9179767ff2a5",
      "parents": [
        "10e712e6bf3e60cb8ceff1ac7fe8443a0d1a4da9"
      ],
      "author": {
        "name": "Zachary Stewart",
        "email": "zstewart@google.com",
        "time": "Mon Nov 09 11:05:43 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Nov 09 11:06:42 2026 -0800"
      },
      "message": "Treat static data members with an out-of-line constexpr definition as constants\n\nPreviously, static const class/struct members with out-of-line definitions were always bound as extern statics in Rust. Now, we detect when the out-of-line definition is a `constexpr` and treat those the same as if the constexpr definition were in-line in the class. For example, these now behave the same:\n\n```\nclass A {\n  static constexpr int kA \u003d 1;\n};\n\nclass B {\n  static const int kB;\n};\nconstexpr int B::kB \u003d 1;\n```\n\nThis is rarely useful for integer constants and similar, because integer constants rarely require out-of-line definitions. However, it will be useful for expanding constant-importing to include certain record types, since a class is incomplete within its own body and so cannot define constants of its own type within itself.\n\nA constexpr definition whose type or value isn\u0027t supported for constants yet (such as floating-point or class types) is now unsupported, the same as if it were initialized in the class, instead of being bound as a static. Such a static referred to a weak symbol that only exists if some C++ code ODR-uses the member, so it rarely\nlinked.\n\nPiperOrigin-RevId: 1017485751\n"
    },
    {
      "commit": "10e712e6bf3e60cb8ceff1ac7fe8443a0d1a4da9",
      "tree": "7bc48ccc859ba9a3efe6f2d75a1b9fd2904a9e87",
      "parents": [
        "c70129397463e40aceb99a752e2830f42878b8d4"
      ],
      "author": {
        "name": "Ghanan Gowripalan",
        "email": "ghanan@google.com",
        "time": "Mon Nov 09 09:22:56 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Nov 09 09:24:37 2026 -0800"
      },
      "message": "Expand nested macros in C++ macro constants\n\nMacro constants can now refer to other object-like macros, including\nmacros of other targets and macros defined later in the header:\n\n```c++\n#define FOO 4\n#define BAR (FOO + 3)\n```\n\nbecomes\n\n```rust\n#[macro_export]\nmacro_rules! FOO {\n    () \u003d\u003e {\n        4\n    };\n}\n\n#[macro_export]\nmacro_rules! BAR {\n    () \u003d\u003e {\n        7\n    };\n}\n```\n\nA suffix in a nested macro makes the referring macro typed, too: with\n`#define FOO 4u`, `#define BAZ (FOO + 1)` expands to\n`::ffi_11::new_c_uint(5)`.\n\nAs in the C preprocessor, a macro isn\u0027t expanded inside its own\nexpansion. Macros that use token pasting, or that exceed limits on the\nnumber of expanded tokens, the expansion depth, or the total number of\nexpansions, are skipped, so that pathological macros can\u0027t make the\nbindings generator slow or overflow its stack. Identifiers in tokens\nloaded from a precompiled header module are updated before their macro\ndefinitions are looked up.\n\nPiperOrigin-RevId: 1017406209\n"
    },
    {
      "commit": "c70129397463e40aceb99a752e2830f42878b8d4",
      "tree": "69bfdb654815c610d495c3aed646ddf567bda004",
      "parents": [
        "657b947ae7b007b90515c298cd347e16cc55c0b2"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Mon Nov 09 08:11:42 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Nov 09 08:12:43 2026 -0800"
      },
      "message": "Reserve POSIX sys/stat.h file mode macros in C++ identifier unkeywording\n\nPiperOrigin-RevId: 1017358971\n"
    },
    {
      "commit": "657b947ae7b007b90515c298cd347e16cc55c0b2",
      "tree": "1c085358c02dca72998fe789b1740fa40aca54ba",
      "parents": [
        "dcf92a1baf2c8a6561ed0361502cfec20e2f65f5"
      ],
      "author": {
        "name": "Quinn Okabayashi",
        "email": "okabayashi@google.com",
        "time": "Mon Nov 09 07:35:48 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Nov 09 07:36:51 2026 -0800"
      },
      "message": "Turn on infer_send_sync by default.\n\nAdd `infer_send_sync` to `SUPPORTED_FEATURES`. C++ records without an explicit `Send`/`Sync` annotation no longer get `impl !Send` / `impl !Sync`. Instead, rustc infers `Send` and `Sync` from the fields:\n\n* Fields with a Rust type contribute their own `Send`/`Sync`.\n* Opaque byte blobs and unrepresented subobjects that hold C++ data (private fields, fields of unsupported types, base class subobjects, vtable pointers, zero-sized fields) emit `impl !Send` and `impl !Sync` with a doc comment explaining why inference was suppressed.\n* `CRUBIT_UNSAFE_IMPL(\"Send\")` / `CRUBIT_THREAD_SAFE` still produce `unsafe impl Send`, and `CRUBIT_TRAIT_DERIVE(\"!Send\")` / `CRUBIT_TRAIT_DERIVE(\"!Sync\")` opt a type out.\n\nGolden diff: removes `impl !Send` / `impl !Sync` where `Send` and `Sync` can be inferred, and adds doc comments to the remaining `impl !Send` / `impl !Sync` impls. No bindings are added or removed.\n\nPiperOrigin-RevId: 1017335641\n"
    },
    {
      "commit": "dcf92a1baf2c8a6561ed0361502cfec20e2f65f5",
      "tree": "686a306c81c3593901d56f0f7cbc3a51c70cccdd",
      "parents": [
        "42e9f06651f1a6632925ccda8a34a7e8049a71c9"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Sun Nov 08 07:55:51 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sun Nov 08 07:57:40 2026 -0800"
      },
      "message": "Move template instantiations with mangled names into a zz_template_instantiations module.\n\nClass template instantiations that aren\u0027t named after a C++ type alias have a\nmangled `__CcTemplateInst...` name. Instead of hiding them from rustdoc with\n`#[doc(hidden)]`, which leaves functions that take or return them with unlinked\ntypes, they are now generated in a `zz_template_instantiations` module (which\nsorts last in rustdoc), together with their nested-item modules and the mangled\nnames of the instantiations that are named after an alias. This keeps them\ndocumented without cluttering the rest of the API.\n\nMangled names are no longer available at the crate root; refer to them as\n`zz_template_instantiations::__CcTemplateInst...` instead. `cc_template!` now\nexpands to that path. The generated C++ code is unchanged.\n\nPiperOrigin-RevId: 1016764913\n"
    },
    {
      "commit": "42e9f06651f1a6632925ccda8a34a7e8049a71c9",
      "tree": "438ef535be3da351b38c27966fbc99cdad330f19",
      "parents": [
        "f144a4f1f581a19628316d41b85057872c3bd41b"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Sat Nov 07 22:22:41 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat Nov 07 22:23:33 2026 -0800"
      },
      "message": "Name template instantiations after type aliases, and hide mangled names from rustdoc.\n\nPreviously, every class template instantiation was generated as a struct with a\nmangled name (e.g. `__CcTemplateInstN2ns10MyTemplateIiEE`) in the crate root,\nand type aliases to it as `pub type MyAlias \u003d crate::__CcTemplateInst...;`.\nThis clutters the rustdoc output of the bindings, and since rustdoc doesn\u0027t\nshow the fields or methods of a hidden type on the page of an alias to it, the\nmangled structs couldn\u0027t simply be hidden.\n\nNow, an instantiation is generated under the name of the first type alias for\nit in the current target, in the module of that alias:\n\n* Only namespace-scope aliases that are not in an anonymous namespace, not\n  deprecated, and that name the instantiation exactly (e.g. not `const`) are\n  used. Instantiations in `std`, bridge types, instantiations with special\n  handling (e.g. `std::vector`), and instantiations with lifetime parameters\n  keep their mangled name.\n* Other aliases for the same instantiation become aliases of the renamed struct.\n* The C++ name of the struct is unchanged, so the generated C++ code and the\n  `forward_declare` symbols are the same as before.\n* The mangled name is kept as a `#[doc(hidden)]` alias in the crate root, so\n  existing references to it keep working.\n\nStructs that still have a mangled name (instantiations without an eligible\nalias) are now `#[doc(hidden)]`.\n\nPiperOrigin-RevId: 1016589247\n"
    },
    {
      "commit": "f144a4f1f581a19628316d41b85057872c3bd41b",
      "tree": "7530090354de773597c6a8c51af42fde1bfe7f0f",
      "parents": [
        "b2813795fc4e0e3c5207307716a2c3cc3d8f35ae"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Sat Nov 07 13:19:03 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat Nov 07 13:21:42 2026 -0800"
      },
      "message": "Hash IR item types by ItemId instead of recursively hashing child items.\n\nIR item structs that carry an `id: ItemId` field now implement `Hash` via\n`self.id` only, and `PartialEq` short-circuits on pointer and id equality\nbefore comparing fields. This avoids recursively hashing entire subtrees of\nchild items on every memoized query lookup.\n\nPiperOrigin-RevId: 1016411484\n"
    },
    {
      "commit": "b2813795fc4e0e3c5207307716a2c3cc3d8f35ae",
      "tree": "360b319632601af5670fbface3ba7f395cb0c67b",
      "parents": [
        "3901da33bcdc39d593cf31d417db9d75974bfe90"
      ],
      "author": {
        "name": "Vinh Tran",
        "email": "vinhdaitran@google.com",
        "time": "Fri Nov 06 20:37:33 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 06 20:38:50 2026 -0800"
      },
      "message": "Enable Android and iOS golden tests by default\n\nPiperOrigin-RevId: 1016078013\n"
    },
    {
      "commit": "3901da33bcdc39d593cf31d417db9d75974bfe90",
      "tree": "5eee42573955a9d3b8e2f3e66d35920b917aa8ce",
      "parents": [
        "8558f6b8df69d464c48ef63082bc749040da9414"
      ],
      "author": {
        "name": "Vinh Tran",
        "email": "vinhdaitran@google.com",
        "time": "Fri Nov 06 20:22:05 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 06 20:23:21 2026 -0800"
      },
      "message": "Enable Android and iOS in crubit_cc_test by default\n\nPiperOrigin-RevId: 1016072567\n"
    },
    {
      "commit": "8558f6b8df69d464c48ef63082bc749040da9414",
      "tree": "8b7e9547f83b920eb1de1cae8c6008534dc7b251",
      "parents": [
        "715f7927deb48c1f84754693761aaa9022435022"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Fri Nov 06 19:33:44 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 06 19:34:37 2026 -0800"
      },
      "message": "Automatic code cleanup.\n\nPiperOrigin-RevId: 1016054844\n"
    },
    {
      "commit": "715f7927deb48c1f84754693761aaa9022435022",
      "tree": "9be171f77161e34055ef4d7b67d14470119c5030",
      "parents": [
        "632994d0a5dde36aecb8a09f5da3fac8c81e28aa"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Fri Nov 06 18:28:07 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 06 18:29:10 2026 -0800"
      },
      "message": "Automatic code cleanup.\n\nPiperOrigin-RevId: 1016026331\n"
    },
    {
      "commit": "632994d0a5dde36aecb8a09f5da3fac8c81e28aa",
      "tree": "8b7e9547f83b920eb1de1cae8c6008534dc7b251",
      "parents": [
        "8a22447bb0d744e4e0211035e18e3534fe8fde09"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Fri Nov 06 16:37:33 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 06 16:39:10 2026 -0800"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 1015953853\n"
    },
    {
      "commit": "8a22447bb0d744e4e0211035e18e3534fe8fde09",
      "tree": "9be171f77161e34055ef4d7b67d14470119c5030",
      "parents": [
        "626070b23516f2bec245055b48931cd5eb770d34"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Fri Nov 06 16:06:46 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 06 16:07:56 2026 -0800"
      },
      "message": "Remove obsolete Protobuf build support from Crubit Cargo and CI.\n\nCrubit\u0027s IR schemas were the only `.proto` files built by the Cargo workspace. Supporting them required a custom Bazel pre-step to build `protoc` and `libprotobuf`, pre-generate C++ protobuf headers before `cargo build` could run, translate proto rules in `build_integration`, and maintain dedicated Protobuf build documentation.\n\nNow that no Crubit crate compiles `.proto` files or links `libprotobuf`, removing that build and CI machinery eliminates the Protobuf toolchain prerequisite and simplifies Cargo builds and open-source CI setup.\n\nPiperOrigin-RevId: 1015929738\n"
    },
    {
      "commit": "626070b23516f2bec245055b48931cd5eb770d34",
      "tree": "eef36e70460f570a4b3e803583cddcd0712a7f81",
      "parents": [
        "1250acaf4c6616b592e685b12cf16de13cff9596"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Fri Nov 06 15:55:11 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 06 15:56:07 2026 -0800"
      },
      "message": "Simplify status_test_matchers using gMock MATCHER macros.\n\n* `common/status_test_matchers.h`:\n  * Simplify `StatusInfo` to hold `{StatusCode code; std::string message;}` with `is_ok()` and `code_string()` accessors, and delegate the `llvm::Expected\u003cT\u003e` error path in `GetStatusInfo` directly to `GetStatusInfo(const llvm::Error\u0026)`.\n  * Replace the manual `IsOkAndHoldsMatcherImpl`, `IsOkAndHoldsMatcher`, `MonoIsOkMatcherImpl`, `IsOkMatcher`, and `StatusIsMatcher` classes (~150 lines of boilerplate) with gMock `MATCHER(IsOk, ...)`, `MATCHER_P(IsOkAndHolds, ...)`, and `MATCHER_P2(StatusIs, ...)`, preserving descriptive matcher and mismatch messages.\n  * Deduplicate token pasting in `ASSERT_OK_AND_ASSIGN` via `CRUBIT_ASSERT_OK_AND_ASSIGN_IMPL_`.\n* `common/status_test_matchers_test.cc`:\n  * Match temporary `Status`/`StatusOr`/`Error`/`Expected` values directly, deduplicate `StatusIs` matcher checks, and verify `StatusIs` descriptions and mismatch explanations.\n* `common/BUILD`:\n  * Remove unused `:status_macros` dependencies from `status_test_matchers` and `status_test_matchers_test`.\n\nPiperOrigin-RevId: 1015921483\n"
    },
    {
      "commit": "1250acaf4c6616b592e685b12cf16de13cff9596",
      "tree": "51001e7f84cef2da03b169399cd96a9b98bfd284",
      "parents": [
        "d4e0b650ce639f38a0f3bca518a2b8b0e29b0238"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Fri Nov 06 10:45:19 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 06 10:46:37 2026 -0800"
      },
      "message": "Document C++ `Debug` formatting behavior under `record_impl_debug`.\n\nPiperOrigin-RevId: 1015680665\n"
    },
    {
      "commit": "d4e0b650ce639f38a0f3bca518a2b8b0e29b0238",
      "tree": "6d60a111922f3708134f61054a7e9ffb220804ad",
      "parents": [
        "98e4348f2c1ebabbc4df8837f5f69a0a2380e77c"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Fri Nov 06 10:08:10 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 06 10:11:04 2026 -0800"
      },
      "message": "Crubit: bind anonymous enums that are named by a typedef (`typedef enum {...} T;`)\n\nC headers commonly name enums only through a typedef, e.g.\n`typedef enum { ... } name_t;`. Previously such enums were dropped, so every\nfunction taking or returning `name_t` failed to bind (\"No generated bindings\nfound for \u0027\u0027\"). Now, mirroring what we already do for anonymous records\n(`getTypedefNameForAnonDecl`), such an enum is imported as a named enum using\nthe typedef name.\n\nThe existing top-level enumerator constants are still emitted exactly as\nbefore, so existing users are unaffected; the enumerators are additionally\navailable as associated constants of the new type.\n\nPiperOrigin-RevId: 1015648721\n"
    },
    {
      "commit": "98e4348f2c1ebabbc4df8837f5f69a0a2380e77c",
      "tree": "ea6c45c53704092d643fc4c9727ee9d69f2fd10a",
      "parents": [
        "8d7065793bab3ed15f8f949773ff2dcaf323ae40"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Fri Nov 06 09:57:11 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 06 10:03:01 2026 -0800"
      },
      "message": "Add link checking across Crubit documentation and fix existing broken links\n\nPiperOrigin-RevId: 1015639505\n"
    },
    {
      "commit": "8d7065793bab3ed15f8f949773ff2dcaf323ae40",
      "tree": "128cb968ceb813ddf4539ce5d084a59aeeb21bd6",
      "parents": [
        "372c0139dc3e8916f66eac5ea17f2d92f23f2aeb"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Fri Nov 06 09:42:51 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 06 09:45:28 2026 -0800"
      },
      "message": "Format whole-number float constant literals with a decimal point.\n\nThis was a bug uncovered while enabling generics.\n\nPiperOrigin-RevId: 1015628885\n"
    },
    {
      "commit": "372c0139dc3e8916f66eac5ea17f2d92f23f2aeb",
      "tree": "4509a267fe8881de085ba2aa89313a4849974cc5",
      "parents": [
        "c5bf2f2bfda53c8b698e7add1a27c796295aa359"
      ],
      "author": {
        "name": "Luke Zarko",
        "email": "zarko@google.com",
        "time": "Fri Nov 06 08:56:16 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 06 08:57:29 2026 -0800"
      },
      "message": "Internal-only change\n\nPiperOrigin-RevId: 1015594492\n"
    },
    {
      "commit": "c5bf2f2bfda53c8b698e7add1a27c796295aa359",
      "tree": "0477e5534159658110dbad7bcb4521aae60fed5e",
      "parents": [
        "2dc0d9788f3225063c1a95956c111deaf328fdb5"
      ],
      "author": {
        "name": "Luke Zarko",
        "email": "zarko@google.com",
        "time": "Fri Nov 06 00:14:01 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Nov 06 00:16:28 2026 -0800"
      },
      "message": "Don\u0027t emit colliding template specializations, and add an opt-in feature binding Option\u003c\u0026T\u003e as rs::Option\u003cT const\u0026\u003e.\n\nWhen generics are specialized in `cpp_api_from_rust`, references in template\narguments are formatted as pointers, so `Option\u003c\u0026T\u003e` and `Option\u003c*const T\u003e` both\nbecome `rs::Option\u003cT const*\u003e` (the former is annotated as `_Nonnull`, but that\ndoesn\u0027t make it a distinct C++ type). A crate that used both got two definitions\nof that specialization, so its header failed to compile. The two Rust types\ndon\u0027t even have the same layout: `Option\u003c\u0026T\u003e` is a nullable pointer, while\n`Option\u003c*const T\u003e` needs a separate tag.\n\n`cc_bindings_from_rs` now never emits two template specializations that define\nthe same C++ type with a different spelling or layout. Of each group of\ncolliding specializations, the first one in a deterministic order is kept (e.g.\n`Option\u003c\u0026T\u003e` rather than `Option\u003c*const T\u003e`), and the bindings are generated\nagain with the others rejected, so that only the functions and methods that use\nthem are unsupported, with an error that explains why. This applies to all\nspecialized generic types (e.g. `Option\u003cNonNull\u003cT\u003e\u003e` and `Option\u003c*mut T\u003e` also\ncollide).\n\nThe new `option_references` feature avoids the collision for `Option\u003c\u0026T\u003e`: it\nbinds `Option\u003c\u0026T\u003e` and `Option\u003c\u0026mut T\u003e` (for sized `T`) as `rs::Option\u003cT const\u0026\u003e`\nand `rs::Option\u003cT\u0026\u003e`, which work like C++26 `std::optional\u003cT\u0026\u003e`: they store a\npointer that is null for `None`, matching the Rust layout; they bind only to\nlvalues; assignment rebinds them; and `*` and `-\u003e` give shallow-const access to\nthe referent. `rs::IteratorAdapter` accepts `Iterator::next` returning these\noptions, so iterating over references from C++ keeps working.\n\nThe feature is opt-in, so that code that expects `rs::Option\u003cT const*\u003e` can be\nmigrated before the feature is turned on by default.\n\nPiperOrigin-RevId: 1015322260\n"
    },
    {
      "commit": "2dc0d9788f3225063c1a95956c111deaf328fdb5",
      "tree": "386a455ea41f3f4540dee48436cf1c449719ec2b",
      "parents": [
        "f1b3d41ef16606f8e3f87ce553fbe8d021d982a8"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Thu Nov 05 17:58:03 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 17:59:30 2026 -0800"
      },
      "message": "Return database-lifetime references from memoized queries.\n\nMemoized queries and inputs in `memoized::query_group!` cloned their cached\nvalue on every lookup. For queries returning hash maps, vectors, strings, or\n`TokenStream`s (e.g. `symbol_canonical_name` and `symbol_unqualified_name`,\nwhich cloned a `HashMap` on every symbol lookup), cloning and dropping cached\nvalues dominated `cc_bindings_from_rs` CPU time.\n\n`memoized`:\n\n- Add `#[return_ref]` for inputs and queries returning `\u0026T`, `\u0026[T]`,\n  `Option\u003c\u0026T\u003e`, `Option\u003c\u0026str\u003e`, `Result\u003c\u0026T, E\u003e`, `Result\u003cOption\u003c\u0026T\u003e, E\u003e`, and\n  `Result\u003c(), \u0026E\u003e`. The owned value is computed once, stored at a stable heap\n  address in `RefMemoizationTable`, and borrowed for the lifetime of the\n  database.\n- Add a `CheapClone` marker trait and check at compile time that query keys and\n  by-value inputs and return types are `Copy` or `CheapClone`, so heap-owning\n  types can no longer be cloned on every cache hit by accident.\n- Interleaving `#[break_cycles_with]` and other queries is now allowed.\n\n`cc_bindings_from_rs`:\n\n- Migrate expensive-to-clone inputs and queries (including\n  `symbol_canonical_name`, `symbol_unqualified_name`, `generate_item`,\n  `generate_function`, `format_ty_for_cc`, `adt_needs_bindings`, and\n  `generate_adt_core`) to `#[return_ref]`, and borrow `\u0027db` references through\n  snippet formatting and item codegen instead of cloning.\n- Pre-index `impl Trait for \u0026T` operator impls by referent type once per trait\n  (`ref_trait_impls_by_referent`) instead of running the trait solver on every\n  `\u0026_` impl in the crate graph for every ADT.\n- Borrow `\u0026Format\u003c1\u003e` instead of cloning it for each include path.\n\n`rs_bindings_from_cc`:\n\n- Migrate expensive-to-clone queries to `#[return_ref]` and stop treating\n  `CcType`, `Field`, and `UnqualifiedIdentifier` (which own FFI heap buffers) as\n  cheap to clone: memoized queries now take `Rc\u003cCcType\u003e`,\n  `Rc\u003cUnqualifiedIdentifier\u003e`, or `(FfiRc\u003cRecord\u003e, field_index)` keys.\n- Stop reallocating the `Interner` scratch buffer on every `intern!` call.\n\nBoth: pre-intern common constant `TokenStream`s in `CommonTokens`, exposed as a\n`#[return_ref]` input.\n\nGenerated bindings are byte-for-byte unchanged.\n\nPiperOrigin-RevId: 1015132522\n"
    },
    {
      "commit": "f1b3d41ef16606f8e3f87ce553fbe8d021d982a8",
      "tree": "033415d340bb51c15693bf3c270446b3aa479c2d",
      "parents": [
        "205ca48621617b16781ff0bebb2c35f1875b407d"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Thu Nov 05 16:00:36 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 16:07:48 2026 -0800"
      },
      "message": "Emit the inline_cpp_generated_bindings alias for rust_api_from_cpp(embedded_cpp \u003d True).\n\ninline_cpp! inside handwritten srcs of a rust_api_from_cpp target expands to\n`inline_cpp_generated_bindings::\u003cthunk\u003e`, which the generated crate is supposed\nto satisfy with `extern crate self as inline_cpp_generated_bindings;`. That\nalias was gated on `ir.items().any(|i| matches!(i, Item::UseMod(_)))`, which\ninspects the whole IR rather than the items generated for the current target,\nso it was never emitted and users hit\n`error[E0432]: unresolved import inline_cpp_generated_bindings` unless they\nadded `use crate as inline_cpp_generated_bindings;` by hand.\n\nGate the alias on the current target\u0027s generated `UseMod` item instead, and\nadd an end-to-end test (rs_bindings_from_cc/test/bazel/rule) that uses\ninline_cpp! from `srcs` with `embedded_cpp \u003d True` and no workaround.\n\nPiperOrigin-RevId: 1015057894\n"
    },
    {
      "commit": "205ca48621617b16781ff0bebb2c35f1875b407d",
      "tree": "ef509b59a55953e8bf5d44571e9535e0dad8947a",
      "parents": [
        "cacc72a2875ec61dc816e0851f89a239ee4aa924"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Thu Nov 05 16:00:15 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 16:01:25 2026 -0800"
      },
      "message": "Implement oops::Upcast for Pin\u003c\u0026mut Derived\u003e -\u003e Pin\u003c\u0026mut Base\u003e.\n\noops::Upcast was implemented for *const, *mut and \u0026Derived -\u003e \u0026Base, but not for\npinned mutable references. Because non-const methods on non-Rust-movable C++\nclasses take Pin\u003c\u0026mut Self\u003e, calling a base-class non-const method on a derived\nobject required hand-rolling get_unchecked_mut + raw-pointer upcast +\nPin::new_unchecked.\n\nAdd `unsafe impl Upcast\u003cPin\u003c\u0026\u0027a mut Base\u003e\u003e for Pin\u003c\u0026\u0027a mut Derived\u003e where\nDerived: Inherits\u003cBase\u003e`: the base subobject lives inside the pinned derived\nobject, so the pointer stays valid and pinned for \u0027a. No `\u0026mut Derived -\u003e\n\u0026mut Base` impl is provided: a write through `\u0026mut Base` could break\nderived-class invariants (slicing), so that conversion is deliberately left to\nunsafe code.\n\nTests cover Unpin and !Unpin class pairs; docs updated.\n\nPiperOrigin-RevId: 1015057652\n"
    },
    {
      "commit": "cacc72a2875ec61dc816e0851f89a239ee4aa924",
      "tree": "a35040c78d9155726d9320a8abef4b96a389b5d6",
      "parents": [
        "1448d6a30a3522aca7a9aeec34f5aca0447008b3"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Thu Nov 05 15:09:23 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 15:16:08 2026 -0800"
      },
      "message": "Add CRUBIT_NEVER_BITWISE_RELOCATABLE annotation.\n\nMarks a C++ type as never bitwise-relocatable, so Crubit never treats it (or\ntypes containing it) as Rust-movable (`Unpin`).\n\nPiperOrigin-RevId: 1015023565\n"
    },
    {
      "commit": "1448d6a30a3522aca7a9aeec34f5aca0447008b3",
      "tree": "2380b793830274a3a33760b1e515346d6e3bf23c",
      "parents": [
        "fadee5d472f1078bd6cc6e39e2d7f182b4ba4ea9"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Thu Nov 05 15:08:30 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 15:10:58 2026 -0800"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 1015022853\n"
    },
    {
      "commit": "fadee5d472f1078bd6cc6e39e2d7f182b4ba4ea9",
      "tree": "afb775a8b72ee2de50d15fb6738a0be237b86764",
      "parents": [
        "f1664591ed87c3d86d05a8f94d3526609d4c7664"
      ],
      "author": {
        "name": "Phoebe Liang",
        "email": "phoebeliang@google.com",
        "time": "Thu Nov 05 13:48:56 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 13:50:18 2026 -0800"
      },
      "message": "Structured binding packs (C++26) have the type\n`PackExpansionType(DependentTy)`. In an instantiated `PackIndexingExpr` such\nas `fields...[0]`, the pack operand is still a `DeclRefExpr` to the binding\npack from the template pattern. The analysis therefore asks for the\nnullability of this dependent type, which caused a fatal internal error.\n\nReturn empty nullability for this type, as is already done for function\nparameter packs. Other dependent types still report a fatal internal error.\n\nPiperOrigin-RevId: 1014966991\n"
    },
    {
      "commit": "f1664591ed87c3d86d05a8f94d3526609d4c7664",
      "tree": "513d51162939bb5b2327014cf303f2bfd6398b68",
      "parents": [
        "b35943584d076c25e3952167a35f8268b727fcac"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Nov 05 12:49:46 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 12:53:29 2026 -0800"
      },
      "message": "Remove resolved bug reference from `ABSL_REQUIRE_EXPLICIT_INIT` comments.\n\nDrop the resolved bug reference from `rs_bindings_from_cc/importers/function.cc` and `rs_bindings_from_cc/test/struct/require_explicit_init/{BUILD,test.rs}` so `bugreviver` does not reopen the closed issue.\n\nPiperOrigin-RevId: 1014924095\n"
    },
    {
      "commit": "b35943584d076c25e3952167a35f8268b727fcac",
      "tree": "04590efeccc3e65aa45d4f543dc49c51282b03ca",
      "parents": [
        "0258cc761a60106fe24b02a0541ffd1f55d55468"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Nov 05 12:48:39 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 12:49:45 2026 -0800"
      },
      "message": "Support `?:` in C++ macro constants\n\nMacro constants can now use the conditional operator, e.g.\n`#define FOO (4 \u003e 3 ? 10 : 20)`.\n\nPiperOrigin-RevId: 1014923267\n"
    },
    {
      "commit": "0258cc761a60106fe24b02a0541ffd1f55d55468",
      "tree": "b5acd55eb76923ea75aa7075a5f940973c51f716",
      "parents": [
        "86f1bec72c2c14a1215016e775836c651b1740db"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Nov 05 12:07:41 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 12:09:37 2026 -0800"
      },
      "message": "Automated Code Change\n\nPiperOrigin-RevId: 1014894217\n"
    },
    {
      "commit": "86f1bec72c2c14a1215016e775836c651b1740db",
      "tree": "cf2563f2a78af604f5039872ac42b3df4d5ad8e4",
      "parents": [
        "19f2d7ef3db38d89c4a19028ad451706404fb058"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Nov 05 11:53:37 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 11:54:52 2026 -0800"
      },
      "message": "Support binary operators in C++ macro constants\n\nMacro constants can now use the binary arithmetic, bitwise, shift,\ncomparison, and logical operators, e.g. `#define FOO (1u \u003c\u003c 31)`. They\nare parsed by precedence climbing with Clang\u0027s operator precedences, and\nbuilt with `Sema`, so types, values, and errors (e.g. division by zero\nor overflow, which cause the macro to be skipped) follow C++.\n\nPiperOrigin-RevId: 1014882990\n"
    },
    {
      "commit": "19f2d7ef3db38d89c4a19028ad451706404fb058",
      "tree": "0663d7bfb7768acba4af17607855343e3d1930d1",
      "parents": [
        "39a0a7fd948f100ff122760e44c44e01755c2983"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Nov 05 11:35:06 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 11:37:30 2026 -0800"
      },
      "message": "Support unary operators in C++ macro constants\n\nMacro constants can now use the unary operators `+ - ~ !`, so that e.g.\n`#define FOO -1` becomes a Rust macro. As with literals, the\nexpression is built with `Sema`, so it has the C++ type and value.\n\nPiperOrigin-RevId: 1014869250\n"
    },
    {
      "commit": "39a0a7fd948f100ff122760e44c44e01755c2983",
      "tree": "b778f8166aa7bf2d15cc05db1c5730ae2367f13d",
      "parents": [
        "ad02b4e0a4fb04bcfebbf9554813f07d28a27dc4"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Nov 05 11:31:40 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 11:32:27 2026 -0800"
      },
      "message": "In `VarDeclImporter::Import`, static data members of class template specializations are rejected because Clang instantiates their initializers lazily (`var_decl-\u003egetInit()` is `nullptr` until a definition is needed), and calling `var_decl-\u003eevaluateValue()` on a `static constexpr` member with a null initializer segfaults inside `EvaluateInPlace`.\n\nPreviously, `VarDeclImporter::Import` only checked `clang::isa\u003cclang::ClassTemplateSpecializationDecl\u003e(decl_context)`. However, when a non-template member class nested inside a class template specialization is instantiated (for example, `Stubby2StreamSocketTraitsType\u003cfalse\u003e::MessageParser`), its `decl_context` is a plain `CXXRecordDecl` rather than a `ClassTemplateSpecializationDecl`, while its static data members are still instantiated lazily via `Sema::BuildVariableInstantiation` with `getInstantiatedFromStaticDataMember() !\u003d nullptr`.\n\nAlso check `var_decl-\u003egetInstantiatedFromStaticDataMember() !\u003d nullptr` so static data members of nested classes inside class template specializations are skipped with the same unsupported item diagnostic instead of crashing.\n\nPiperOrigin-RevId: 1014866569\n"
    },
    {
      "commit": "ad02b4e0a4fb04bcfebbf9554813f07d28a27dc4",
      "tree": "e8bca3a1fe4568c779583db41df4487de8b1d859",
      "parents": [
        "6769ca9a4f5ba74b1c40936226efe10abce1b60f"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Nov 05 11:17:34 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 11:23:51 2026 -0800"
      },
      "message": "Generate Rust macros for C++ macro constants\n\nCrubit generated no bindings for macros, so Rust users of C++ libraries\nhad to duplicate constants like `#define FOO 4`. With the\n`macro_constants` feature, object-like macros that expand to an integer,\ncharacter, or boolean literal (optionally parenthesized) now become Rust\n`macro_rules!`:\n\n```c++\n#define FOO 4\n#define BAR 42u\n```\n\nbecomes\n\n```rust\n#[macro_export]\nmacro_rules! FOO {\n    () \u003d\u003e {\n        4\n    };\n}\n\n#[macro_export]\nmacro_rules! BAR {\n    () \u003d\u003e {\n        ::ffi_11::new_c_uint(42)\n    };\n}\n```\n\nA C++ macro has no type of its own: its literal gets a type wherever it\nis used. So if the macro\u0027s literals have no suffix, `FOO!()` is an\nuntyped Rust literal too, and can be used as any integer type that the\nC++ code could use it as, e.g. as an `i64` or `usize` argument, or as an\narray length. A `const` would have needed a conversion in each of those\nplaces.\n\nIf any literal has a suffix (e.g. `42u` or `1L`), or is a `u\u0027x\u0027` or\n`U\u0027x\u0027` character literal, the macro\u0027s author chose a type, so `BAR!()`\nhas the type of the constant, as Crubit binds it elsewhere (e.g.\n`c_uint`, or `u16` for `char16_t`). Booleans are always `bool`.\n\nrustc doesn\u0027t report overflowing literals that come from another\ncrate\u0027s macro, even though `overflowing_literals` is deny-by-default.\nSo an untyped constant that doesn\u0027t fit the type it is used as is\nsilently truncated, e.g. `let x: u8 \u003d FOO!();` if `FOO` is 256. Using a\nnegative untyped constant as an unsigned type is still an error.\n\nThe macro\u0027s tokens are parsed and built into an expression with `Sema`,\nso types and values follow the C++ rules (e.g. `42u` is a `c_uint`). The\nimporter then synthesizes a hidden `constexpr` variable for it, which\nthe existing constant support imports, marked as a macro constant. This\nreuses all of Crubit\u0027s constant handling, instead of adding a new kind\nof item.\n\nUpcoming changes add operators, `?:`, references to other macros, and\nmacros from header modules. Anything else (e.g. function-like macros,\ncasts, floats, strings, or types without a Rust equivalent such as\n`wchar_t`) is skipped silently, with all diagnostics suppressed.\nWarnings never cause a macro to be skipped, even if `-Werror` promotes\nthem to errors.\n\n*   Only macros in the target\u0027s own headers (including textual headers\n    they include) are imported, as defined at the end of the\n    translation unit.\n*   A macro is skipped if its name is also declared, e.g. by a\n    function declared before the macro was defined.\n*   A macro whose name can\u0027t be a Rust macro name (e.g. `self`, `_`, or\n    a name with a leading `__`) is reported as an error in the bindings.\n*   Comments next to a macro stay regular comments in the bindings.\n\nPiperOrigin-RevId: 1014855326\n"
    },
    {
      "commit": "6769ca9a4f5ba74b1c40936226efe10abce1b60f",
      "tree": "8421d439d549c1a9840ee53103f21d4210287027",
      "parents": [
        "67edd525a2b24f667299b347074b954a4402f94c"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Thu Nov 05 11:02:08 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 11:03:09 2026 -0800"
      },
      "message": "Port rs_bindings_from_cc_test from gbash to Rust.\n\ngbash doesn\u0027t have an equivalent in OSS, so this let\u0027s us run the same tests internally and in OSS.\n\nPiperOrigin-RevId: 1014842005\n"
    },
    {
      "commit": "67edd525a2b24f667299b347074b954a4402f94c",
      "tree": "d6ab9d23ef31091547cfc116c2b137b9442e0b62",
      "parents": [
        "a630b66403587928236e4f9d8207fc3ba6bdc6ae"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Thu Nov 05 10:47:46 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 10:48:59 2026 -0800"
      },
      "message": "Suppress bindings for transitively re-exported generic ADTs\n\nBecause we specialize an emitted templated for generics, we can\u0027t\nspecialize the alias used to transitively re-export generics. C++ won\u0027t\nallow for specializing a template alias. Instead we suppress the\nbindings and ask that users directly include the needed template\ndeclaration.\n\nPiperOrigin-RevId: 1014830211\n"
    },
    {
      "commit": "a630b66403587928236e4f9d8207fc3ba6bdc6ae",
      "tree": "b60f0c1875c2c3a8073f2af0b121341a1a8f41ef",
      "parents": [
        "4988a6bdfeeb1a03ad432c9eeed0a4efb1813cd9"
      ],
      "author": {
        "name": "Ethan Smith",
        "email": "ethansmith@google.com",
        "time": "Thu Nov 05 10:00:39 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 10:01:55 2026 -0800"
      },
      "message": "Remove update_latest_tag.yaml\n\nThis functionality was moved into the test matrix so we could base the\ncommit on whether or not upstream nightly is building.\n\nPiperOrigin-RevId: 1014790309\n"
    },
    {
      "commit": "4988a6bdfeeb1a03ad432c9eeed0a4efb1813cd9",
      "tree": "706b01236c22213b07a2fb3e3f09cb3c52b71527",
      "parents": [
        "bc3d73838a695f9747afc87b1bc99ff512a1d412"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Thu Nov 05 08:21:02 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Nov 05 08:23:33 2026 -0800"
      },
      "message": "`status_test`, `status_macros_test`, and `status_test_matchers_test` (added in https://github.com/google/crubit/commit/f9f3af228ec98bf12fb926ad0bd42e6d0965bcd9) are unit tests of Crubit\u0027s own C++ tooling that depend on `//third_party/llvm/llvm-project/llvm:Support`. Because `//third_party/llvm/llvm-project/llvm:google_config_defines_gen` is not compatible with the Windows target platforms, the `*_on_windows_x86` and `*_on_windows_x86_64` targets generated by `crubit_cc_test` fail during Bazel analysis in the `devtools.rust.cc_interop.windows_cc_tests` continuous Guitar workflow.\n\nAdd `tags \u003d [\"no_windows\"]` to these three targets, matching `annotation_reader_test` in the same package and the LLVM-dependent unit tests in `//third_party/crubit/rs_bindings_from_cc`.\n\nPiperOrigin-RevId: 1014715405\n"
    },
    {
      "commit": "4a6bd7d0fa7aad11cbae352b27dc3a08b3c69853",
      "tree": "97064eb58ab3536e4e162cf608e4c62df0cdd2cc",
      "parents": [
        "b4bbf509fa735438c7d886fc19bdbf08df40225c"
      ],
      "author": {
        "name": "Andy Soffer",
        "email": "andy@brontosource.dev",
        "time": "Thu Nov 05 08:13:09 2026 -0500"
      },
      "committer": {
        "name": "Andy Soffer",
        "email": "andy@brontosource.dev",
        "time": "Thu Nov 05 08:27:05 2026 -0500"
      },
      "message": "Move the C++ standard library header lists to text files\n\nThis allows us to generate the .bzl lists from a repository rule\nproviding the same interface in Bazel, but still access them from\nCMake without privileging one build system over the other.\n"
    },
    {
      "commit": "bc3d73838a695f9747afc87b1bc99ff512a1d412",
      "tree": "a92f5df76ff3e522a7ddeccce36e85deb394bfab",
      "parents": [
        "598e1ab467fa3e266e206313165958be31ef69b2"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Nov 04 19:06:10 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 04 19:07:33 2026 -0800"
      },
      "message": "Enable `char_test` and `enum_storage_test` on Windows.\n\nPiperOrigin-RevId: 1014317157\n"
    },
    {
      "commit": "598e1ab467fa3e266e206313165958be31ef69b2",
      "tree": "8693f1523a253fd580cebc88d9287bdbd3217f64",
      "parents": [
        "e5d40e14e599afb54c651d7d36d3d5eaa34f413e"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Nov 04 18:53:47 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 04 18:56:14 2026 -0800"
      },
      "message": "Use a pointer-sized niche tag in the `rs_std` `enum_storage_test`.\n\nPiperOrigin-RevId: 1014310962\n"
    },
    {
      "commit": "e5d40e14e599afb54c651d7d36d3d5eaa34f413e",
      "tree": "ccf5372e539bb5fe5b572a797e14d828d77bd7ff",
      "parents": [
        "c47268d90b42990d8c9d27210df6de92fb50aa98"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Wed Nov 04 16:19:22 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 04 16:20:41 2026 -0800"
      },
      "message": "Update Crubit documentation and skills for recent smart pointer, `std::string`, `std::optional`, `rs::Movable`, and `rust_api_from_cpp` changes.\n\nPiperOrigin-RevId: 1014222576\n"
    },
    {
      "commit": "c47268d90b42990d8c9d27210df6de92fb50aa98",
      "tree": "819eddbdd0ff82059a5cea1aed9e8f8dbbda1f76",
      "parents": [
        "6cdbd6b427cbaf539e32c84d8df42a4830981304"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Nov 04 15:35:28 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 04 15:37:06 2026 -0800"
      },
      "message": "Report declarations with `CRUBIT_DO_NOT_BIND` in the error report.\n\nPiperOrigin-RevId: 1014189268\n"
    },
    {
      "commit": "6cdbd6b427cbaf539e32c84d8df42a4830981304",
      "tree": "6a0465c49d2c52c7a81cf2bc2125ae753278a939",
      "parents": [
        "6150cde514b2147c7a778cf2a048925d0d372d28"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Wed Nov 04 13:40:50 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 04 13:47:10 2026 -0800"
      },
      "message": "Add the required embedded_cpp \u003d True to the inline_cpp! rust_api_from_cpp example.\n\nThe rust_api_from_cpp macro fails without `embedded_cpp \u003d True` when `srcs`\ncontain inline_cpp! / global_cpp! blocks, but the documented example omitted it.\n\nPiperOrigin-RevId: 1014102670\n"
    },
    {
      "commit": "6150cde514b2147c7a778cf2a048925d0d372d28",
      "tree": "e1a801395110f2a8ab34fd6a7184fb79be23154c",
      "parents": [
        "3f57da4265e36df372b7b2bb8d8dbc018782815a"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Nov 04 13:39:26 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 04 13:43:19 2026 -0800"
      },
      "message": "Reland: Turn on enum_api_v2 by default.\n\nAdds `enum_api_v2` to `SUPPORTED_FEATURES`, so `cpp_api_from_rust` emits the v2 C++ API for Rust enums (one nested struct per variant, built with `E::V::Make(...)` and inspected with `rs::get_if` and friends) instead of `E::MakeV(...)` constructors.\n\nTargets that break are denylisted (mostly as one file per target in `features/denylists/internal/enum_api_v2/`), and will be migrated in follow-up CLs.\n\nPiperOrigin-RevId: 1014101514\n"
    },
    {
      "commit": "3f57da4265e36df372b7b2bb8d8dbc018782815a",
      "tree": "5500b8822f183e819681f69f3e75647e33931ba8",
      "parents": [
        "46bdc0b67aae9ed074cf8d52b7169797e939a1f6"
      ],
      "author": {
        "name": "Lukasz Anforowicz",
        "email": "lukasza@google.com",
        "time": "Wed Nov 04 13:38:35 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 04 13:39:30 2026 -0800"
      },
      "message": "Add `param_name_insensitive_operator_lookup` Crubit feature.\n\n`rs_bindings_from_cc` looks up related operators with `get_binding`:\n`operator\u003c\u003d\u003e`, `\u003c`, `\u003e`, `\u003c\u003d`, and `\u003e\u003d` look for `operator\u003d\u003d` and for\na more preferred `PartialOrd` operator, and `operator!\u003d` looks for\n`operator\u003d\u003d`.\n\n`get_binding` compares parameter types including lifetimes.  With\n`assume_lifetimes`, the lifetime names come from the C++ parameter\nnames (e.g. `\u0027__this` and `\u0027other` for a member function, but `\u0027lhs`\nand `\u0027rhs` for a hidden friend).  Therefore the lookup fails when the\nparameter names differ.  For example:\n\n* Chromium\u0027s `GURL` has a hidden friend `operator\u003c\u003d\u003e(lhs, rhs)` and a\n  non-member `operator\u003d\u003d(x, y)`.  Without the new feature,\n  `operator\u003c\u003d\u003e` doesn\u0027t find `operator\u003d\u003d`, so Chromium needs a\n  workaround [1] that renames the parameters of `operator\u003d\u003d`.\n* Gloop\u0027s `IPAddress` has a member `operator\u003d\u003d(other)` and a hidden\n  friend `operator\u003c\u003d\u003e(lhs, rhs)` [2].  Renaming the parameters can\u0027t\n  help here, because the lifetime of `this` is always `\u0027__this`.\n  Therefore Gloop implements `Ord` and `PartialOrd` manually in Rust,\n  with a C++ helper function [3].\n\nThe same problem makes `operator!\u003d` miss `operator\u003d\u003d`.  Then both\nimplement `PartialEq::eq`, and neither is bound.\n\nWith the new feature, `get_binding` ignores lifetimes when it\n**searches** for the related operator.  This can\u0027t find a wrong\nfunction, because C++ functions can\u0027t be overloaded on lifetimes.\nLifetimes are not ignored when Crubit actually **generates** the\nbindings of the found operator.\n\nThe new feature can generate new `PartialEq` and `PartialOrd` impls,\nwhich can conflict with manual impls (as in the case of Gloop above).\nTherefore this is a separate feature, so that existing Crubit users can\nmigrate gradually.\n\n[1] https://crrev.com/c/8680840/4/url/gurl.h\n[2] https://github.com/abseil/gloop/blob/5adff59109454c3aeee851b9f07c6467be4aeccd/gloop/net/base/ipaddress.h#L236-L277\n[3] https://github.com/abseil/gloop/blob/5adff59109454c3aeee851b9f07c6467be4aeccd/gloop/net/base/ipaddress_ffi.cc#L30\n\nPiperOrigin-RevId: 1014100846\n"
    },
    {
      "commit": "46bdc0b67aae9ed074cf8d52b7169797e939a1f6",
      "tree": "14587f1f33ba51d1ab1072d65e5ed19e6e6f42a8",
      "parents": [
        "c09857ac848fa40bded0b790bca37bfdfd19ad70"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Nov 04 13:08:29 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 04 13:12:32 2026 -0800"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 1014078042\n"
    },
    {
      "commit": "c09857ac848fa40bded0b790bca37bfdfd19ad70",
      "tree": "3439b121bfec7e4d4d81fd1b339e4be2dac74fc0",
      "parents": [
        "57f60bc52b63cf6df1e063f7671631afe529b8f9"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Nov 04 13:07:13 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 04 13:08:28 2026 -0800"
      },
      "message": "Support Align on LayoutData in cc_bindings_from_rs for nightly-2026-11-04.\n\nUpstream rust-lang/rust#165354 (81330f91e512) replaced `AbiAlign` with `Align` on `rustc_abi::LayoutData::align` starting in `nightly-2026-11-04` (following rust-lang/rust#165262, which made `Layout::align()` return `Align`).\n\nBecause `AbiAlign` implements `Deref\u003cTarget \u003d Align\u003e`, drop `.abi` on `.align` and `.align()` callsites in `generate_struct_and_union.rs` (including `slice_element_align` added in https://github.com/google/crubit/commit/a9ef4e1dd35d8d4bd7281fc153c7180e7654cf43) so they compile across all supported Rust toolchains without `#[rustversion]` gating.\n\nCloses #2818\n\nPiperOrigin-RevId: 1014077111\n"
    },
    {
      "commit": "57f60bc52b63cf6df1e063f7671631afe529b8f9",
      "tree": "7d604c5fc24b963367fe5c4f14dbdb8318821e0e",
      "parents": [
        "3b471f35ec85b1f4f5a24fa07733b9d64bc438b5"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Nov 04 12:39:53 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 04 12:42:13 2026 -0800"
      },
      "message": "Enable feature constant_arrays in global_features.bzl (for fields that are fixed size C-style arrays)\n\n- Add end-to-end FFI and `Debug` tests for the supported cases: 1D, multidimensional fixed size arrays of primitive or enums as fields of structs or unions.\n- Update Crubit documentation\n\nPiperOrigin-RevId: 1014055838\n"
    },
    {
      "commit": "3b471f35ec85b1f4f5a24fa07733b9d64bc438b5",
      "tree": "93d0e27f782f14149beef698c31a9e52769c2673",
      "parents": [
        "be85ab7a4557df9dbda390f4c5c0f5194d3ea692"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Nov 04 09:03:15 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 04 09:04:23 2026 -0800"
      },
      "message": "Fix the std::optional example in the Crubit README\n\n`std::optional\u003cT\u003e` is now always bound as the layout-compatible\n`cpp_std::optional\u003cT\u003e` / `cpp_std::trivial_optional\u003cT\u003e` rather than bridged to\n`Option\u003cT\u003e` (https://github.com/google/crubit/commit/a1f23c983a37eb0124349838dfa2bbb1ab885917, https://github.com/google/crubit/commit/be85ab7a4557df9dbda390f4c5c0f5194d3ea692), so `FindUser` returns a\n`cpp_std::trivial_optional\u003cUser\u003e`. Convert it to an `Option\u003cUser\u003e` with\n`.into()`.\n\nPiperOrigin-RevId: 1013898734\n"
    },
    {
      "commit": "be85ab7a4557df9dbda390f4c5c0f5194d3ea692",
      "tree": "973152fb613e15e23140a21477b9fb7ac7ee3152",
      "parents": [
        "a9ef4e1dd35d8d4bd7281fc153c7180e7654cf43"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Nov 04 08:23:21 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 04 08:24:37 2026 -0800"
      },
      "message": "Remove the layout_compat_optional Crubit feature\n\n`std::optional\u003cT\u003e` is now always bound as the layout-compatible\n`cc_std::std::optional\u003cT\u003e` / `cc_std::std::trivial_optional\u003cT\u003e`\n(https://github.com/google/crubit/commit/a1f23c983a37eb0124349838dfa2bbb1ab885917), so the feature no longer does anything. Remove it: the\n`CrubitFeature::LayoutCompatOptional` flag, its entry in\n`SUPPORTED_FEATURES`, and the `:layout_compat_optional` aspect hint.\n\nPiperOrigin-RevId: 1013870730\n"
    },
    {
      "commit": "a9ef4e1dd35d8d4bd7281fc153c7180e7654cf43",
      "tree": "7ffa89f159e4d0c659c8a31249be77169b266840",
      "parents": [
        "b4bbf509fa735438c7d886fc19bdbf08df40225c"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Nov 04 07:43:07 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 04 07:44:23 2026 -0800"
      },
      "message": "Break definition cycles through slices and boxes in cc_bindings_from_rs.\n\nWith `enum_api_v2`, an enum\u0027s variant fields are C++ members, so the enum\u0027s definition needs the definitions of their types. When one of those types refers back to the enum through a slice or a `Box`, `cc_bindings_from_rs` panicked with \"There are no known scenarios where CcPrerequisites::defs can form a dependency cycle\". For example:\n\n```rust\npub enum Value { Null, Dict(Dict) }\npub struct Dict { pub values: \u0026\u0027static [(\u0026\u0027static str, Value)] }\n\npub enum Expr { Lit(i32), Neg(Neg) }\npub struct Neg { pub operand: Box\u003cExpr\u003e }\n```\n\nThis is common in AST-like crates (`syn`, `regex_syntax`, `swc_ecma_ast`, ...).\n\nLike pointers, `rs::SliceRef\u003cT\u003e` and `rs::Box\u003cT\u003e` only need `T` to be forward-declared where they\u0027re declared, so:\n\n- `format_slice_ref_for_cc` now only requires a forward declaration of the element type.\n- `format_box_for_cc` already meant to forward-declare the pointee, but did so before merging in the pointee\u0027s prerequisites, so it had no effect.\n- Default-initializing a struct field `rs::SliceRef\u003cT\u003e f{}` needs `alignof(T)`. Generated bindings now use `rs::SliceRef\u003cT\u003e f{::crubit::internal::SliceRefDanglingTag{}, align}` with the alignment from rustc, and check it against `alignof(T)` in `__crubit_field_offset_assertions`, where `T` is complete.\n\nPiperOrigin-RevId: 1013845248\n"
    },
    {
      "commit": "b4bbf509fa735438c7d886fc19bdbf08df40225c",
      "tree": "c01d4598dcb61644d1748eba407182df2bea3c91",
      "parents": [
        "239d5845fa3f120cafc2c8770fe94b76477342cc"
      ],
      "author": {
        "name": "Googler",
        "email": "no-reply@google.com",
        "time": "Wed Nov 04 03:20:38 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Nov 04 03:26:44 2026 -0800"
      },
      "message": "Bump ra_ap_rustc_lexer dependency to 0.166\n\nPiperOrigin-RevId: 1013710357\n"
    },
    {
      "commit": "239d5845fa3f120cafc2c8770fe94b76477342cc",
      "tree": "90b39293d7e594be41aab81285723eae933ad82e",
      "parents": [
        "7ba5af85b61ca4ac20e08c9a79c81f26e343c06a"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Nov 03 18:36:03 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 18:37:12 2026 -0800"
      },
      "message": "Migrate the rs_bindings_from_cc pipeline layer to LLVM types.\n\nConvert `bazel_types.h`, `ir_from_cc.cc`, `src_code_gen.cc`, and `generate_bindings_and_metadata.cc` from Abseil statuses, spans, nullability macros, and maps/sets to `llvm::Expected\u003cT\u003e`, `llvm::ArrayRef`, `llvm::DenseMap` / `llvm::DenseSet`, and Clang `_Nullable` / `_Nonnull`.\n\nPiperOrigin-RevId: 1013452912\n"
    },
    {
      "commit": "7ba5af85b61ca4ac20e08c9a79c81f26e343c06a",
      "tree": "bda0f0043812c03af20b7ea9ce11d41c9a8282eb",
      "parents": [
        "d040b4acbc6425bc8552d052c13044aac8dc477a"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Nov 03 18:26:53 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 18:28:10 2026 -0800"
      },
      "message": "Migrate the rs_bindings_from_cc importer layer to LLVM types.\n\nConvert `decl_importer.h`, `importer.h`, `importer.cc`, and all declaration importers under `rs_bindings_from_cc/importers/` from Abseil statuses, strings, spans, nullability macros, and logging to `llvm::Expected\u003cT\u003e`, `llvm::StringRef`, `llvm::ArrayRef`, `llvm::DenseMap` / `llvm::DenseSet`, Clang `_Nullable` / `_Nonnull`, `CRUBIT_FATAL` in `common/check.h`, and a standard-library-backed `CRUBIT_LOG` helper in `rs_bindings_from_cc/logging.h` (`llvm::errs()` and `std::string_view`, with no Abseil dependencies).\n\nPiperOrigin-RevId: 1013448706\n"
    },
    {
      "commit": "d040b4acbc6425bc8552d052c13044aac8dc477a",
      "tree": "7c5386d14e11ac7d5e5d70c2e9aca57082e4325f",
      "parents": [
        "3dd1e528bc92c321590c29c9317ff6d0963873eb"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Nov 03 18:09:22 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 18:10:34 2026 -0800"
      },
      "message": "Migrate rs_bindings_from_cc IR and leaf libraries to LLVM types.\n\nUpdate `ir_ffi_support.h`, `ir_codegen.rs` (`ir_generated.h`), `ir.h`, `ast_util`, `type_map`, `annotations_consumer`, `collect_instantiations`, `collect_namespaces`, `profiling`, and `recording_diagnostic_consumer` to use `llvm::StringRef`, `llvm::ArrayRef`, `llvm::Expected\u003cT\u003e`, `llvm::DenseMap`, and Clang nullability qualifiers instead of Abseil types. Preserve exact `FormattedError::FromStatus` formatting via `crubit::StatusError` and `$N` placeholder substitution so generated bindings and error reports remain unchanged.\n\nPiperOrigin-RevId: 1013439440\n"
    },
    {
      "commit": "3dd1e528bc92c321590c29c9317ff6d0963873eb",
      "tree": "02b56d08f988f48eb20f9d205f95d7721893d79a",
      "parents": [
        "5dc14d8e304c5f0652bce8ca08ddb4b2c3e2a6c5"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Nov 03 18:00:54 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 18:01:49 2026 -0800"
      },
      "message": "Remove Abseil dependencies from Crubit lifetime_annotations.\n\nReplace `absl::Status`, `absl::StatusOr`, `absl::string_view`, `absl::StrCat`, and Abseil hash containers in `lifetime_annotations/` with `llvm::Error`, `llvm::Expected\u003cT\u003e`, `llvm::StringRef`, `llvm::Twine`, and LLVM/standard containers while preserving all diagnostic messages and unit test assertions.\n\nPiperOrigin-RevId: 1013433737\n"
    },
    {
      "commit": "5dc14d8e304c5f0652bce8ca08ddb4b2c3e2a6c5",
      "tree": "ca040b253562d3eab1238f9c7ae6881dd0f777b0",
      "parents": [
        "96fbe5e78d463c8b87d99212b1193c56980e86fa"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Nov 03 17:48:29 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 17:49:45 2026 -0800"
      },
      "message": "Migrate Crubit common C++ utilities from Abseil to LLVM and std types.\n\nSwitch `common/file_io`, `common/annotation_reader`, `common/strong_int`, and `common/string_type` from Abseil status, string, span, and hash traits to `llvm::Error`, `llvm::Expected\u003cT\u003e`, `llvm::StringRef`, `llvm::ArrayRef`, and `llvm::DenseMapInfo` as part of removing Abseil from `rs_bindings_from_cc`.\nAdditionally, `ffi_types` and `external_binaries` use `std::string_view` instead of `llvm::StringRef` to remain `std`-only.\n\nPiperOrigin-RevId: 1013427730\n"
    },
    {
      "commit": "96fbe5e78d463c8b87d99212b1193c56980e86fa",
      "tree": "5105af5596f065ed73ed660e22af0486809b856f",
      "parents": [
        "8080a927fb1a5faac63e929ec2018710ca1b33c6"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Nov 03 17:26:31 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 17:29:39 2026 -0800"
      },
      "message": "rs_bindings_from_cc: treat C++ records containing rs boxes as Rust-movable.\n\nAnnotates `rs::Box`, `rs::PinBox`, `rs::SliceBox`, and `rs::StrBox` with `CRUBIT_UNSAFE_BITWISE_RELOCATABLE` so Crubit recognizes them as Rust-movable even though their C++ copy and move constructors are deleted. Updates `CheckOwnSpecialMembers` in `bitwise_relocatable.cc` (following C++26 P2786 trivial-relocatability composition rules) so that an unannotated record or union whose subobjects are all bitwise-relocatable remains bitwise-relocatable when its defaulted copy or move constructor is implicitly deleted due to a subobject. Records made Rust-movable this way can be moved and returned by value in Rust, while passing them by value *to* C++ as a parameter is rejected because the generated C++ thunk cannot relocate them without a C++ copy or move constructor.\n\nPiperOrigin-RevId: 1013415871\n"
    },
    {
      "commit": "8080a927fb1a5faac63e929ec2018710ca1b33c6",
      "tree": "7c9cf92186b086bdc8ed65c8e7a99043d96ae1c4",
      "parents": [
        "f9f3af228ec98bf12fb926ad0bd42e6d0965bcd9"
      ],
      "author": {
        "name": "Peter Foley",
        "email": "pefoley@google.com",
        "time": "Tue Nov 03 17:24:31 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 17:26:18 2026 -0800"
      },
      "message": "Exclude netinet/in.h from cc_std LIBC_HEADERS on Apple platforms.\n\nPiperOrigin-RevId: 1013414835\n"
    },
    {
      "commit": "f9f3af228ec98bf12fb926ad0bd42e6d0965bcd9",
      "tree": "fa3cea78cb1cf0c1b82b5e686ec6b2e469fed958",
      "parents": [
        "6d0d04932cc710f668ee64ea0dc0138422573efc"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Nov 03 17:07:23 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 17:10:27 2026 -0800"
      },
      "message": "Add LLVM-backed StatusError and dual-mode status macros for Crubit.\n\nIntroduce `crubit::StatusError` (`llvm::ErrorInfo\u003cStatusError\u003e`) and `crubit::StatusCode` in `common/status.h` so `llvm::Error` and `llvm::Expected\u003cT\u003e` preserve structured status codes across the incremental migration off `absl::Status`. Extend `CRUBIT_RETURN_IF_ERROR`, `CRUBIT_ASSIGN_OR_RETURN`, and test matchers (`IsOk`, `IsOkAndHolds`, `StatusIs`) to accept both Abseil statuses and `llvm::Error` / `llvm::Expected\u003cT\u003e` during the transition.\n\nPiperOrigin-RevId: 1013404649\n"
    },
    {
      "commit": "6d0d04932cc710f668ee64ea0dc0138422573efc",
      "tree": "491bebfabb0324f5889591ecbd3f97d9d9639396",
      "parents": [
        "32b771243b6fe6f1fc30b14dfd11b1fbaebead12"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Nov 03 16:23:57 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 16:29:25 2026 -0800"
      },
      "message": "Add CRUBIT_UNSAFE_BITWISE_RELOCATABLE annotations and verify Rust-movability from members\n\nCrubit previously decided whether a C++ type is Rust-movable (Unpin) by\nchecking whether it is \"trivial for calls\" in Clang, which trusted\n[[clang::trivial_abi]] without inspecting the type\u0027s members, tied the\nanswer to the target ABI, and gave no way to mark a type Rust-movable\nwithout changing its ABI.\n\nrs_bindings_from_cc now computes bitwise relocatability from the class\ndefinition: every base and non-static data member must be bitwise\nrelocatable, polymorphic types and std::basic_string never are, and a\ntype\u0027s own user-provided move constructor/destructor are only accepted\nwhen the author vouches for them with one of the new annotations:\n\n* CRUBIT_UNSAFE_BITWISE_RELOCATABLE: asserts the type is bitwise\n  relocatable; bindings generation fails if a member is not.\n* CRUBIT_UNSAFE_BITWISE_RELOCATABLE_IF_ELIGIBLE: same, but silently\n  leaves the type pinned if a member is not (for templates).\n* CRUBIT_UNSAFE_BITWISE_RELOCATABLE_FIELD: treats one\n  member as bitwise relocatable regardless of its type.\n* CRUBIT_BITWISE_RELOCATABLE_STD_STRING_ONLY_ON_LIBCXX: treats one\n  std::basic_string member as bitwise relocatable on libc++ only (safe because\n  basic_string holds no self-pointer there).\n\n[[clang::trivial_abi]] is now treated like _IF_ELIGIBLE, so a type with a\nstd::string member is no longer Rust-movable just because it carries the\nattribute. A small table covers standard library templates whose headers\ncannot carry annotations: std::unique_ptr, shared_ptr, weak_ptr, optional,\nvariant, expected and vector are bitwise relocatable when their relevant\ntemplate arguments are; std::function, any, list and the node-based\ncontainers never are. Types that are not Rust-movable get a doc comment\nexplaining why. Builds with -fexperimental-pointer-field-protection-tagged\nare rejected, since pointer fields there are encoded with the object\naddress.\n\nSee g3doc/design/bitwise_relocatable.md.\n\nPiperOrigin-RevId: 1013377430\n"
    },
    {
      "commit": "32b771243b6fe6f1fc30b14dfd11b1fbaebead12",
      "tree": "29102ac439b35ff9a791fc0a144081be0a43d127",
      "parents": [
        "c8e285e3a841ad635808183c4fd233f040b02bf5"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Nov 03 16:23:32 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 16:24:27 2026 -0800"
      },
      "message": "docs: Update Crubit documentation for recent `absl::StatusOr` and C++ constant array bindings changes.\n\nPiperOrigin-RevId: 1013377143\n"
    },
    {
      "commit": "c8e285e3a841ad635808183c4fd233f040b02bf5",
      "tree": "948ded7b054988372d29a8346fcd5ead5d1a4c73",
      "parents": [
        "b814b2bb5e954928f37e654eed3abd5d2ddf1644"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Nov 03 15:58:25 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 16:00:42 2026 -0800"
      },
      "message": "Document that unsupported std template instantiations still get opaque bindings.\n\nA C++ function returning e.g. std::map\u003cint, T\u003e is not rejected: Crubit binds\nthe concrete instantiation as an opaque, non-Rust-movable type\n(`Ctor![__CcTemplateInst...]`) that can be passed around but not inspected,\nand only its member types show up as `// error:` comments. Say so on the std\ntypes page next to the ergonomic cpp_std mappings, and point at\n--config\u003dcrubit-genfiles to see which one you got.\nPiperOrigin-RevId: 1013359764\n"
    },
    {
      "commit": "b814b2bb5e954928f37e654eed3abd5d2ddf1644",
      "tree": "b251f9010f5e389460da68180e5b0399e071342e",
      "parents": [
        "3b0b62e4901be5296a47e097d702da2d3d029678"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Nov 03 15:48:17 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 15:54:11 2026 -0800"
      },
      "message": "Use uintptr_t for RefOption discriminant in enum_test.\n\n`RustcDiscriminant` accepts `uintptr_t`, so `RefOption` can use a pointer-sized unsigned discriminant across both 32-bit and 64-bit platforms instead of hardcoding `uint64_t`.\n\nPiperOrigin-RevId: 1013352432\n"
    },
    {
      "commit": "3b0b62e4901be5296a47e097d702da2d3d029678",
      "tree": "4a25d6a5ceb3d2ec164fd78ea3fab53650ba3e91",
      "parents": [
        "9184ca086d3972bfbfde746f0170f4b303886759",
        "a939083ab3d8c9ec1e88a3ee98a1e2e1b46e403a"
      ],
      "author": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 14:21:54 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 14:21:54 2026 -0800"
      },
      "message": "Merge pull request #2678 from brontosource:rs-bindings-from-cc\n\nPiperOrigin-RevId: 1013282998\n"
    },
    {
      "commit": "9184ca086d3972bfbfde746f0170f4b303886759",
      "tree": "7e1cdce090182957681108bab862616c0f8c7983",
      "parents": [
        "227eabbc55bf104c53b7bed19aad68a77b1c71c5"
      ],
      "author": {
        "name": "Taylor Cramer",
        "email": "cramertj@google.com",
        "time": "Tue Nov 03 14:10:50 2026 -0800"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Nov 03 14:19:54 2026 -0800"
      },
      "message": "Add CRUBIT_UNSAFE_BITWISE_RELOCATABLE annotation macros\n\nAdds the four annotations (CRUBIT_UNSAFE_BITWISE_RELOCATABLE, _IF_ELIGIBLE,\n_FIELD, CRUBIT_BITWISE_RELOCATABLE_STD_STRING_ONLY_ON_LIBCXX) described in g3doc/design/bitwise_relocatable.md.\nThis CL only defines the macros; rs_bindings_from_cc starts honoring them in\na follow-up, so they are inert until then. Landing them first lets C++\nlibraries annotate ahead of the behavior change.\n\nPiperOrigin-RevId: 1013282835\n"
    }
  ],
  "next": "227eabbc55bf104c53b7bed19aad68a77b1c71c5"
}
