diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c
index 68d2c3404da5a368514dd8a74944946ce7ec092c..3c27d991543d4e1865c6eacdc225fd6807a283ae 100644
--- a/src/cmd/gc/typecheck.c
+++ b/src/cmd/gc/typecheck.c
@@ -2814,7 +2814,7 @@ typecheckas2(Node *n)
 			n->op = OAS2FUNC;
 			t = structfirst(&s, &r->type);
 			for(ll=n->list; ll; ll=ll->next) {
-				if(ll->n->type != T)
+				if(t->type != T && ll->n->type != T)
 					checkassignto(t->type, ll->n);
 				if(ll->n->defn == n && ll->n->ntype == N)
 					ll->n->type = t->type;
diff --git a/test/fixedbugs/issue6572.go b/test/fixedbugs/issue6572.go
new file mode 100644
index 0000000000000000000000000000000000000000..e75da54c99bfeaeb6760fbc7c652e9f15167510a
--- /dev/null
+++ b/test/fixedbugs/issue6572.go
@@ -0,0 +1,21 @@
+// errorcheck
+
+// Copyright 2014 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 foo() (T, T) { // ERROR "undefined"
+	return 0, 0
+}
+
+func bar() (T, string, T) { // ERROR "undefined"
+	return 0, "", 0
+}
+
+func main() {
+	var x, y, z int
+	x, y = foo()
+	x, y, z = bar() // ERROR "cannot (use type|assign) string"
+}