Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision f0728921836dddcda765c8e1d819f407d111abb0)
+++ src/SymTab/Validate.cc	(revision 4934ea346862de29c799c6cf0d5cba87561e39ea)
@@ -61,4 +61,5 @@
 #include "Parser/LinkageSpec.h"        // for C
 #include "ResolvExpr/typeops.h"        // for typesCompatible
+#include "ResolvExpr/Resolver.h"       // for findSingleExpression
 #include "SymTab/Autogen.h"            // for SizeType
 #include "SynTree/Attribute.h"         // for noAttributes, Attribute
@@ -247,5 +248,5 @@
 	};
 
-	struct ArrayLength {
+	struct ArrayLength : public WithIndexer {
 		/// for array types without an explicit length, compute the length and store it so that it
 		/// is known to the rest of the phases. For example,
@@ -258,4 +259,5 @@
 
 		void previsit( ObjectDecl * objDecl );
+		void previsit( ArrayType * arrayType );
 	};
 
@@ -1239,4 +1241,16 @@
 	}
 
+	void ArrayLength::previsit( ArrayType * type ) {
+		if ( type->dimension ) {
+			// need to resolve array dimensions early so that constructor code can correctly determine
+			// if a type is a VLA (and hence whether its elements need to be constructed)
+			ResolvExpr::findSingleExpression( type->dimension, SymTab::SizeType->clone(), indexer );
+
+			// must re-evaluate whether a type is a VLA, now that more information is available
+			// (e.g. the dimension may have been an enumerator, which was unknown prior to this step)
+			type->isVarLen = ! InitTweak::isConstExpr( type->dimension );
+		}
+	}
+
 	struct LabelFinder {
 		std::set< Label > & labels;
