Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 972e6f723601cda15cf0579d257a4373a83330d4)
+++ src/CodeGen/CodeGenerator.cc	(revision 5b40f300c07c8cd0b5d1720f42e535c1f4926bd5)
@@ -212,5 +212,11 @@
 		printDesignators( init->get_designators() );
 		output << "{ ";
-		genCommaList( init->begin_initializers(), init->end_initializers() );
+		if ( init->begin_initializers() == init->end_initializers() ) {
+			// illegal to leave initializer list empty for scalar initializers,
+			// but always legal to have 0
+			output << "0";
+		} else {
+			genCommaList( init->begin_initializers(), init->end_initializers() );
+		}
 		output << " }";
 	}
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 972e6f723601cda15cf0579d257a4373a83330d4)
+++ src/InitTweak/FixInit.cc	(revision 5b40f300c07c8cd0b5d1720f42e535c1f4926bd5)
@@ -48,6 +48,4 @@
 	}
 
-	// in the case where an object has an initializer and a polymorphic type, insert an assignment immediately after the
-	// declaration. This will (seemingly) cause the later phases to do the right thing with the assignment
 	ObjectDecl *FixInit::mutate( ObjectDecl *objDecl ) {
 		if ( ConstructorInit * ctorInit = dynamic_cast< ConstructorInit * >( objDecl->get_init() ) ) {
@@ -79,4 +77,6 @@
 				if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( exprStmt->get_expr() ) ) {
 					if ( VariableExpr * function = dynamic_cast< VariableExpr * >( appExpr->get_function() ) ) {
+						// check for Intrinsic only - don't want to remove all overridable dtors because autogenerated dtor
+						// will call all member dtors, and some members may have a user defined dtor.
 						if ( function->get_var()->get_name() == "^?{}" && function->get_var()->get_linkage() == LinkageSpec::Intrinsic ) {
 							statements.erase(it++);
Index: src/InitTweak/RemoveInit.cc
===================================================================
--- src/InitTweak/RemoveInit.cc	(revision 972e6f723601cda15cf0579d257a4373a83330d4)
+++ src/InitTweak/RemoveInit.cc	(revision 5b40f300c07c8cd0b5d1720f42e535c1f4926bd5)
@@ -29,4 +29,5 @@
 	namespace {
 		const std::list<Label> noLabels;
+		const std::list<Expression *> noDesignators;
 	}
 
@@ -112,13 +113,15 @@
 		// hands off if the function returns an lvalue - we don't want to allocate a temporary if a variable's address
 		// is being returned
-		// xxx - this should construct rather than assign
 		if ( returnStmt->get_expr() && returnVals.size() == 1 && funcName != "?=?" && ! returnVals.front()->get_type()->get_isLvalue()  ) {
-			ObjectDecl *newObj = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, returnVals.front()->get_type()->clone(), 0 );
+			// ensure return value is not destructed by explicitly creating
+			// an empty SingleInit node wherein maybeConstruct is false
+			ObjectDecl *newObj = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, returnVals.front()->get_type()->clone(), new ListInit( std::list<Initializer*>(), noDesignators, false ) );
 			stmtsToAdd.push_back( new DeclStmt( noLabels, newObj ) );
 
-			UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) );
-			assign->get_args().push_back( new AddressExpr (new NameExpr( newObj->get_name() ) ) );
-			assign->get_args().push_back( returnStmt->get_expr() );
-			stmtsToAdd.push_back(new ExprStmt(noLabels, assign));
+			// and explicitly create the constructor expression separately
+			UntypedExpr *construct = new UntypedExpr( new NameExpr( "?{}" ) );
+			construct->get_args().push_back( new AddressExpr (new NameExpr( newObj->get_name() ) ) );
+			construct->get_args().push_back( returnStmt->get_expr() );
+			stmtsToAdd.push_back(new ExprStmt(noLabels, construct));
 
 			returnStmt->set_expr( new VariableExpr( newObj ) );
Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision 972e6f723601cda15cf0579d257a4373a83330d4)
+++ src/SymTab/Autogen.cc	(revision 5b40f300c07c8cd0b5d1720f42e535c1f4926bd5)
@@ -80,6 +80,8 @@
 		fExpr->get_args().push_back( dstselect );
 
-		Expression *srcselect = new MemberExpr( member, new VariableExpr( srcParam ) );
-		fExpr->get_args().push_back( srcselect );
+		if ( srcParam ) {
+			Expression *srcselect = new MemberExpr( member, new VariableExpr( srcParam ) );
+			fExpr->get_args().push_back( srcselect );
+		}
 
 		*out++ = new ExprStmt( noLabels, fExpr );
Index: src/SynTree/Initializer.cc
===================================================================
--- src/SynTree/Initializer.cc	(revision 972e6f723601cda15cf0579d257a4373a83330d4)
+++ src/SynTree/Initializer.cc	(revision 5b40f300c07c8cd0b5d1720f42e535c1f4926bd5)
@@ -54,5 +54,5 @@
 }
 
-ListInit::ListInit( std::list<Initializer*> &_initializers, const std::list<Expression *> &_designators, bool maybeConstructed )
+ListInit::ListInit( const std::list<Initializer*> &_initializers, const std::list<Expression *> &_designators, bool maybeConstructed )
 	: Initializer( maybeConstructed), initializers( _initializers ), designators( _designators ) {
 }
Index: src/SynTree/Initializer.h
===================================================================
--- src/SynTree/Initializer.h	(revision 972e6f723601cda15cf0579d257a4373a83330d4)
+++ src/SynTree/Initializer.h	(revision 5b40f300c07c8cd0b5d1720f42e535c1f4926bd5)
@@ -82,5 +82,5 @@
 class ListInit : public Initializer {
   public:
-	ListInit( std::list<Initializer*> &,
+	ListInit( const std::list<Initializer*> &initializers,
 			  const std::list<Expression *> &designators, bool maybeConstructed = false );
 	virtual ~ListInit();
