Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision 538334a8bcf1d5f551c5fe85bd3e12d8e5f74aa5)
+++ src/ResolvExpr/Unify.cc	(revision 1dcd52a3b1a9c117e77099fbf3c110bd4fc97b85)
@@ -563,4 +563,8 @@
 			flatten( dcl->get_type(), back_inserter( types ) );
 			for ( Type * t : types ) {
+				// outermost const, volatile, _Atomic qualifiers in parameters should not play a role in the unification of function types, since they do not determine whether a function is callable.
+				// Note: MUST consider at least mutex qualifier, since functions can be overloaded on outermost mutex and a mutex function has different requirements than a non-mutex function.
+				t->get_qualifiers() -= Type::Qualifiers(Type::Const | Type::Volatile | Type::Atomic);
+
 				dst.push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::C, nullptr, t, nullptr ) );
 			}
Index: src/tests/tuple/tupleVariadic.c
===================================================================
--- src/tests/tuple/tupleVariadic.c	(revision 538334a8bcf1d5f551c5fe85bd3e12d8e5f74aa5)
+++ src/tests/tuple/tupleVariadic.c	(revision 1dcd52a3b1a9c117e77099fbf3c110bd4fc97b85)
@@ -95,4 +95,7 @@
 }
 
+forall(ttype T | { void foo(T); }) void bar(T x) {}
+void foo(int) {}
+
 int main() {
 	array * x0 = new();
@@ -117,4 +120,10 @@
 	func(3, 2.0, 111, 4.145);
 	printf("finished func\n");
+
+	{
+		// T = [const int] -- this ensures that void(*)(int) satisfies void(*)(const int)
+		const int x;
+		bar(x);
+	}
 }
 
