Use `Rc<IR>` instead of `&IR` at the top-level entry point.

Salsa isn't compatible with references -- so if IR is a salsa input, it must be an Rc (or Arc), not a &IR. (Unless we made it `'static`...)

PiperOrigin-RevId: 458113684
diff --git a/rs_bindings_from_cc/src_code_gen.rs b/rs_bindings_from_cc/src_code_gen.rs
index 8c0a17c..2d39b12 100644
--- a/rs_bindings_from_cc/src_code_gen.rs
+++ b/rs_bindings_from_cc/src_code_gen.rs
@@ -96,10 +96,10 @@
     rustfmt_exe_path: &OsStr,
     rustfmt_config_path: &OsStr,
 ) -> Result<Bindings> {
-    let ir = deserialize_ir(json)?;
+    let ir = Rc::new(deserialize_ir(json)?);
 
     let BindingsTokens { rs_api, rs_api_impl } =
-        generate_bindings_tokens(&ir, crubit_support_path)?;
+        generate_bindings_tokens(ir.clone(), crubit_support_path)?;
     let rs_api = {
         let rustfmt_config = RustfmtConfig::new(rustfmt_exe_path, rustfmt_config_path);
         rs_tokens_to_formatted_string(rs_api, &rustfmt_config)?
@@ -1327,7 +1327,7 @@
         .iter()
         .map(|id| {
             let item = ir.find_decl(*id)?;
-            generate_item(item, ir, overloaded_funcs)
+            generate_item(item, &ir, overloaded_funcs)
         })
         .collect::<Result<Vec<_>>>()?;
 
@@ -1675,10 +1675,10 @@
 
 // Returns the Rust code implementing bindings, plus any auxiliary C++ code
 // needed to support it.
-fn generate_bindings_tokens(ir: &IR, crubit_support_path: &str) -> Result<BindingsTokens> {
+fn generate_bindings_tokens(ir: Rc<IR>, crubit_support_path: &str) -> Result<BindingsTokens> {
     let mut items = vec![];
     let mut thunks = vec![];
-    let mut thunk_impls = vec![generate_rs_api_impl(ir, crubit_support_path)?];
+    let mut thunk_impls = vec![generate_rs_api_impl(&ir, crubit_support_path)?];
     let mut assertions = vec![];
 
     // We import nullable pointers as an Option<&T> and assume that at the ABI
@@ -1703,7 +1703,7 @@
     let mut seen_funcs = HashSet::new();
     let mut overloaded_funcs = HashSet::new();
     for func in ir.functions() {
-        if let Ok(Some((.., function_id))) = generate_func(func, ir) {
+        if let Ok(Some((.., function_id))) = generate_func(func, &ir) {
             if !seen_funcs.insert(function_id.clone()) {
                 overloaded_funcs.insert(function_id);
             }
@@ -1712,7 +1712,7 @@
 
     for top_level_item_id in ir.top_level_item_ids() {
         let item = ir.find_decl(*top_level_item_id)?;
-        let generated = generate_item(item, ir, &overloaded_funcs)?;
+        let generated = generate_item(item, &ir, &overloaded_funcs)?;
         items.push(generated.item);
         if !generated.thunks.is_empty() {
             thunks.push(generated.thunks);
@@ -2671,14 +2671,14 @@
     };
     use token_stream_printer::{rs_tokens_to_formatted_string_for_tests, tokens_to_string};
 
-    fn generate_bindings_tokens(ir: &IR) -> Result<BindingsTokens> {
+    fn generate_bindings_tokens(ir: Rc<IR>) -> Result<BindingsTokens> {
         super::generate_bindings_tokens(ir, "crubit/rs_bindings_support")
     }
 
     #[test]
     fn test_disable_thread_safety_warnings() -> Result<()> {
         let ir = ir_from_cc("inline void foo() {}")?;
-        let rs_api_impl = generate_bindings_tokens(&ir)?.rs_api_impl;
+        let rs_api_impl = generate_bindings_tokens(ir)?.rs_api_impl;
         assert_cc_matches!(
             rs_api_impl,
             quote! {
@@ -2710,7 +2710,7 @@
     #[test]
     fn test_simple_function() -> Result<()> {
         let ir = ir_from_cc("int Add(int a, int b);")?;
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -2742,7 +2742,7 @@
     #[test]
     fn test_inline_function() -> Result<()> {
         let ir = ir_from_cc("inline int Add(int a, int b);")?;
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -2783,7 +2783,7 @@
             "struct ReturnStruct {}; struct ParamStruct {};",
         )?;
 
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -2833,7 +2833,7 @@
             ir_from_cc_dependency(current_target_src, dependency_src)?
         };
 
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -2907,7 +2907,7 @@
                 using MyTypeAlias = MyTemplate<int>; "#,
         )?;
 
-        let BindingsTokens { rs_api_impl, .. } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api_impl, .. } = generate_bindings_tokens(ir)?;
 
         // Even though the member functions above are *not* defined inline (e.g.
         // IR::Func::is_inline is false), they still need to have thunks generated for
@@ -2956,7 +2956,7 @@
             };
         })?)?;
 
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3008,7 +3008,7 @@
     #[test]
     fn test_ref_to_struct_in_thunk_impls() -> Result<()> {
         let ir = ir_from_cc("struct S{}; inline void foo(class S& s) {} ")?;
-        let rs_api_impl = generate_bindings_tokens(&ir)?.rs_api_impl;
+        let rs_api_impl = generate_bindings_tokens(ir)?.rs_api_impl;
         assert_cc_matches!(
             rs_api_impl,
             quote! {
@@ -3023,7 +3023,7 @@
     #[test]
     fn test_const_ref_to_struct_in_thunk_impls() -> Result<()> {
         let ir = ir_from_cc("struct S{}; inline void foo(const class S& s) {} ")?;
-        let rs_api_impl = generate_bindings_tokens(&ir)?.rs_api_impl;
+        let rs_api_impl = generate_bindings_tokens(ir)?.rs_api_impl;
         assert_cc_matches!(
             rs_api_impl,
             quote! {
@@ -3038,7 +3038,7 @@
     #[test]
     fn test_unsigned_int_in_thunk_impls() -> Result<()> {
         let ir = ir_from_cc("inline void foo(unsigned int i) {} ")?;
-        let rs_api_impl = generate_bindings_tokens(&ir)?.rs_api_impl;
+        let rs_api_impl = generate_bindings_tokens(ir)?.rs_api_impl;
         assert_cc_matches!(
             rs_api_impl,
             quote! {
@@ -3059,7 +3059,7 @@
         })?)?;
 
         assert_cc_matches!(
-            generate_bindings_tokens(&ir)?.rs_api_impl,
+            generate_bindings_tokens(ir)?.rs_api_impl,
             quote! {
                 extern "C" int __rust_thunk___ZN10SomeStruct9some_funcEv() {
                     return SomeStruct::some_func();
@@ -3078,7 +3078,7 @@
         })?)?;
 
         assert_cc_matches!(
-            generate_bindings_tokens(&ir)?.rs_api_impl,
+            generate_bindings_tokens(ir)?.rs_api_impl,
             quote! {
                 extern "C" int __rust_thunk___ZNK10SomeStruct9some_funcEi(
                         const class SomeStruct* __this, int arg) {
@@ -3105,7 +3105,7 @@
             };
         "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3136,7 +3136,7 @@
                 int last_field;
             }; "#,
         )?;
-        let BindingsTokens { rs_api, .. } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, .. } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3181,7 +3181,7 @@
               int last_field;
             }; "#,
         )?;
-        let BindingsTokens { rs_api, .. } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, .. } = generate_bindings_tokens(ir)?;
         // TODO(b/200067824): Once nested structs anhd unions are supported,
         // `__unnamed_field1` and `__unnamed_field2` should have a real, usable
         // type.
@@ -3214,7 +3214,7 @@
     #[test]
     fn test_struct_from_other_target() -> Result<()> {
         let ir = ir_from_cc_dependency("// intentionally empty", "struct SomeStruct {};")?;
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_not_matches!(rs_api, quote! { SomeStruct });
         assert_cc_not_matches!(rs_api_impl, quote! { SomeStruct });
         Ok(())
@@ -3285,7 +3285,7 @@
             inline int* Deref(int*const* p);
         })?)?;
 
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3330,7 +3330,7 @@
             inline void f(const char *str);
         })?)?;
 
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3361,7 +3361,7 @@
     #[test]
     fn test_func_ptr_where_params_are_primitive_types() -> Result<()> {
         let ir = ir_from_cc(r#" int (*get_ptr_to_func())(float, double); "#)?;
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3401,7 +3401,7 @@
     #[test]
     fn test_func_ref() -> Result<()> {
         let ir = ir_from_cc(r#" int (&get_ref_to_func())(float, double); "#)?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3420,7 +3420,7 @@
             r#"
             int (* $a get_ptr_to_func())(float, double); "#,
         ))?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3434,7 +3434,7 @@
     #[test]
     fn test_func_ptr_where_params_are_raw_ptrs() -> Result<()> {
         let ir = ir_from_cc(r#" const int* (*get_ptr_to_func())(const int*); "#)?;
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3509,7 +3509,7 @@
             }
         );
 
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         // Check that the custom "vectorcall" ABI gets propagated into the
         // return type (i.e. into `extern "vectorcall" fn`).
         assert_rs_matches!(
@@ -3555,7 +3555,7 @@
             }
         "#,
         )?;
-        let rs_api_impl = generate_bindings_tokens(&ir)?.rs_api_impl;
+        let rs_api_impl = generate_bindings_tokens(ir)?.rs_api_impl;
         assert_cc_matches!(
             rs_api_impl,
             quote! {
@@ -3605,7 +3605,7 @@
         // This test is quite similar to `test_func_ptr_thunk` - the main
         // difference is verification of the `__attribute__((vectorcall))` in
         // the expected signature of the generated thunk below.
-        let rs_api_impl = generate_bindings_tokens(&ir)?.rs_api_impl;
+        let rs_api_impl = generate_bindings_tokens(ir)?.rs_api_impl;
         assert_cc_matches!(
             rs_api_impl,
             quote! {
@@ -3628,8 +3628,7 @@
              struct SecondStruct {};",
         )?;
 
-        let rs_api =
-            rs_tokens_to_formatted_string_for_tests(generate_bindings_tokens(&ir)?.rs_api)?;
+        let rs_api = rs_tokens_to_formatted_string_for_tests(generate_bindings_tokens(ir)?.rs_api)?;
 
         let idx = |s: &str| rs_api.find(s).ok_or_else(|| anyhow!("'{}' missing", s));
 
@@ -3659,7 +3658,7 @@
             struct Derived final : Base {__INT16_TYPE__ z;};
         "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3684,7 +3683,7 @@
             struct Derived final : Base1, Base2 {__INT16_TYPE__ z;};
         "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3709,7 +3708,7 @@
             struct Derived final : Base2 {__INT16_TYPE__ z;};
         "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3733,7 +3732,7 @@
             struct Derived final : Base {};
         "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3754,7 +3753,7 @@
             struct Derived final : Base {};
         "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3777,7 +3776,7 @@
             };
         "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3807,7 +3806,7 @@
             };
         "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3835,7 +3834,7 @@
             };
         "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3878,7 +3877,7 @@
             };
         "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3904,7 +3903,7 @@
             };
         "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3928,7 +3927,7 @@
             };
         "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3944,7 +3943,7 @@
     #[test]
     fn test_generate_enum_basic() -> Result<()> {
         let ir = ir_from_cc("enum Color { kRed = 5, kBlue };")?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -3973,7 +3972,7 @@
     #[test]
     fn test_generate_scoped_enum_basic() -> Result<()> {
         let ir = ir_from_cc("enum class Color { kRed = -5, kBlue };")?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -4004,7 +4003,7 @@
         let ir = ir_from_cc(
             "enum Color : long { kViolet = -9223372036854775807 - 1LL, kRed = -5, kBlue, kGreen = 3, kMagenta = 9223372036854775807 };",
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -4038,7 +4037,7 @@
         let ir = ir_from_cc(
             "enum Color: unsigned long { kRed, kBlue, kLimeGreen = 18446744073709551615 };",
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -4070,7 +4069,7 @@
         let ir = ir_from_cc(
             "enum Color { kViolet = -2147483647 - 1, kRed = -5, kBlue, kGreen = 3, kMagenta = 2147483647 };",
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -4102,7 +4101,7 @@
     #[test]
     fn test_generate_enum_with_32_bit_unsigned_vals() -> Result<()> {
         let ir = ir_from_cc("enum Color: unsigned int { kRed, kBlue, kLimeGreen = 4294967295 };")?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -4139,7 +4138,7 @@
         )?;
 
         assert_rs_matches!(
-            generate_bindings_tokens(&ir)?.rs_api,
+            generate_bindings_tokens(ir)?.rs_api,
             // leading space is intentional so there is a space between /// and the text of the
             // comment
             quote! {
@@ -4165,7 +4164,7 @@
         )?;
 
         assert_rs_matches!(
-            generate_bindings_tokens(&ir)?.rs_api,
+            generate_bindings_tokens(ir)?.rs_api,
             quote! {
                 #[doc = " Doc Comment\n \n  * with bullet"]
                 #[derive(Clone, Copy)]
@@ -4189,7 +4188,7 @@
             };
             "#,
         )?;
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
 
         assert_rs_matches!(
             rs_api,
@@ -4244,7 +4243,7 @@
               };
             "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
 
         assert_rs_matches!(
             rs_api,
@@ -4280,7 +4279,7 @@
             };
             "#,
         )?;
-        let BindingsTokens { rs_api, .. } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, .. } = generate_bindings_tokens(ir)?;
 
         assert_rs_not_matches!(rs_api, quote! { offset_of! });
         Ok(())
@@ -4298,7 +4297,7 @@
             };
             "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
 
         assert_rs_matches!(
             rs_api,
@@ -4346,7 +4345,7 @@
             };
             "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
 
         assert_rs_not_matches!(rs_api, quote! {derive ( ... Copy ... )});
         assert_rs_not_matches!(rs_api, quote! {derive ( ... Clone ... )});
@@ -4368,7 +4367,7 @@
             struct EmptyStruct final {};
             "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
 
         assert_rs_matches!(
             rs_api,
@@ -4399,7 +4398,7 @@
             union EmptyUnion {};
             "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
 
         assert_rs_matches!(
             rs_api,
@@ -4434,7 +4433,7 @@
             };
             "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
 
         assert_rs_matches!(
             rs_api,
@@ -4467,7 +4466,7 @@
             };
             "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
 
         assert_rs_matches!(
             rs_api,
@@ -4529,7 +4528,7 @@
         ",
             "",
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -4585,7 +4584,7 @@
         ",
             "",
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_not_matches!(
             rs_api,
             quote! { unsafe impl oops::Inherits<crate::Base> for Derived }
@@ -4598,7 +4597,7 @@
         let ir = ir_from_cc("struct Polymorphic { virtual void Foo(); };")?;
 
         assert_cc_matches!(
-            generate_bindings_tokens(&ir)?.rs_api_impl,
+            generate_bindings_tokens(ir)?.rs_api_impl,
             quote! {
                 extern "C" void __rust_thunk___ZN11Polymorphic3FooEv(class Polymorphic * __this)
             }
@@ -4614,7 +4613,7 @@
             double f_c_calling_convention(double p1, double p2);
         "#,
         )?;
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -4674,7 +4673,7 @@
     #[test]
     fn test_no_negative_impl_unpin() -> Result<()> {
         let ir = ir_from_cc("struct Trivial final {};")?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_not_matches!(rs_api, quote! {#[ctor::recursively_pinned]});
         Ok(())
     }
@@ -4684,7 +4683,7 @@
     #[test]
     fn test_negative_impl_unpin_nonfinal() -> Result<()> {
         let ir = ir_from_cc("struct Nonfinal {};")?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(rs_api, quote! {#[ctor::recursively_pinned]});
         Ok(())
     }
@@ -4694,7 +4693,7 @@
     #[test]
     fn test_no_impl_drop() -> Result<()> {
         let ir = ir_from_cc("struct Trivial {};")?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_not_matches!(rs_api, quote! {impl Drop});
         assert_rs_not_matches!(rs_api, quote! {impl ::ctor::PinnedDrop});
         Ok(())
@@ -4712,7 +4711,7 @@
                 NontrivialStruct nts;
             };"#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -4750,7 +4749,7 @@
                 int x;
             };"#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -4781,7 +4780,7 @@
                 int x;
             };"#,
         )?;
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_not_matches!(rs_api, quote! {impl Drop});
         assert_rs_not_matches!(rs_api, quote! {impl ::ctor::PinnedDrop});
         assert_rs_matches!(rs_api, quote! {pub x: i32});
@@ -4799,7 +4798,7 @@
                 DefaultedConstructor() = default;
             };"#,
         )?;
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -4867,7 +4866,7 @@
         // like this (note the mismatched 'a and 'b lifetimes):
         //     fn from<'b>(i: &'a i32) -> Self
         // After this CL, this scenario will result in an explicit error.
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_not_matches!(rs_api, quote! {impl From});
         let rs_api_str = tokens_to_string(rs_api)?;
         assert!(rs_api_str.contains(
@@ -4885,7 +4884,7 @@
                 ~NonTrivialStructWithConstructors();  // Non-trivial
             };"#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_not_matches!(rs_api, quote! {impl Default});
         Ok(())
     }
@@ -4898,7 +4897,7 @@
                 explicit SomeStruct(int i);
             };"#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         // As discussed in b/214020567 for now we only generate `From::from` bindings
         // for *implicit* C++ conversion constructors.
         assert_rs_not_matches!(rs_api, quote! {impl From});
@@ -4913,7 +4912,7 @@
                 SomeStruct(int i);  // implicit - no `explicit` keyword
             };"#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         // As discussed in b/214020567 we generate `From::from` bindings for
         // *implicit* C++ conversion constructors.
         assert_rs_matches!(
@@ -4943,7 +4942,7 @@
                 StructUnderTest(const SomeOtherStruct& other);  // implicit - no `explicit` keyword
             };"#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         // This is a regression test for b/223800038: We want to ensure that the
         // code says `impl<'b>` (instead of incorrectly declaring that lifetime
         // in `fn from<'b>`).
