Part #1 of adding mutable pointer types to Rust bindings.
This does **not** do:
* rust-side codegen
* const pointers
* The *way* bigger difficult problem of determining whether to translate from `T*` to `*mut T` or `Option<&T>`.
PiperOrigin-RevId: 397043315
diff --git a/rs_bindings_from_cc/ast_visitor_test.cc b/rs_bindings_from_cc/ast_visitor_test.cc
index 36ad681..d1e35f8 100644
--- a/rs_bindings_from_cc/ast_visitor_test.cc
+++ b/rs_bindings_from_cc/ast_visitor_test.cc
@@ -137,14 +137,38 @@
EXPECT_EQ(func.identifier.Ident(), "Add");
EXPECT_EQ(func.mangled_name, "_Z3Addii");
EXPECT_EQ(func.return_type.rs_name, "i32");
+ EXPECT_THAT(func.return_type.type_params, IsEmpty());
EXPECT_THAT(func.params, SizeIs(2));
EXPECT_EQ(func.params[0].type.rs_name, "i32");
+ EXPECT_THAT(func.params[0].type.type_params, IsEmpty());
EXPECT_EQ(func.params[0].identifier.Ident(), "a");
EXPECT_EQ(func.params[1].type.rs_name, "i32");
+ EXPECT_THAT(func.params[1].type.type_params, IsEmpty());
EXPECT_EQ(func.params[1].identifier.Ident(), "b");
}
+TEST(AstVisitorTest, TestImportPointerFunc) {
+ IR ir = ImportCode({"int* Foo(int* a);"}, {});
+ ASSERT_THAT(ir.Functions(), SizeIs(1));
+
+ Func func = ir.Functions()[0];
+
+ ASSERT_THAT(func.params, SizeIs(1));
+ Type return_type = func.return_type;
+ Type param_type = func.params[0].type;
+
+ for (Type type : {return_type, param_type}) {
+ EXPECT_EQ(type.rs_name, "*mut");
+ EXPECT_EQ(type.cc_name, "*");
+ ASSERT_THAT(type.type_params, SizeIs(1));
+ const Type& pointee = type.type_params[0];
+ EXPECT_EQ(pointee.rs_name, "i32");
+ EXPECT_EQ(pointee.cc_name, "int");
+ EXPECT_THAT(pointee.type_params, IsEmpty());
+ }
+}
+
TEST(AstVisitorTest, Struct) {
IR ir = ImportCode(
{"struct SomeStruct { int first_field; int second_field; };"}, {});