Additional test coverage for redeclared `friend`, `inline` functions.
PiperOrigin-RevId: 471852475
diff --git a/rs_bindings_from_cc/ir_from_cc_test.rs b/rs_bindings_from_cc/ir_from_cc_test.rs
index bad43c1..315d674 100644
--- a/rs_bindings_from_cc/ir_from_cc_test.rs
+++ b/rs_bindings_from_cc/ir_from_cc_test.rs
@@ -3382,6 +3382,68 @@
}
#[test]
+fn test_function_redeclared_as_friend() {
+ let ir = ir_from_cc(
+ r#"
+ class SomeClass final {
+ friend constexpr int bar();
+ };
+ constexpr int bar() { return 123; }
+ "#,
+ )
+ .unwrap();
+
+ // The function should appear only once in IR items. (This is a bit redundant
+ // with the assert below, but double-checks that `...` didn't miss a Func
+ // item.)
+ let functions = ir
+ .functions()
+ .filter(|f| f.name == UnqualifiedIdentifier::Identifier(ir_id("bar")))
+ .collect_vec();
+ assert_eq!(1, functions.len());
+ let function_id = functions[0].id;
+
+ // There should only be a single Func item.
+ //
+ // Additionally, this assert also verifies (a bit haphazardly) that
+ // `child_item_ids` and `top_level_item_ids` have the right length, which
+ // indirectly verifies that the `function_id` is included in
+ // `top_level_item_ids` and is not included in the record's `child_item_ids`).
+ assert_ir_matches!(
+ ir,
+ quote! {
+ items: [
+ ...
+ Record(Record {
+ rs_name: "SomeClass" ...
+ child_item_ids: [
+ ItemId(...),
+ ItemId(...),
+ ItemId(...),
+ ItemId(...),
+ ItemId(...),
+ ItemId(...),
+ ] ...
+ enclosing_namespace_id: None ...
+ }),
+ Func(Func { name: Constructor ... }),
+ Func(Func { name: Constructor ... }),
+ UnsupportedItem(UnsupportedItem { name: "SomeClass::SomeClass" ... }),
+ Func(Func { name: Destructor ... }),
+ Func(Func { name: "operator=" ... }),
+ UnsupportedItem(UnsupportedItem { name: "SomeClass::operator=" ... }),
+ Func(Func {
+ name: "bar" ...
+ enclosing_namespace_id: None ...
+ adl_enclosing_record: None,
+ }),
+ ],
+ top_level_item_ids: [ItemId(...), ItemId(#function_id)]
+ }
+ );
+}
+
+#[test]
fn test_incomplete_record_has_rs_name() {
let ir = ir_from_cc(
r#"
diff --git a/rs_bindings_from_cc/test/struct/operators/add_assign.h b/rs_bindings_from_cc/test/struct/operators/add_assign.h
index 7bffbe4..90b392b 100644
--- a/rs_bindings_from_cc/test/struct/operators/add_assign.h
+++ b/rs_bindings_from_cc/test/struct/operators/add_assign.h
@@ -63,4 +63,18 @@
AddAssignFreeByValue& operator+=(AddAssignFreeByValue& lhs,
AddAssignFreeByValue rhs);
+// This provides additional test coverage for b/244311755.
+struct AddAssignInlineFriendByValue final {
+ friend inline AddAssignInlineFriendByValue& operator+=(
+ AddAssignInlineFriendByValue& lhs, AddAssignInlineFriendByValue rhs);
+
+ int i;
+};
+
+inline AddAssignInlineFriendByValue& operator+=(
+ AddAssignInlineFriendByValue& lhs, AddAssignInlineFriendByValue rhs) {
+ lhs.i += rhs.i;
+ return lhs;
+}
+
#endif // CRUBIT_RS_BINDINGS_FROM_CC_TEST_STRUCT_OPERATORS_ADD_ASSIGN_H_
diff --git a/rs_bindings_from_cc/test/struct/operators/add_assign_test.rs b/rs_bindings_from_cc/test/struct/operators/add_assign_test.rs
index 2b655cf..bc6949c 100644
--- a/rs_bindings_from_cc/test/struct/operators/add_assign_test.rs
+++ b/rs_bindings_from_cc/test/struct/operators/add_assign_test.rs
@@ -52,4 +52,12 @@
s1 += s2;
assert_eq!(33, s1.i);
}
+
+ #[test]
+ fn test_add_assign_inline_friend_by_value() {
+ let mut s1 = AddAssignInlineFriendByValue { i: 111 };
+ let s2 = AddAssignInlineFriendByValue { i: 222 };
+ s1 += s2;
+ assert_eq!(333, s1.i);
+ }
}