- writeln!(w, "\t\tlet mut rust_obj = {} {{ inner: ObjOps::heap_alloc(obj), is_owned: true }};", ident).unwrap();
- writeln!(w, "\t\tlet mut ret = {}_as_{}(&rust_obj);", ident, trait_obj.ident).unwrap();
- writeln!(w, "\t\t// We want to free rust_obj when ret gets drop()'d, not rust_obj, so wipe rust_obj's pointer and set ret's free() fn").unwrap();
- writeln!(w, "\t\trust_obj.inner = std::ptr::null_mut();").unwrap();
- writeln!(w, "\t\tret.free = Some({}_free_void);", ident).unwrap();
- writeln!(w, "\t\tret\n\t}}\n}}").unwrap();
+ if is_type_unconstructable(&resolved_path) {
+ writeln!(w, "\t\tunreachable!();").unwrap();
+ } else {
+ writeln!(w, "\t\tlet mut rust_obj = {} {{ inner: ObjOps::heap_alloc(obj), is_owned: true }};", ident).unwrap();
+ writeln!(w, "\t\tlet mut ret = {}_as_{}(&rust_obj);", ident, trait_obj.ident).unwrap();
+ writeln!(w, "\t\t// We want to free rust_obj when ret gets drop()'d, not rust_obj, so wipe rust_obj's pointer and set ret's free() fn").unwrap();
+ writeln!(w, "\t\trust_obj.inner = std::ptr::null_mut();").unwrap();
+ writeln!(w, "\t\tret.free = Some({}_free_void);", ident).unwrap();
+ writeln!(w, "\t\tret").unwrap();
+ }
+ writeln!(w, "\t}}\n}}").unwrap();
+ if is_type_unconstructable(&resolved_path) {
+ // We don't bother with Struct_as_Trait conversion for types which must
+ // never be instantiated, so just return early.
+ return;
+ }