Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 9fe3394725b957bb0ebfe000e5530679a22ff59d)
+++ src/InitTweak/FixInit.cc	(revision 6dfa2e18c3f05e78bc92b5bb4ce65ed347db0442)
@@ -480,7 +480,12 @@
 				static UniqueName retNamer("_tmp_stmtexpr_ret");
 
-				// create variable that will hold the result of the stmt expr
 				result = result->clone();
 				env->apply( result );
+				if ( ! InitTweak::isConstructable( result ) ) {
+					delete result;
+					return;
+				}
+
+				// create variable that will hold the result of the stmt expr
 				ObjectDecl * ret = ObjectDecl::newObject( retNamer.newName(), result, nullptr );
 				ret->type->set_const( false );
@@ -611,6 +616,9 @@
 				// must have a non-empty body, otherwise it wouldn't have a result
 				assert( ! stmts.empty() );
-				assertf( ! stmtExpr->get_returnDecls().empty(), "StmtExpr returns non-void, but no return decls: %s", toString( stmtExpr ).c_str() );
-				stmts.push_back( new ExprStmt( new VariableExpr( stmtExpr->returnDecls.front() ) ) );
+				assertf( ! stmtExpr->returnDecls.empty() || stmtExpr->dtors.empty(), "StmtExpr returns non-void, but no return decls: %s", toString( stmtExpr ).c_str() );
+				// if there is a return decl, add a use as the last statement; will not have return decl on non-constructable returns
+				if ( ! stmtExpr->returnDecls.empty() ) {
+					stmts.push_back( new ExprStmt( new VariableExpr( stmtExpr->returnDecls.front() ) ) );
+				}
 				stmtExpr->returnDecls.clear();
 				stmtExpr->dtors.clear();
