Allow `generate_func` to emit comments for unsupported items / functions.

PiperOrigin-RevId: 426513920
diff --git a/rs_bindings_from_cc/src_code_gen.rs b/rs_bindings_from_cc/src_code_gen.rs
index 38f9e4f..a4972e2 100644
--- a/rs_bindings_from_cc/src_code_gen.rs
+++ b/rs_bindings_from_cc/src_code_gen.rs
@@ -88,6 +88,7 @@
 ///   tokens: quote!{vec![].into_raw_parts()},
 /// }
 /// ```
+#[derive(Clone, Debug)]
 struct RsSnippet {
     /// Rust feature flags used by this snippet.
     features: BTreeSet<Ident>,
@@ -148,7 +149,7 @@
 }
 
 /// Uniquely identifies a generated Rust function.
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
 struct FunctionId {
     // If the function is on a trait impl, contains the name of the Self type for
     // which the trait is being implemented.
@@ -174,7 +175,7 @@
             format!("~{}", record.expect("destructor must be associated with a record"))
         }
         UnqualifiedIdentifier::Constructor => {
-            format!("~{}", record.expect("constructor must be associated with a record"))
+            record.expect("constructor must be associated with a record").to_string()
         }
     };
 
@@ -185,14 +186,27 @@
     }
 }
 
+fn make_unsupported_fn(func: &Func, ir: &IR, message: impl ToString) -> Result<UnsupportedItem> {
+    Ok(UnsupportedItem {
+        name: cxx_function_name(func, ir)?,
+        message: message.to_string(),
+        source_loc: func.source_loc.clone(),
+    })
+}
+
+#[derive(Clone, Debug)]
+enum GeneratedFunc {
+    None, // No explicit function needed (e.g. when deriving Drop).
+    Unsupported(UnsupportedItem),
+    Some { api_func: RsSnippet, thunk: RsSnippet, function_id: FunctionId },
+}
+
 /// Generates Rust source code for a given `Func`.
