Index: src/tests/.expect/tuplePolymorphism.txt
===================================================================
--- src/tests/.expect/tuplePolymorphism.txt	(revision dc0557d7d57a0121d00fa3670ea7cf78d4c447b2)
+++ src/tests/.expect/tuplePolymorphism.txt	(revision ebb5ed97e24d201a4b63b9fcebd313093b1bf3bc)
@@ -3,2 +3,3 @@
 123 999.123 456
 246 1998.25 912
+1.21 x 10.21 1111 v 54385938 1111 v 54385938
Index: src/tests/tuplePolymorphism.c
===================================================================
--- src/tests/tuplePolymorphism.c	(revision dc0557d7d57a0121d00fa3670ea7cf78d4c447b2)
+++ src/tests/tuplePolymorphism.c	(revision ebb5ed97e24d201a4b63b9fcebd313093b1bf3bc)
@@ -14,4 +14,23 @@
 //
 
+// packed is needed so that structs are not passed with the same alignment as function arguments
+__attribute__((packed)) struct A {
+  double x;
+  char y;
+  double z;
+};
+
+__attribute__((packed)) struct B {
+  long long x;
+  char y;
+  long long z;
+};
+
+// ensure that f is a viable candidate for g, even though its parameter structure does not exactly match
+[A] f([A, B] x, B y) { printf("%g %c %g %lld %c %lld %lld %c %lld\n", x.0.[x,y,z], x.1.[x,y,z], y.[x,y,z]); return x.0; }
+forall(otype T, otype U | { T f(T, U, U); })
+void g(T x, U y) { f(x, y, y); }
+
+// add two triples
 forall(otype T | { T ?+?(T, T); })
 [T, T, T] ?+?([T, T, T] x, [T, T, T] y) {
@@ -40,4 +59,7 @@
   [x1, x2, x3] = zzz+zzz;
   printf("%d %g %d\n", x1, x2, x3);
+
+  // ensure non-matching assertions are specialized correctly
+  g((A){ 1.21, 'x', 10.21}, (B){ 1111LL, 'v', 54385938LL });
 }
 
