Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision 6dfa2e18c3f05e78bc92b5bb4ce65ed347db0442)
+++ src/InitTweak/GenInit.cc	(revision ddb80bdef0426d2cec4497bdc27176f0987deb06)
@@ -30,4 +30,5 @@
 #include "InitTweak.h"             // for isConstExpr, InitExpander, checkIn...
 #include "Parser/LinkageSpec.h"    // for isOverridable, C
+#include "ResolvExpr/Resolver.h"
 #include "SymTab/Autogen.h"        // for genImplicitCall, SizeType
 #include "SymTab/Mangler.h"        // for Mangler
@@ -89,5 +90,5 @@
 	};
 
-	struct HoistArrayDimension final : public WithDeclsToAdd, public WithShortCircuiting, public WithGuards {
+	struct HoistArrayDimension final : public WithDeclsToAdd, public WithShortCircuiting, public WithGuards, public WithIndexer {
 		/// hoist dimension from array types in object declaration so that it uses a single
 		/// const variable of type size_t, so that side effecting array dimensions are only
@@ -104,4 +105,7 @@
 		void premutate( FunctionType * ) { visit_children = false; }
 
+		// need this so that enumerators are added to the indexer, due to premutate(AggregateDecl *)
+		void premutate( EnumDecl * ) {}
+
 		void hoist( Type * type );
 
@@ -180,4 +184,6 @@
 			if ( ! arrayType->get_dimension() ) return; // xxx - recursive call to hoist?
 
+			// need to resolve array dimensions in order to accurately determine if constexpr
+			ResolvExpr::findSingleExpression( arrayType->dimension, SymTab::SizeType->clone(), indexer );
 			// don't need to hoist dimension if it's a constexpr - only need to if there's potential for side effects.
 			if ( isConstExpr( arrayType->get_dimension() ) ) return;
@@ -196,4 +202,5 @@
 	void HoistArrayDimension::premutate( FunctionDecl * ) {
 		GuardValue( inFunction );
+		inFunction = true;
 	}
 
