diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c
index 9c06ff6a154859eda48f37f3dba0103b6d344b54..0643f77a953554322ae4b22f17f6447c5fc2b3c0 100644
--- a/src/cmd/gc/typecheck.c
+++ b/src/cmd/gc/typecheck.c
@@ -1517,6 +1517,11 @@ typecheckaste(int op, Type *tstruct, NodeList *nl, char *desc)
 	for(tl=tstruct->type; tl; tl=tl->down) {
 		t = tl->type;
 		if(tl->isddd) {
+			if(nl != nil && nl->n->isddd && !eqtype(nl->n->type, t)) {
+				// TODO(rsc): This is not actually illegal but will
+				// help catch bugs.
+				yyerror("cannot pass %+N as %T (... mismatch)", nl->n, tl);
+			}
 			if(nl != nil && nl->next == nil && nl->n->isddd && eqtype(nl->n->type, t))
 				goto out;
 			for(; nl; nl=nl->next) {
diff --git a/test/fixedbugs/bug252.go b/test/fixedbugs/bug252.go
new file mode 100644
index 0000000000000000000000000000000000000000..7ed8b87cbe0b386641237e5a8d58b098484d105b
--- /dev/null
+++ b/test/fixedbugs/bug252.go
@@ -0,0 +1,15 @@
+// errchk $G $D/$F.go
+
+// Copyright 2010 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+func f(args ...) {
+	g(args)	// ERROR "[.][.][.] mismatch"
+}
+
+func g(args ...interface{}) {
+	f(args)	// ERROR "[.][.][.] mismatch"
+}