Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision f1149acdd1aec2da8d7e43ad6e4025f8b736412b)
+++ src/ResolvExpr/Resolver.cc	(revision bc61563c4a48cab77ce48a03a73abf55b627a27f)
@@ -412,4 +412,5 @@
 
 	void resolveWithExprs(std::vector<ast::ptr<ast::Expr>> & exprs, std::list<ast::ptr<ast::Stmt>> & stmtsToAdd);
+	bool shouldGenCtorInit( const ast::ObjectDecl * ) const;
 
 	void beginScope() { managedTypes.beginScope(); }
@@ -581,4 +582,15 @@
 }
 
+bool Resolver::shouldGenCtorInit( ast::ObjectDecl const * decl ) const {
+	// If we shouldn't try to construct it, then don't.
+	if ( !InitTweak::tryConstruct( decl ) ) return false;
+	// Otherwise, if it is a managed type, we may construct it.
+	if ( managedTypes.isManaged( decl ) ) return true;
+	// Skip construction if it is trivial at compile-time.
+	if ( InitTweak::isConstExpr( decl->init ) ) return false;
+	// Skip construction for local declarations.
+	return ( !isInFunction() || decl->storage.is_static );
+}
+
 const ast::ObjectDecl * Resolver::previsit( const ast::ObjectDecl * objectDecl ) {
 	// To handle initialization of routine pointers [e.g. int (*fp)(int) = foo()],
@@ -615,5 +627,5 @@
 			// this object in visitor pass, thus disabling CtorInit codegen.
 			// this happens on aggregate members and function parameters.
-			if ( InitTweak::tryConstruct( mutDecl ) && ( managedTypes.isManaged( mutDecl ) || ((! isInFunction() || mutDecl->storage.is_static ) && ! InitTweak::isConstExpr( mutDecl->init ) ) ) ) {
+			if ( shouldGenCtorInit( mutDecl ) ) {
 				// constructed objects cannot be designated
 				if ( InitTweak::isDesignated( mutDecl->init ) ) {
