Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 954ef5b6ded94722e95fc32aa53a2183a230faa4)
+++ src/SymTab/Validate.cc	(revision 85d340d705347aaa4d73e025cc209e2cd45a5329)
@@ -668,5 +668,4 @@
 		}
 		filter( translationUnit, isTypedef, true );
-
 	}
 
@@ -676,15 +675,15 @@
 		TypedefMap::const_iterator def = typedefNames.find( typeInst->get_name() );
 		if ( def != typedefNames.end() ) {
-			Type *ret = def->second.first->get_base()->clone();
+			Type *ret = def->second.first->base->clone();
 			ret->get_qualifiers() |= typeInst->get_qualifiers();
 			// place instance parameters on the typedef'd type
-			if ( ! typeInst->get_parameters().empty() ) {
+			if ( ! typeInst->parameters.empty() ) {
 				ReferenceToType *rtt = dynamic_cast<ReferenceToType*>(ret);
 				if ( ! rtt ) {
-					throw SemanticError("cannot apply type parameters to base type of " + typeInst->get_name());
+					throw SemanticError("Cannot apply type parameters to base type of " + typeInst->name);
 				}
 				rtt->get_parameters().clear();
-				cloneAll( typeInst->get_parameters(), rtt->get_parameters() );
-				mutateAll( rtt->get_parameters(), *visitor );  // recursively fix typedefs on parameters
+				cloneAll( typeInst->parameters, rtt->parameters );
+				mutateAll( rtt->parameters, *visitor );  // recursively fix typedefs on parameters
 			} // if
 			delete typeInst;
@@ -692,8 +691,22 @@
 		} else {
 			TypeDeclMap::const_iterator base = typedeclNames.find( typeInst->get_name() );
-			assertf( base != typedeclNames.end(), "Cannot find typedecl name %s", typeInst->get_name().c_str() );
+			assertf( base != typedeclNames.end(), "Cannot find typedecl name %s", typeInst->name.c_str() );
 			typeInst->set_baseType( base->second );
 		} // if
 		return typeInst;
+	}
+
+	struct VarLenChecker : WithShortCircuiting {
+		void previsit( FunctionType * ) { visit_children = false; }
+		void previsit( ArrayType * at ) {
+			isVarLen |= at->isVarLen;
+		}
+		bool isVarLen = false;
+	};
+
+	bool isVariableLength( Type * t ) {
+		PassVisitor<VarLenChecker> varLenChecker;
+		maybeAccept( t, varLenChecker );
+		return varLenChecker.pass.isVarLen;
 	}
 
@@ -706,5 +719,9 @@
 			Type * t2 = typedefNames[ tyDecl->get_name() ].first->get_base();
 			if ( ! ResolvExpr::typesCompatible( t1, t2, Indexer() ) ) {
-				throw SemanticError( "cannot redefine typedef: " + tyDecl->get_name() );
+				throw SemanticError( "Cannot redefine typedef: " + tyDecl->name );
+			}
+			// cannot redefine VLA typedefs
+			if ( isVariableLength( t1 ) || isVariableLength( t2 ) ) {
+				throw SemanticError( "Cannot redefine typedef: " + tyDecl->name );
 			}
 		} else {
