Index: src/Validate/InitializerLength.cpp
===================================================================
--- src/Validate/InitializerLength.cpp	(revision 82a5ea23df09d8e6900e45f3b0d081bad576c253)
+++ src/Validate/InitializerLength.cpp	(revision 2ac78a14fd9ad355cb75cf3a7f4d58670189b7da)
@@ -29,19 +29,37 @@
 ///   int x[] = { 1, 2, 3 };
 ///   int y[][2] = { { 1, 2, 3 }, { 1, 2, 3 } };
+///   char z[] = "hello";
 /// here x and y are known at compile-time to have length 3, so change this into
 ///   int x[3] = { 1, 2, 3 };
 ///   int y[3][2] = { { 1, 2, 3 }, { 1, 2, 3 } };
+///   char z[6] = "hello";
 struct InitializerLength {
 	const ast::ObjectDecl * previsit( const ast::ObjectDecl * decl );
 };
 
+ast::ConstantExpr * makeDimension( const ast::ObjectDecl * decl ) {
+	if ( auto init = decl->init.as<ast::ListInit>() ) {
+		return ast::ConstantExpr::from_ulong( decl->location, init->size() );
+	} else if ( auto init = decl->init.as<ast::SingleInit>() ) {
+		if ( auto constant = init->value.as<ast::ConstantExpr>() ) {
+			if ( auto type = constant->result.as<ast::ArrayType>() ) {
+				if ( auto dim = type->dimension.as<ast::ConstantExpr>() ) {
+					ast::ConstantExpr * dimension = ast::deepCopy( dim );
+					dimension->location = decl->location;
+					return dimension;
+				}
+			}
+		}
+	}
+	return nullptr;
+}
+
 const ast::ObjectDecl * InitializerLength::previsit( const ast::ObjectDecl * decl ) {
 	if ( auto type = decl->type.as<ast::ArrayType>() ) {
 		if ( type->dimension ) return decl;
-		if ( auto init = decl->init.as<ast::ListInit>() ) {
+		if ( auto dimension = makeDimension( decl ) ) {
 			ast::ObjectDecl * mutDecl = ast::mutate( decl );
 			ast::ArrayType * mutType = ast::mutate( type );
-			mutType->dimension = ast::ConstantExpr::from_ulong(
-				mutDecl->location, init->size() );
+			mutType->dimension = dimension;
 			mutDecl->type = mutType;
 			return mutDecl;
