Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 3e5dd91354f39b161547cc1119ecef5890aa765f)
+++ src/SymTab/Validate.cc	(revision c20533eac59c1a6c117eec0ffaeabbb99d4ed54c)
@@ -271,5 +271,5 @@
 	};
 
-	struct ArrayLength : public WithIndexer {
+	struct InitializerLength {
 		/// 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,
@@ -282,4 +282,9 @@
 
 		void previsit( ObjectDecl * objDecl );
+	};
+
+	struct ArrayLength : public WithIndexer {
+		static void computeLength( std::list< Declaration * > & translationUnit );
+
 		void previsit( ArrayType * arrayType );
 	};
@@ -382,6 +387,10 @@
 					FixObjectType::fix, translationUnit);
 			}
-			Stats::Time::TimeCall("Array Length",
-				ArrayLength::computeLength, translationUnit);
+			Stats::Time::TimeCall("Initializer Length",
+				InitializerLength::computeLength, translationUnit);
+			if (!useNewAST) {
+				Stats::Time::TimeCall("Array Length",
+					ArrayLength::computeLength, translationUnit);
+			}
 			Stats::Time::TimeCall("Find Special Declarations",
 				Validate::findSpecialDecls, translationUnit);
@@ -1332,4 +1341,9 @@
 	}
 
+	void InitializerLength::computeLength( std::list< Declaration * > & translationUnit ) {
+		PassVisitor<InitializerLength> len;
+		acceptAll( translationUnit, len );
+	}
+
 	void ArrayLength::computeLength( std::list< Declaration * > & translationUnit ) {
 		PassVisitor<ArrayLength> len;
@@ -1337,5 +1351,5 @@
 	}
 
-	void ArrayLength::previsit( ObjectDecl * objDecl ) {
+	void InitializerLength::previsit( ObjectDecl * objDecl ) {
 		if ( ArrayType * at = dynamic_cast< ArrayType * >( objDecl->type ) ) {
 			if ( at->dimension ) return;
@@ -1347,14 +1361,12 @@
 
 	void ArrayLength::previsit( ArrayType * type ) {
-		if (!useNewAST) {
-			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, Validate::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 );
-			}
+		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, Validate::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 );
 		}
 	}