@@ -4974,8 +4973,7 @@
         // not For inherent methods.
         let ir = ir_from_cc("struct SomeStruct{SomeStruct& operator=(const SomeStruct&);};")?;
 
-        let rs_api =
-            rs_tokens_to_formatted_string_for_tests(generate_bindings_tokens(&ir)?.rs_api)?;
+        let rs_api = rs_tokens_to_formatted_string_for_tests(generate_bindings_tokens(ir)?.rs_api)?;
         assert!(rs_api.contains(
             "// Error while generating bindings for item 'SomeStruct::operator=':\n\
              // `self` has no lifetime. Use lifetime annotations or \
@@ -4995,7 +4993,7 @@
                 int i;
             };"#,
         )?;
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -5028,7 +5026,7 @@
                 return lhs.i == rhs.i;
             }"#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -5052,7 +5050,7 @@
                 SomeStruct& operator=(const SomeStruct& other);
             };"#,
         )?;
-        let BindingsTokens { rs_api, .. } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, .. } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -5078,7 +5076,7 @@
                 SomeStruct& operator=(int other);
             };"#,
         )?;
-        let BindingsTokens { rs_api, .. } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, .. } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -5104,7 +5102,7 @@
                 int operator=(const SomeStruct& other);
             };"#,
         )?;