-///
-/// Returns None if no code was generated for the function; otherwise, returns
-/// a tuple containing:
-/// - The generated function or trait impl
-/// - The thunk
-/// - A `FunctionId` identifying the generated Rust function
-fn generate_func(func: &Func, ir: &IR) -> Result<Option<(RsSnippet, RsSnippet, FunctionId)>> {
+fn generate_func(func: &Func, ir: &IR) -> Result<GeneratedFunc> {
+    let make_unsupported_result = |msg: &str| -> Result<GeneratedFunc> {
+        Ok(GeneratedFunc::Unsupported(make_unsupported_fn(func, ir, msg)?))
+    };
+
     let mangled_name = &func.mangled_name;
     let thunk_ident = thunk_ident(func);
     let doc_comment = generate_doc_comment(&func.doc_comment);
@@ -248,18 +262,13 @@
     let format_first_param_as_self: bool;
     match &func.name {
         UnqualifiedIdentifier::Identifier(id) if id.identifier == "operator==" => {
-            match (param_type_kinds.get(0), param_type_kinds.get(1)) {
+            if param_type_kinds.len() != 2 {
+                bail!("Unexpected number of parameters in operator==: {:?}", func);
+            }
+            match (&param_type_kinds[0], &param_type_kinds[1]) {
                 (
-                    Some(RsTypeKind::Reference {
-                        referent: lhs,
-                        mutability: Mutability::Const,
-                        ..
-                    }),
-                    Some(RsTypeKind::Reference {
-                        referent: rhs,
-                        mutability: Mutability::Const,
-                        ..
-                    }),
+                    RsTypeKind::Reference { referent: lhs, mutability: Mutability::Const, .. },
+                    RsTypeKind::Reference { referent: rhs, mutability: Mutability::Const, .. },
                 ) => match **lhs {
                     RsTypeKind::Record(lhs_record) => {
                         let lhs: Ident = make_rs_ident(&lhs_record.identifier.identifier);
@@ -271,13 +280,13 @@
                             record_name: lhs,
                         };
                     }
-                    _ => return Ok(None),
+                    _ => return make_unsupported_result("operator== where lhs doesn't refer to a record"),
                 },
-                _ => return Ok(None),
+                _ => return make_unsupported_result("operator== where operands are not const references"),
             };
         }
         UnqualifiedIdentifier::Identifier(id) if id.identifier.starts_with("operator") => {
-            return Ok(None);
+            return make_unsupported_result("Bindings for this kind of operator are not supported");
         }
         UnqualifiedIdentifier::Identifier(id) => {
             func_name = make_rs_ident(&id.identifier);
@@ -305,7 +314,7 @@
             let record =
                 maybe_record.ok_or_else(|| anyhow!("Destructors must be member functions."))?;
             if !should_implement_drop(record) {
-                return Ok(None);
+                return Ok(GeneratedFunc::None);
             }
             let record_name = maybe_record_name
                 .clone()
@@ -329,12 +338,17 @@
 
             if !record.is_unpin() {
                 // TODO: Handle <internal link>
-                return Ok(None);
+                return make_unsupported_result(
+                    "Bindings for constructors of non-trivial types are not supported yet",
+                );
             }
             if is_unsafe {
                 // TODO(b/216648347): Allow this outside of traits (e.g. after supporting
                 // translating C++ constructors into static methods in Rust).
-                return Ok(None);
+                return make_unsupported_result(
+                    "Unsafe constructors (e.g. with no elided or explicit lifetimes) \
+                    are intentionally not supported",
+                );
             }
 
             let record_name = maybe_record_name
@@ -352,7 +366,7 @@
                     if param_type_kinds[1].is_shared_ref_to(record) {
                         // Copy constructor
                         if should_derive_clone(record) {
-                            return Ok(None);
+                            return Ok(GeneratedFunc::None);
                         } else {
                             impl_kind = ImplKind::Trait { trait_name: quote! {Clone}, record_name };
                             func_name = make_rs_ident("clone");
@@ -367,12 +381,12 @@
                         func_name = make_rs_ident("from");
                         format_first_param_as_self = false;
                     } else {
-                        return Ok(None);
+                        return make_unsupported_result("Not yet supported type of constructor parameter");
                     }
                 }
                 _ => {
                     // TODO(b/216648347): Support bindings for other constructors.
-                    return Ok(None);
+                    return make_unsupported_result("More than 1 constructor parameter is not supported yet");
                 }
             }
         }
@@ -556,7 +570,7 @@
         }
     };
 
