Index: src/SymTab/FixFunction.cc
===================================================================
--- src/SymTab/FixFunction.cc	(revision ff878b70ab43fe8efcef8fccc5a0728258aa7324)
+++ src/SymTab/FixFunction.cc	(revision 4bda2cfb363d9d1523feb9259bef6524a5edad31)
@@ -36,4 +36,8 @@
 	}
 
+	// xxx - this passes on void[], e.g.
+	//   void foo(void [10]);
+	// does not cause an error
+
 	Type * FixFunction::postmutate(ArrayType *arrayType) {
 		// need to recursively mutate the base type in order for multi-dimensional arrays to work.
@@ -62,4 +66,10 @@
 	void FixFunction::premutate(ZeroType *) { visit_children = false; }
 	void FixFunction::premutate(OneType *) { visit_children = false; }
+
+	bool fixFunction( DeclarationWithType *& dwt ) {
+		PassVisitor<FixFunction> fixer;
+		dwt = dwt->acceptMutator( fixer );
+		return fixer.pass.isVoid;
+	}
 } // namespace SymTab
 
Index: src/SymTab/FixFunction.h
===================================================================
--- src/SymTab/FixFunction.h	(revision ff878b70ab43fe8efcef8fccc5a0728258aa7324)
+++ src/SymTab/FixFunction.h	(revision 4bda2cfb363d9d1523feb9259bef6524a5edad31)
@@ -47,4 +47,6 @@
 		bool isVoid;
 	};
+
+	bool fixFunction( DeclarationWithType *& );
 } // namespace SymTab
 
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision ff878b70ab43fe8efcef8fccc5a0728258aa7324)
+++ src/SymTab/Validate.cc	(revision 4bda2cfb363d9d1523feb9259bef6524a5edad31)
@@ -351,31 +351,22 @@
 	namespace {
 		template< typename DWTList >
-		void fixFunctionList( DWTList & dwts, FunctionType * func ) {
-			// the only case in which "void" is valid is where it is the only one in the list; then it should be removed
-			// entirely. other fix ups are handled by the FixFunction class
-			typedef typename DWTList::iterator DWTIterator;
-			DWTIterator begin( dwts.begin() ), end( dwts.end() );
-			if ( begin == end ) return;
-			PassVisitor<FixFunction> fixer;
-			DWTIterator i = begin;
-			*i = (*i)->acceptMutator( fixer );
-			if ( fixer.pass.isVoid ) {
-				DWTIterator j = i;
-				++i;
-				delete *j;
-				dwts.erase( j );
-				if ( i != end ) {
-					throw SemanticError( "invalid type void in function type ", func );
-				} // if
-			} else {
-				++i;
-				for ( ; i != end; ++i ) {
-					PassVisitor<FixFunction> fixer;
-					*i = (*i)->acceptMutator( fixer );
-					if ( fixer.pass.isVoid ) {
-						throw SemanticError( "invalid type void in function type ", func );
-					} // if
-				} // for
-			} // if
+		void fixFunctionList( DWTList & dwts, bool isVarArgs, FunctionType * func ) {
+			auto nvals = dwts.size();
+			bool containsVoid = false;
+			for ( auto & dwt : dwts ) {
+				// fix each DWT and record whether a void was found
+				containsVoid |= fixFunction( dwt );
+			}
+
+			// the only case in which "void" is valid is where it is the only one in the list
+			if ( containsVoid && ( nvals > 1 || isVarArgs ) ) {
+				throw SemanticError( "invalid type void in function type ", func );
+			}
+
+			// one void is the only thing in the list; remove it.
+			if ( containsVoid ) {
+				delete dwts.front();
+				dwts.clear();
+			}
 		}
 	}
@@ -383,6 +374,6 @@
 	void EnumAndPointerDecay::previsit( FunctionType *func ) {
 		// Fix up parameters and return types
-		fixFunctionList( func->get_parameters(), func );
-		fixFunctionList( func->get_returnVals(), func );
+		fixFunctionList( func->parameters, func->isVarArgs, func );
+		fixFunctionList( func->returnVals, false, func );
 	}
 
@@ -626,7 +617,6 @@
 			// apply FixFunction to every assertion to check for invalid void type
 			for ( DeclarationWithType *& assertion : type->assertions ) {
-				PassVisitor<FixFunction> fixer;
-				assertion = assertion->acceptMutator( fixer );
-				if ( fixer.pass.isVoid ) {
+				bool isVoid = fixFunction( assertion );
+				if ( isVoid ) {
 					throw SemanticError( "invalid type void in assertion of function ", node );
 				} // if
