Factor out C++ indirect return predicate
diff --git a/gen/write.rs b/gen/write.rs
index 3cd3683..d57e21e 100644
--- a/gen/write.rs
+++ b/gen/write.rs
@@ -187,10 +187,6 @@
 }
 
 fn write_cxx_function_shim(out: &mut OutFile, efn: &ExternFn, types: &Types) {
-    let indirect_return = efn
-        .ret
-        .as_ref()
-        .map_or(false, |ret| types.needs_indirect_abi(ret));
     write_extern_return_type(out, &efn.ret, types);
     for name in out.namespace.clone() {
         write!(out, "{}$", name);
@@ -205,6 +201,7 @@
         }
         write_extern_arg(out, arg, types);
     }
+    let indirect_return = indirect_return(efn, types);
     if indirect_return {
         if !efn.args.is_empty() {
             write!(out, ", ");
@@ -285,11 +282,7 @@
         }
         write_extern_arg(out, arg, types);
     }
-    if efn
-        .ret
-        .as_ref()
-        .map_or(false, |ret| types.needs_indirect_abi(ret))
-    {
+    if indirect_return(efn, types) {
         if !efn.args.is_empty() {
             write!(out, ", ");
         }
@@ -300,10 +293,6 @@
 }
 
 fn write_rust_function_shim(out: &mut OutFile, efn: &ExternFn, types: &Types) {
-    let indirect_return = efn
-        .ret
-        .as_ref()
-        .map_or(false, |ret| types.needs_indirect_abi(ret));
     for line in efn.doc.to_string().lines() {
         writeln!(out, "//{}", line);
     }
@@ -329,6 +318,7 @@
             }
         }
         write!(out, "  ");
+        let indirect_return = indirect_return(efn, types);
         if indirect_return {
             write!(out, "::rust::MaybeUninit<");
             write_type(out, efn.ret.as_ref().unwrap());
@@ -398,6 +388,12 @@
     }
 }
 
+fn indirect_return(efn: &ExternFn, types: &Types) -> bool {
+    efn.ret
+        .as_ref()
+        .map_or(false, |ret| types.needs_indirect_abi(ret))
+}
+
 fn write_extern_return_type(out: &mut OutFile, ty: &Option<Type>, types: &Types) {
     match ty {
         Some(Type::RustBox(ty)) | Some(Type::UniquePtr(ty)) => {