-    Ok(Some((api_func.into(), thunk.into(), function_id)))
+    Ok(GeneratedFunc::Some { api_func: api_func.into(), thunk: thunk.into(), function_id })
 }
 
 fn generate_doc_comment(comment: &Option<String>) -> TokenStream {
@@ -856,7 +870,7 @@
     let mut seen_funcs = HashSet::new();
     let mut overloaded_funcs = HashSet::new();
     for func in ir.functions() {
-        if let Some((_, _, function_id)) = generate_func(func, ir)? {
+        if let GeneratedFunc::Some { function_id, .. } = generate_func(func, ir)? {
             if !seen_funcs.insert(function_id.clone()) {
                 overloaded_funcs.insert(function_id);
             }
@@ -865,22 +879,26 @@
 
     for item in ir.items() {
         match item {
-            Item::Func(func) => {
-                if let Some((snippet, thunk, function_id)) = generate_func(func, ir)? {
+            Item::Func(func) => match generate_func(func, ir)? {
+                GeneratedFunc::None => (),
+                GeneratedFunc::Unsupported(unsupported) => {
+                    items.push(generate_unsupported(&unsupported)?)
+                }
+                GeneratedFunc::Some { api_func, thunk, function_id } => {
                     if overloaded_funcs.contains(&function_id) {
-                        items.push(generate_unsupported(&UnsupportedItem {
-                            name: cxx_function_name(func, ir)?,
-                            message: "Cannot generate bindings for overloaded function".to_string(),
-                            source_loc: func.source_loc.clone(),
-                        })?);
+                        items.push(generate_unsupported(&make_unsupported_fn(
+                            func,
+                            ir,
+                            "Cannot generate bindings for overloaded function",
+                        )?)?);
                         continue;
                     }
-                    features.extend(snippet.features);
+                    features.extend(api_func.features);
                     features.extend(thunk.features);
-                    items.push(snippet.tokens);
+                    items.push(api_func.tokens);
                     thunks.push(thunk.tokens);
                 }
-            }
+            },
             Item::Record(record) => {
                 if !ir.is_current_target(&record.owning_target)
                     && !ir.is_stdlib_target(&record.owning_target)
diff --git a/rs_bindings_from_cc/test/golden/comment_rs_api.rs b/rs_bindings_from_cc/test/golden/comment_rs_api.rs
index dc02fca..02c5d0d 100644
--- a/rs_bindings_from_cc/test/golden/comment_rs_api.rs
+++ b/rs_bindings_from_cc/test/golden/comment_rs_api.rs
@@ -44,6 +44,10 @@
 
 // rs_bindings_from_cc/test/golden/comment.h;l=13
 // Error while generating bindings for item 'Foo::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/comment.h;l=13
+// Error while generating bindings for item 'Foo::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct Foo &&'
 
 // b
@@ -82,6 +86,10 @@
 
 // rs_bindings_from_cc/test/golden/comment.h;l=39
 // Error while generating bindings for item 'Bar::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/comment.h;l=39
+// Error while generating bindings for item 'Bar::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct Bar &&'
 
 /// d
@@ -108,6 +116,10 @@
 
 // rs_bindings_from_cc/test/golden/comment.h;l=45
 // Error while generating bindings for item 'HasNoComments::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/comment.h;l=45
+// Error while generating bindings for item 'HasNoComments::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct HasNoComments &&'
 
 // e
diff --git a/rs_bindings_from_cc/test/golden/doc_comment_rs_api.rs b/rs_bindings_from_cc/test/golden/doc_comment_rs_api.rs
index f55785a..c12030d 100644
--- a/rs_bindings_from_cc/test/golden/doc_comment_rs_api.rs
+++ b/rs_bindings_from_cc/test/golden/doc_comment_rs_api.rs
@@ -27,6 +27,10 @@
 
 // rs_bindings_from_cc/test/golden/doc_comment.h;l=9
 // Error while generating bindings for item 'DocCommentSlashes::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/doc_comment.h;l=9
+// Error while generating bindings for item 'DocCommentSlashes::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct DocCommentSlashes &&'
 
 /// The default constructor which will get translated into
@@ -108,6 +112,10 @@
 
 // rs_bindings_from_cc/test/golden/doc_comment.h;l=35
 // Error while generating bindings for item 'DocCommentBang::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/doc_comment.h;l=35
+// Error while generating bindings for item 'DocCommentBang::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct DocCommentBang &&'
 
 /// Multiline comment
@@ -137,6 +145,10 @@
 
 // rs_bindings_from_cc/test/golden/doc_comment.h;l=43
 // Error while generating bindings for item 'MultilineCommentTwoStars::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/doc_comment.h;l=43
+// Error while generating bindings for item 'MultilineCommentTwoStars::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct MultilineCommentTwoStars &&'
 
 /// Line comment
@@ -166,6 +178,10 @@
 
 // rs_bindings_from_cc/test/golden/doc_comment.h;l=51
 // Error while generating bindings for item 'LineComment::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/doc_comment.h;l=51
+// Error while generating bindings for item 'LineComment::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct LineComment &&'
 
 /// Multiline comment
@@ -195,6 +211,10 @@
 
 // rs_bindings_from_cc/test/golden/doc_comment.h;l=59
 // Error while generating bindings for item 'MultilineOneStar::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/doc_comment.h;l=59
+// Error while generating bindings for item 'MultilineOneStar::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct MultilineOneStar &&'
 
 /// A function
diff --git a/rs_bindings_from_cc/test/golden/escaping_keywords_rs_api.rs b/rs_bindings_from_cc/test/golden/escaping_keywords_rs_api.rs
index 23872be..0a0a775 100644
--- a/rs_bindings_from_cc/test/golden/escaping_keywords_rs_api.rs
+++ b/rs_bindings_from_cc/test/golden/escaping_keywords_rs_api.rs
@@ -34,6 +34,10 @@
 
 // rs_bindings_from_cc/test/golden/escaping_keywords.h;l=6
 // Error while generating bindings for item 'type::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/escaping_keywords.h;l=6
+// Error while generating bindings for item 'type::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct type &&'
 
 #[inline(always)]
diff --git a/rs_bindings_from_cc/test/golden/inheritance_rs_api.rs b/rs_bindings_from_cc/test/golden/inheritance_rs_api.rs
index 7358dcf..3f8417f 100644
--- a/rs_bindings_from_cc/test/golden/inheritance_rs_api.rs
+++ b/rs_bindings_from_cc/test/golden/inheritance_rs_api.rs
@@ -24,10 +24,22 @@
 
 // rs_bindings_from_cc/test/golden/inheritance.h;l=9
 // Error while generating bindings for item 'Base0::Base0':
+// Bindings for constructors of non-trivial types are not supported yet
+
+// rs_bindings_from_cc/test/golden/inheritance.h;l=9
+// Error while generating bindings for item 'Base0::Base0':
+// Bindings for constructors of non-trivial types are not supported yet
+
+// rs_bindings_from_cc/test/golden/inheritance.h;l=9
+// Error while generating bindings for item 'Base0::Base0':
 // Parameter #0 is not supported: Unsupported type 'class Base0 &&'
 
 // rs_bindings_from_cc/test/golden/inheritance.h;l=9
 // Error while generating bindings for item 'Base0::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/inheritance.h;l=9
+// Error while generating bindings for item 'Base0::operator=':
 // Parameter #0 is not supported: Unsupported type 'class Base0 &&'
 
 #[repr(C)]
@@ -40,10 +52,22 @@
 
 // rs_bindings_from_cc/test/golden/inheritance.h;l=10
 // Error while generating bindings for item 'Base1::Base1':
+// Bindings for constructors of non-trivial types are not supported yet
+
+// rs_bindings_from_cc/test/golden/inheritance.h;l=10
+// Error while generating bindings for item 'Base1::Base1':
+// Bindings for constructors of non-trivial types are not supported yet
+
+// rs_bindings_from_cc/test/golden/inheritance.h;l=10
+// Error while generating bindings for item 'Base1::Base1':
 // Parameter #0 is not supported: Unsupported type 'class Base1 &&'
 
 // rs_bindings_from_cc/test/golden/inheritance.h;l=10
 // Error while generating bindings for item 'Base1::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/inheritance.h;l=10
+// Error while generating bindings for item 'Base1::operator=':
 // Parameter #0 is not supported: Unsupported type 'class Base1 &&'
 
 #[repr(C)]
@@ -55,10 +79,22 @@
 
 // rs_bindings_from_cc/test/golden/inheritance.h;l=15
 // Error while generating bindings for item 'Base2::Base2':
+// Bindings for constructors of non-trivial types are not supported yet
+
+// rs_bindings_from_cc/test/golden/inheritance.h;l=15
+// Error while generating bindings for item 'Base2::Base2':
+// Bindings for constructors of non-trivial types are not supported yet
+
+// rs_bindings_from_cc/test/golden/inheritance.h;l=15
+// Error while generating bindings for item 'Base2::Base2':
 // Parameter #0 is not supported: Unsupported type 'class Base2 &&'
 
 // rs_bindings_from_cc/test/golden/inheritance.h;l=15
 // Error while generating bindings for item 'Base2::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/inheritance.h;l=15
+// Error while generating bindings for item 'Base2::operator=':
 // Parameter #0 is not supported: Unsupported type 'class Base2 &&'
 
 #[derive(Clone, Copy)]
@@ -85,10 +121,22 @@
 
 // rs_bindings_from_cc/test/golden/inheritance.h;l=19
 // Error while generating bindings for item 'Derived::Derived':
+// Unsafe constructors (e.g. with no elided or explicit lifetimes) are intentionally not supported
+
+// rs_bindings_from_cc/test/golden/inheritance.h;l=19
+// Error while generating bindings for item 'Derived::Derived':
+// Unsafe constructors (e.g. with no elided or explicit lifetimes) are intentionally not supported
+
+// rs_bindings_from_cc/test/golden/inheritance.h;l=19
+// Error while generating bindings for item 'Derived::Derived':
 // Parameter #0 is not supported: Unsupported type 'struct Derived &&'
 
 // rs_bindings_from_cc/test/golden/inheritance.h;l=19
 // Error while generating bindings for item 'Derived::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/inheritance.h;l=19
+// Error while generating bindings for item 'Derived::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct Derived &&'
 
 // CRUBIT_RS_BINDINGS_FROM_CC_TEST_GOLDEN_INHERITANCE_H_
diff --git a/rs_bindings_from_cc/test/golden/item_order_rs_api.rs b/rs_bindings_from_cc/test/golden/item_order_rs_api.rs
index 4d59b5c..3f5e92f 100644
--- a/rs_bindings_from_cc/test/golden/item_order_rs_api.rs
+++ b/rs_bindings_from_cc/test/golden/item_order_rs_api.rs
@@ -34,6 +34,10 @@
 
 // rs_bindings_from_cc/test/golden/item_order.h;l=6
 // Error while generating bindings for item 'FirstStruct::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/item_order.h;l=6
+// Error while generating bindings for item 'FirstStruct::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct FirstStruct &&'
 
 #[inline(always)]
@@ -64,6 +68,10 @@
 
 // rs_bindings_from_cc/test/golden/item_order.h;l=12
 // Error while generating bindings for item 'SecondStruct::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/item_order.h;l=12
+// Error while generating bindings for item 'SecondStruct::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct SecondStruct &&'
 
 #[inline(always)]
diff --git a/rs_bindings_from_cc/test/golden/no_elided_lifetimes_rs_api.rs b/rs_bindings_from_cc/test/golden/no_elided_lifetimes_rs_api.rs
index 7f10548..ac54534 100644
--- a/rs_bindings_from_cc/test/golden/no_elided_lifetimes_rs_api.rs
+++ b/rs_bindings_from_cc/test/golden/no_elided_lifetimes_rs_api.rs
@@ -25,10 +25,22 @@
 
 // rs_bindings_from_cc/test/golden/no_elided_lifetimes.h;l=6
 // Error while generating bindings for item 'S::S':
+// Unsafe constructors (e.g. with no elided or explicit lifetimes) are intentionally not supported
+
+// rs_bindings_from_cc/test/golden/no_elided_lifetimes.h;l=6
+// Error while generating bindings for item 'S::S':
+// Unsafe constructors (e.g. with no elided or explicit lifetimes) are intentionally not supported
+
+// rs_bindings_from_cc/test/golden/no_elided_lifetimes.h;l=6
+// Error while generating bindings for item 'S::S':
 // Parameter #0 is not supported: Unsupported type 'struct S &&'
 
 // rs_bindings_from_cc/test/golden/no_elided_lifetimes.h;l=6
 // Error while generating bindings for item 'S::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/no_elided_lifetimes.h;l=6
+// Error while generating bindings for item 'S::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct S &&'
 
 impl S {
diff --git a/rs_bindings_from_cc/test/golden/polymorphic_rs_api.rs b/rs_bindings_from_cc/test/golden/polymorphic_rs_api.rs
index d24d92a..3315b49 100644
--- a/rs_bindings_from_cc/test/golden/polymorphic_rs_api.rs
+++ b/rs_bindings_from_cc/test/golden/polymorphic_rs_api.rs
@@ -19,6 +19,18 @@
 
 impl !Unpin for PolymorphicClass {}
 
+// rs_bindings_from_cc/test/golden/polymorphic.h;l=6
+// Error while generating bindings for item 'PolymorphicClass::PolymorphicClass':
+// Bindings for constructors of non-trivial types are not supported yet
+
+// rs_bindings_from_cc/test/golden/polymorphic.h;l=6
+// Error while generating bindings for item 'PolymorphicClass::PolymorphicClass':
+// Bindings for constructors of non-trivial types are not supported yet
+
+// rs_bindings_from_cc/test/golden/polymorphic.h;l=6
+// Error while generating bindings for item 'PolymorphicClass::operator=':
+// Bindings for this kind of operator are not supported
+
 impl Drop for PolymorphicClass {
     #[inline(always)]
     fn drop<'a>(&'a mut self) {
diff --git a/rs_bindings_from_cc/test/golden/private_members_rs_api.rs b/rs_bindings_from_cc/test/golden/private_members_rs_api.rs
index 558afd6..4610fa7 100644
--- a/rs_bindings_from_cc/test/golden/private_members_rs_api.rs
+++ b/rs_bindings_from_cc/test/golden/private_members_rs_api.rs
@@ -35,6 +35,10 @@
 
 // rs_bindings_from_cc/test/golden/private_members.h;l=6
 // Error while generating bindings for item 'SomeClass::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/private_members.h;l=6
+// Error while generating bindings for item 'SomeClass::operator=':
 // Parameter #0 is not supported: Unsupported type 'class SomeClass &&'
 
 impl SomeClass {
diff --git a/rs_bindings_from_cc/test/golden/static_methods_rs_api.rs b/rs_bindings_from_cc/test/golden/static_methods_rs_api.rs
index 2d0c500..d58a8e4 100644
--- a/rs_bindings_from_cc/test/golden/static_methods_rs_api.rs
+++ b/rs_bindings_from_cc/test/golden/static_methods_rs_api.rs
@@ -34,6 +34,10 @@
 
 // rs_bindings_from_cc/test/golden/static_methods.h;l=6
 // Error while generating bindings for item 'SomeClass::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/static_methods.h;l=6
+// Error while generating bindings for item 'SomeClass::operator=':
 // Parameter #0 is not supported: Unsupported type 'class SomeClass &&'
 
 impl SomeClass {
diff --git a/rs_bindings_from_cc/test/golden/trivial_type_rs_api.rs b/rs_bindings_from_cc/test/golden/trivial_type_rs_api.rs
index b4e1fda..578b966 100644
--- a/rs_bindings_from_cc/test/golden/trivial_type_rs_api.rs
+++ b/rs_bindings_from_cc/test/golden/trivial_type_rs_api.rs
@@ -36,6 +36,10 @@
 
 // rs_bindings_from_cc/test/golden/trivial_type.h;l=8
 // Error while generating bindings for item 'Trivial::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/trivial_type.h;l=8
+// Error while generating bindings for item 'Trivial::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct Trivial &&'
 
 /// Defaulted special member functions are trivial on a struct with only trivial
@@ -57,6 +61,10 @@
     }
 }
 
+// rs_bindings_from_cc/test/golden/trivial_type.h;l=18
+// Error while generating bindings for item 'TrivialWithDefaulted::operator=':
+// Bindings for this kind of operator are not supported
+
 // rs_bindings_from_cc/test/golden/trivial_type.h;l=19
 // Error while generating bindings for item 'TrivialWithDefaulted::TrivialWithDefaulted':
 // Parameter #0 is not supported: Unsupported type 'struct TrivialWithDefaulted &&'
@@ -76,10 +84,22 @@
 
 // rs_bindings_from_cc/test/golden/trivial_type.h;l=29
 // Error while generating bindings for item 'TrivialNonfinal::TrivialNonfinal':
+// Bindings for constructors of non-trivial types are not supported yet
+
+// rs_bindings_from_cc/test/golden/trivial_type.h;l=29
+// Error while generating bindings for item 'TrivialNonfinal::TrivialNonfinal':
+// Bindings for constructors of non-trivial types are not supported yet
+
+// rs_bindings_from_cc/test/golden/trivial_type.h;l=29
+// Error while generating bindings for item 'TrivialNonfinal::TrivialNonfinal':
 // Parameter #0 is not supported: Unsupported type 'struct TrivialNonfinal &&'
 
 // rs_bindings_from_cc/test/golden/trivial_type.h;l=29
 // Error while generating bindings for item 'TrivialNonfinal::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/trivial_type.h;l=29
+// Error while generating bindings for item 'TrivialNonfinal::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct TrivialNonfinal &&'
 
 #[inline(always)]
diff --git a/rs_bindings_from_cc/test/golden/types_rs_api.rs b/rs_bindings_from_cc/test/golden/types_rs_api.rs
index 8a04edc..9901ef1 100644
--- a/rs_bindings_from_cc/test/golden/types_rs_api.rs
+++ b/rs_bindings_from_cc/test/golden/types_rs_api.rs
@@ -35,6 +35,10 @@
 
 // rs_bindings_from_cc/test/golden/types.h;l=9
 // Error while generating bindings for item 'SomeStruct::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/types.h;l=9
+// Error while generating bindings for item 'SomeStruct::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct SomeStruct &&'
 
 // rs_bindings_from_cc/test/golden/types.h;l=11
diff --git a/rs_bindings_from_cc/test/golden/unsupported_rs_api.rs b/rs_bindings_from_cc/test/golden/unsupported_rs_api.rs
index 37d5228..90ac12f 100644
--- a/rs_bindings_from_cc/test/golden/unsupported_rs_api.rs
+++ b/rs_bindings_from_cc/test/golden/unsupported_rs_api.rs
@@ -76,6 +76,10 @@
 
 // rs_bindings_from_cc/test/golden/unsupported.h;l=26
 // Error while generating bindings for item 'ContainingStruct::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/unsupported.h;l=26
+// Error while generating bindings for item 'ContainingStruct::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct ContainingStruct &&'
 
 // rs_bindings_from_cc/test/golden/unsupported.h;l=27
diff --git a/rs_bindings_from_cc/test/golden/user_of_base_class_rs_api.rs b/rs_bindings_from_cc/test/golden/user_of_base_class_rs_api.rs
index 28241d1..cbdc6df 100644
--- a/rs_bindings_from_cc/test/golden/user_of_base_class_rs_api.rs
+++ b/rs_bindings_from_cc/test/golden/user_of_base_class_rs_api.rs
@@ -40,10 +40,22 @@
 
 // rs_bindings_from_cc/test/golden/user_of_base_class.h;l=11
 // Error while generating bindings for item 'Derived2::Derived2':
+// Unsafe constructors (e.g. with no elided or explicit lifetimes) are intentionally not supported
+
+// rs_bindings_from_cc/test/golden/user_of_base_class.h;l=11
+// Error while generating bindings for item 'Derived2::Derived2':
+// Unsafe constructors (e.g. with no elided or explicit lifetimes) are intentionally not supported
+
+// rs_bindings_from_cc/test/golden/user_of_base_class.h;l=11
+// Error while generating bindings for item 'Derived2::Derived2':
 // Parameter #0 is not supported: Unsupported type 'struct Derived2 &&'
 
 // rs_bindings_from_cc/test/golden/user_of_base_class.h;l=11
 // Error while generating bindings for item 'Derived2::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/user_of_base_class.h;l=11
+// Error while generating bindings for item 'Derived2::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct Derived2 &&'
 
 // CRUBIT_RS_BINDINGS_FROM_CC_TEST_GOLDEN_USER_OF_BASE_CLASS_H_
diff --git a/rs_bindings_from_cc/test/golden/user_of_imported_type_rs_api.rs b/rs_bindings_from_cc/test/golden/user_of_imported_type_rs_api.rs
index 7ee1c32..b1ae42c 100644
--- a/rs_bindings_from_cc/test/golden/user_of_imported_type_rs_api.rs
+++ b/rs_bindings_from_cc/test/golden/user_of_imported_type_rs_api.rs
@@ -39,6 +39,10 @@
 
 // rs_bindings_from_cc/test/golden/user_of_imported_type.h;l=10
 // Error while generating bindings for item 'UserOfImportedType::operator=':
+// Bindings for this kind of operator are not supported
+
+// rs_bindings_from_cc/test/golden/user_of_imported_type.h;l=10
+// Error while generating bindings for item 'UserOfImportedType::operator=':
 // Parameter #0 is not supported: Unsupported type 'struct UserOfImportedType &&'
 
 // CRUBIT_RS_BINDINGS_FROM_CC_TEST_GOLDEN_USER_OF_IMPORTED_TYPE_H_