Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 597db97fd3bb3ae39d9d8b56882a8705b6f0880c)
+++ src/InitTweak/FixInit.cc	(revision 707446a4ee2e0e188dd4c8436a1129db08e4e382)
@@ -738,10 +738,14 @@
 						stmtsToAddAfter.push_back( ifStmt );
 
-						if ( ctorInit->get_dtor() ) {
+						Statement * dtor = ctorInit->get_dtor();
+						objDecl->set_init( NULL );
+						ctorInit->set_ctor( NULL );
+						ctorInit->set_dtor( nullptr );
+						if ( dtor ) {
 							// if the object has a non-trivial destructor, have to
 							// hoist it and the object into the global space and
 							// call the destructor function with atexit.
 
-							Statement * dtorStmt = ctorInit->get_dtor()->clone();
+							Statement * dtorStmt = dtor->clone();
 
 							// void __objName_dtor_atexitN(...) {...}
@@ -772,12 +776,9 @@
 							objDecl->set_mangleName( SymTab::Mangler::mangle( objDecl ) );
 
-							objDecl->set_init( NULL );
-							ctorInit->set_ctor( NULL );
-							delete ctorInit;
-
 							// xxx - temporary hack: need to return a declaration, but want to hoist the current object out of this scope
 							// create a new object which is never used
 							static UniqueName dummyNamer( "_dummy" );
 							ObjectDecl * dummy = new ObjectDecl( dummyNamer.newName(), Type::StorageClasses( Type::Static ), LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new VoidType( Type::Qualifiers() ) ), 0, std::list< Attribute * >{ new Attribute("unused") } );
+							delete ctorInit;
 							return dummy;
 						}
Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision 597db97fd3bb3ae39d9d8b56882a8705b6f0880c)
+++ src/InitTweak/GenInit.cc	(revision 707446a4ee2e0e188dd4c8436a1129db08e4e382)
@@ -294,8 +294,8 @@
 		handleDWT( objDecl );
 		// hands off if @=, extern, builtin, etc.
-		// if global but initializer is not constexpr, always try to construct, since this is not legal C
-		if ( ( tryConstruct( objDecl ) && isManaged( objDecl ) ) || (! inFunction && ! isConstExpr( objDecl->get_init() ) ) ) {
+		// even if unmanaged, try to construct global or static if initializer is not constexpr, since this is not legal C
+		if ( tryConstruct( objDecl ) && ( isManaged( objDecl ) || ((! inFunction || objDecl->get_storageClasses().is_static ) && ! isConstExpr( objDecl->get_init() ) ) ) ) {
 			// constructed objects cannot be designated
-			if ( isDesignated( objDecl->get_init() ) ) throw SemanticError( "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.", objDecl );
+			if ( isDesignated( objDecl->get_init() ) ) throw SemanticError( "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.\n", objDecl );
 			// constructed objects should not have initializers nested too deeply
 			if ( ! checkInitDepth( objDecl ) ) throw SemanticError( "Managed object's initializer is too deep ", objDecl );
