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; };"}, {});