Resolve Wreturn-type-c-linkage warnings
diff --git a/gen/write.rs b/gen/write.rs
index 97fdc48..ea6a812 100644
--- a/gen/write.rs
+++ b/gen/write.rs
@@ -211,8 +211,11 @@
         write!(out, "new (return$) ");
         write_type(out, efn.ret.as_ref().unwrap());
         write!(out, "(");
-    } else if efn.ret.is_some() {
+    } else if let Some(ret) = &efn.ret {
         write!(out, "return ");
+        if let Type::Ref(_) = ret {
+            write!(out, "&");
+        }
     }
     write!(out, "{}$(", efn.ident);
     for (i, arg) in efn.args.iter().enumerate() {
@@ -298,8 +301,11 @@
             write_type(out, efn.ret.as_ref().unwrap());
             writeln!(out, ")];");
             write!(out, "  ");
-        } else if efn.ret.is_some() {
+        } else if let Some(ret) = &efn.ret {
             write!(out, "return ");
+            if let Type::Ref(_) = ret {
+                write!(out, "*");
+            }
         }
         for name in out.namespace.clone() {
             write!(out, "{}$", name);
@@ -352,6 +358,13 @@
             write_type_space(out, &ty.inner);
             write!(out, "*");
         }
+        Some(Type::Ref(ty)) => {
+            if ty.mutability.is_none() {
+                write!(out, "const ");
+            }
+            write_type(out, &ty.inner);
+            write!(out, " *");
+        }
         Some(Type::Str(_)) => write!(out, "cxxbridge::RustStr::Repr "),
         Some(ty) if types.needs_indirect_abi(ty) => write!(out, "void "),
         _ => write_return_type(out, ty),