let inner_name = self.get_c_mangled_container_type(vec![single_contained.unwrap()], generics, "Option").unwrap();
return Some(("if ", vec![
(format!(".is_none() {{ {}::None }} else {{ {}::Some(/* WARNING: CLONING CONVERSION HERE! &Option<Enum> is otherwise un-expressable. */", inner_name, inner_name),
- format!("{}.clone().unwrap()", var_access))
+ format!("(*{}.as_ref().unwrap()).clone()", var_access))
], ") }", ContainerPrefixLocation::PerConv));
}
} else {
(format!("{} {{ None }} else {{ Some(", s), format!("unsafe {{ &mut *{} }}", var_access))
], ") }", ContainerPrefixLocation::NoPrefix)),
EmptyValExpectedTy::OptionType =>
- return Some(("{ /* ", vec![
- (format!("*/ let {}_opt = {};", var_name, var_access),
- format!("}} if {}_opt{} {{ None }} else {{ Some({{ {}_opt.take()", var_name, s, var_name))
- ], ") } }", ContainerPrefixLocation::PerConv)),
+ return Some(("{ /*", vec![
+ (format!("*/ let {}_opt = {}; if {}_opt{} {{ None }} else {{ Some({{", var_name, var_access, var_name, s),
+ format!("{{ {}_opt.take() }}", var_name))
+ ], "})} }", ContainerPrefixLocation::PerConv)),
EmptyValExpectedTy::NonPointer =>
return Some(("if ", vec![
(format!("{} {{ None }} else {{ Some(", s), format!("{}", var_access))
} else if let syn::Type::Path(p_arg) = t {
if let Some(resolved) = self.maybe_resolve_path(&p_arg.path, generics) {
if !self.is_primitive(&resolved) {
- assert!(!is_ref); // We don't currently support outer reference types for non-primitive inners
+ if is_ref {
+ // We don't currently support outer reference types for non-primitive inners
+ return false;
+ }
}
} else {
- assert!(!is_ref); // We don't currently support outer reference types for non-primitive inners
+ if is_ref {
+ // We don't currently support outer reference types for non-primitive inners
+ return false;
+ }
}
if !self.write_c_type_intern(w, t, generics, false, false, false, true, true) { return false; }
} else {