Index: src/ResolvExpr/AdjustExprType.cc
===================================================================
--- src/ResolvExpr/AdjustExprType.cc	(revision aeef2bdecb198061ca07acd17b5e5638278020cf)
+++ src/ResolvExpr/AdjustExprType.cc	(revision 0e04f59a6b319fef160b5a4f8c1fe63a8d978eda)
@@ -28,4 +28,5 @@
 		void premutate( BasicType * ) { visit_children = false; }
 		void premutate( PointerType * ) { visit_children = false; }
+		void premutate( ArrayType * ) { visit_children = false; }
 		void premutate( FunctionType * ) { visit_children = false; }
 		void premutate( StructInstType * ) { visit_children = false; }
@@ -59,5 +60,4 @@
 
 	Type * AdjustExprType::postmutate( ArrayType * arrayType ) {
-		// need to recursively mutate the base type in order for multi-dimensional arrays to work.
 		PointerType *pointerType = new PointerType( arrayType->get_qualifiers(), arrayType->base );
 		arrayType->base = nullptr;
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision aeef2bdecb198061ca07acd17b5e5638278020cf)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 0e04f59a6b319fef160b5a4f8c1fe63a8d978eda)
@@ -180,9 +180,4 @@
 			throw SemanticError( "No reasonable alternatives for expression ", expr );
 		}
-		for ( AltList::iterator i = alternatives.begin(); i != alternatives.end(); ++i ) {
-			if ( adjust ) {
-				adjustExprType( i->expr->get_result(), i->env, indexer );
-			}
-		}
 		if ( prune ) {
 			PRINT(
@@ -206,4 +201,10 @@
 				std::cerr << "there are " << alternatives.size() << " alternatives after elimination" << std::endl;
 			)
+		}
+		// adjust types after pruning so that types substituted by pruneAlternatives are correctly adjusted
+		for ( AltList::iterator i = alternatives.begin(); i != alternatives.end(); ++i ) {
+			if ( adjust ) {
+				adjustExprType( i->expr->get_result(), i->env, indexer );
+			}
 		}
 
