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 (¶m_type_kinds[0], ¶m_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_