Index: src/ResolvExpr/ResolveTypeof.cc
===================================================================
--- src/ResolvExpr/ResolveTypeof.cc	(revision 16ba4a6fa0eb60a0cd27fb96882e37dbf94834dd)
+++ src/ResolvExpr/ResolveTypeof.cc	(revision 0dd9a5eb90cd65276b32272b8ae6f6266463e91b)
@@ -165,13 +165,43 @@
 }
 
+struct FixArrayDimension {
+	// should not require a mutable symbol table - prevent pass template instantiation
+	const ast::SymbolTable & _symtab; 
+	FixArrayDimension(const ast::SymbolTable & symtab): _symtab(symtab) {}
+
+	const ast::ArrayType * previsit (const ast::ArrayType * arrayType) {
+		if (!arrayType->dimension) return arrayType;
+		auto mutType = mutate(arrayType);
+		ast::ptr<ast::Type> sizetype = ast::sizeType ? ast::sizeType : new ast::BasicType(ast::BasicType::LongUnsignedInt); 
+		mutType->dimension = findSingleExpression(arrayType->dimension, sizetype, _symtab);
+
+		if (InitTweak::isConstExpr(mutType->dimension)) {
+			mutType->isVarLen = ast::LengthFlag::FixedLen;
+		}
+		else {
+			mutType->isVarLen = ast::LengthFlag::VariableLen;
+		}
+		return mutType;
+	}
+};
+
+const ast::Type * fixArrayType( const ast::Type * type, const ast::SymbolTable & symtab) {
+	ast::Pass<FixArrayDimension> visitor {symtab};
+	return type->accept(visitor);
+}
+
 const ast::ObjectDecl * fixObjectType( const ast::ObjectDecl * decl , const ast::SymbolTable & symtab ) {
 	if (!decl->isTypeFixed) { 
 		auto mutDecl = mutate(decl);
 		auto resolvedType = resolveTypeof(decl->type, symtab);
+		resolvedType = fixArrayType(resolvedType, symtab);
 		mutDecl->type = resolvedType;
 
 		// check variable length if object is an array.
 		// xxx - should this be part of fixObjectType?
+
+		/*
 		if (auto arrayType = dynamic_cast<const ast::ArrayType *>(resolvedType)) {
+			auto dimExpr = findSingleExpression(arrayType->dimension, ast::sizeType, symtab);
 			if (auto varexpr = arrayType->dimension.as<ast::VariableExpr>()) {// hoisted previously
 				if (InitTweak::isConstExpr(varexpr->var.strict_as<ast::ObjectDecl>()->init)) {
@@ -182,4 +212,6 @@
 			}
 		}
+		*/
+
 
 		if (!mutDecl->name.empty()) 
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 16ba4a6fa0eb60a0cd27fb96882e37dbf94834dd)
+++ src/ResolvExpr/Resolver.cc	(revision 0dd9a5eb90cd65276b32272b8ae6f6266463e91b)
@@ -1289,4 +1289,5 @@
 		void beginScope() { managedTypes.beginScope(); }
 		void endScope() { managedTypes.endScope(); }
+		bool onError(ast::ptr<ast::Decl> & decl);
 	};
 	// size_t Resolver_new::traceId = Stats::Heap::new_stacktrace_id("Resolver");
@@ -2066,4 +2067,19 @@
 	}
 
+	// suppress error on autogen functions and mark invalid autogen as deleted.
+	bool Resolver_new::onError(ast::ptr<ast::Decl> & decl) {
+		if (auto functionDecl = decl.as<ast::FunctionDecl>()) {
+			// xxx - can intrinsic gen ever fail?
+			if (functionDecl->linkage == ast::Linkage::AutoGen) { 
+				auto mutDecl = mutate(functionDecl);
+				mutDecl->isDeleted = true;
+				mutDecl->stmts = nullptr;
+				decl = mutDecl;
+				return false;
+			}
+		}
+		return true;
+	}
+
 } // namespace ResolvExpr
 