-        let BindingsTokens { rs_api, .. } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, .. } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -5129,7 +5127,7 @@
                 bool operator==(const SomeStruct& other) /* no `const` here */;
             };"#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_not_matches!(rs_api, quote! {impl PartialEq});
         Ok(())
     }
@@ -5142,7 +5140,7 @@
                 bool operator==(SomeStruct other) const;
             };"#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_not_matches!(rs_api, quote! {impl PartialEq});
         Ok(())
     }
@@ -5178,7 +5176,7 @@
             int& f(int& i);
           };"#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -5202,7 +5200,7 @@
           int& $a f(int& $a i1, int& $a i2);
           "#,
         ))?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -5266,7 +5264,7 @@
                 };
             "#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         let rs_api_str = tokens_to_string(rs_api.clone())?;
 
         // Cannot overload free functions.
@@ -5305,7 +5303,7 @@
                 inline void f(MyTypedefDecl t) {}
             "#,
         )?;
-        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(&ir)?;
+        let BindingsTokens { rs_api, rs_api_impl } = generate_bindings_tokens(ir)?;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -5549,7 +5547,7 @@
     #[test]
     fn test_rust_keywords_are_escaped_in_rs_api_file() -> Result<()> {
         let ir = ir_from_cc("struct type { int dyn; };")?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(rs_api, quote! { struct r#type { ... r#dyn: i32 ... } });
         Ok(())
     }
@@ -5557,7 +5555,7 @@
     #[test]
     fn test_rust_keywords_are_not_escaped_in_rs_api_impl_file() -> Result<()> {
         let ir = ir_from_cc("struct type { int dyn; };")?;
-        let rs_api_impl = generate_bindings_tokens(&ir)?.rs_api_impl;
+        let rs_api_impl = generate_bindings_tokens(ir)?.rs_api_impl;
         assert_cc_matches!(
             rs_api_impl,
             quote! { static_assert(CRUBIT_OFFSET_OF(dyn, class type) ... ) }
@@ -5568,7 +5566,7 @@
     #[test]
     fn test_no_aligned_attr() {
         let ir = ir_from_cc("struct SomeStruct {};").unwrap();
-        let rs_api = generate_bindings_tokens(&ir).unwrap().rs_api;
+        let rs_api = generate_bindings_tokens(ir).unwrap().rs_api;
 
         assert_rs_matches! {rs_api, quote! {
          #[repr(C)]
@@ -5579,7 +5577,7 @@
     #[test]
     fn test_aligned_attr() {
         let ir = ir_from_cc("struct SomeStruct {} __attribute__((aligned(64)));").unwrap();
-        let rs_api = generate_bindings_tokens(&ir).unwrap().rs_api;
+        let rs_api = generate_bindings_tokens(ir).unwrap().rs_api;
 
         assert_rs_matches! {rs_api, quote! {
            #[repr(C, align(64))]
@@ -5591,7 +5589,7 @@
     /// !Unpin references should not be pinned.
     #[test]
     fn test_nonunpin_ref_param() -> Result<()> {
-        let rs_api = generate_bindings_tokens(&ir_from_cc(
+        let rs_api = generate_bindings_tokens(ir_from_cc(
             r#"
             #pragma clang lifetime_elision
             struct S {~S();};
@@ -5611,7 +5609,7 @@
     /// !Unpin mut references must be pinned.
     #[test]
     fn test_nonunpin_mut_param() -> Result<()> {
-        let rs_api = generate_bindings_tokens(&ir_from_cc(
+        let rs_api = generate_bindings_tokens(ir_from_cc(
             r#"
             #pragma clang lifetime_elision
             struct S {~S();};
@@ -5631,7 +5629,7 @@
     /// !Unpin &self should not be pinned.
     #[test]
     fn test_nonunpin_ref_self() -> Result<()> {
-        let rs_api = generate_bindings_tokens(&ir_from_cc(
+        let rs_api = generate_bindings_tokens(ir_from_cc(
             r#"
             #pragma clang lifetime_elision
             struct S {
@@ -5653,7 +5651,7 @@
     /// !Unpin &mut self must be pinned.
     #[test]
     fn test_nonunpin_mut_self() -> Result<()> {
-        let rs_api = generate_bindings_tokens(&ir_from_cc(
+        let rs_api = generate_bindings_tokens(ir_from_cc(
             r#"
             #pragma clang lifetime_elision
             struct S {
@@ -5675,7 +5673,7 @@
     /// Drop::drop must not use self : Pin<...>.
     #[test]
     fn test_nonunpin_drop() -> Result<()> {
-        let rs_api = generate_bindings_tokens(&ir_from_cc(
+        let rs_api = generate_bindings_tokens(ir_from_cc(
             r#"
             struct S {~S();};
         "#,
@@ -5697,7 +5695,7 @@
             // This type must be `!Unpin`.
             struct HasConstructor {explicit HasConstructor() {}};"#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(rs_api, quote! {#[ctor::recursively_pinned]});
         assert_rs_matches!(
             rs_api,
@@ -5727,7 +5725,7 @@
             // This type must be `!Unpin`.
             struct HasConstructor {explicit HasConstructor(unsigned char input) {}};"#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(rs_api, quote! {#[ctor::recursively_pinned]});
         assert_rs_matches!(
             rs_api,
@@ -5757,7 +5755,7 @@
             // This type must be `!Unpin`.
             struct HasConstructor {explicit HasConstructor(unsigned char input1, signed char input2) {}};"#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(rs_api, quote! {#[ctor::recursively_pinned]});
         assert_rs_matches!(
             rs_api,
@@ -5786,7 +5784,7 @@
             r#"#pragma clang lifetime_elision
             struct ForwardDeclared;"#,
         )?;
-        let rs_api = generate_bindings_tokens(&ir)?.rs_api;
+        let rs_api = generate_bindings_tokens(ir)?.rs_api;
         assert_rs_matches!(
             rs_api,
             quote! {
@@ -5799,7 +5797,7 @@
 
     #[test]
     fn test_namespace_module_items() -> Result<()> {
-        let rs_api = generate_bindings_tokens(&ir_from_cc(
+        let rs_api = generate_bindings_tokens(ir_from_cc(
             r#"
             namespace test_namespace_bindings {
                 int func();
@@ -5837,7 +5835,7 @@
 
     #[test]
     fn test_detail_outside_of_namespace_module() -> Result<()> {
-        let rs_api = generate_bindings_tokens(&ir_from_cc(
+        let rs_api = generate_bindings_tokens(ir_from_cc(
             r#"
             namespace test_namespace_bindings {
                 int f();
@@ -5868,7 +5866,7 @@
 
     #[test]
     fn test_assertions_outside_of_namespace_module() -> Result<()> {
-        let rs_api = generate_bindings_tokens(&ir_from_cc(
+        let rs_api = generate_bindings_tokens(ir_from_cc(
             r#"
             namespace test_namespace_bindings {
                 struct S {
@@ -5896,7 +5894,7 @@
 
     #[test]
     fn test_reopened_namespaces() -> Result<()> {
-        let rs_api = generate_bindings_tokens(&ir_from_cc(
+        let rs_api = generate_bindings_tokens(ir_from_cc(
             r#"
         namespace test_namespace_bindings {
         namespace inner {}
@@ -5932,7 +5930,7 @@
 
     #[test]
     fn test_qualified_identifiers_in_impl_file() -> Result<()> {
-        let rs_api_impl = generate_bindings_tokens(&ir_from_cc(
+        let rs_api_impl = generate_bindings_tokens(ir_from_cc(
             r#"
         namespace test_namespace_bindings {
             inline void f() {};
@@ -5962,7 +5960,7 @@
 
     #[test]
     fn test_inline_namespace() -> Result<()> {
-        let rs_api = generate_bindings_tokens(&ir_from_cc(
+        let rs_api = generate_bindings_tokens(ir_from_cc(
             r#"
             namespace test_namespace_bindings {
                 inline namespace inner {
@@ -6002,7 +6000,7 @@
 
     #[test]
     fn test_implicit_template_specializations_are_sorted_by_mangled_name() -> Result<()> {
-        let bindings = generate_bindings_tokens(&ir_from_cc(
+        let bindings = generate_bindings_tokens(ir_from_cc(
             r#"
                 template <typename T>
                 struct MyStruct {
@@ -6075,7 +6073,7 @@
 
     #[test]
     fn test_implicit_template_specialization_namespace_qualifier() -> Result<()> {
-        let rs_api = generate_bindings_tokens(&ir_from_cc(
+        let rs_api = generate_bindings_tokens(ir_from_cc(
             r#" #pragma clang lifetime_elision
                 namespace test_namespace_bindings {
                     template <typename T>
@@ -6109,7 +6107,7 @@
 
     #[test]
     fn test_forward_declared_class_template_specialization_symbol() -> Result<()> {
-        let rs_api = generate_bindings_tokens(&ir_from_cc(
+        let rs_api = generate_bindings_tokens(ir_from_cc(
             r#"
             namespace test_namespace_bindings {
               template <typename T>