]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: correctly typecheck expression lists in returns.
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Thu, 16 Feb 2012 22:42:19 +0000 (23:42 +0100)
committerRémy Oudompheng <oudomphe@phare.normalesup.org>
Thu, 16 Feb 2012 22:42:19 +0000 (23:42 +0100)
Invalid return statements were accidentally compiling or
triggering internal errors.
Fixes #3044.

R=golang-dev, rsc
CC=golang-dev, remy
https://golang.org/cl/5673074

src/cmd/gc/typecheck.c
test/fixedbugs/bug418.go [new file with mode: 0644]

index b791c9e267274bc58676762b99459e3840ab3f40..5bb386d8e508cea00c805b4cc8e04c6fb9a7d83a 100644 (file)
@@ -1410,7 +1410,10 @@ reswitch:
 
        case ORETURN:
                ok |= Etop;
-               typechecklist(n->list, Erv | Efnstruct);
+               if(count(n->list) == 1)
+                       typechecklist(n->list, Erv | Efnstruct);
+               else
+                       typechecklist(n->list, Erv);
                if(curfn == N) {
                        yyerror("return outside function");
                        goto error;
diff --git a/test/fixedbugs/bug418.go b/test/fixedbugs/bug418.go
new file mode 100644 (file)
index 0000000..c7b758f
--- /dev/null
@@ -0,0 +1,22 @@
+// errchk $G $D/$F.go
+
+// Copyright 2012 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.
+
+// Issue 3044.
+// Multiple valued expressions in return lists.
+
+package p
+
+func Two() (a, b int)
+
+// F used to compile.
+func F() (x interface{}, y int) {
+       return Two(), 0 // ERROR "single-value context"
+}
+
+// Recursive used to trigger an internal compiler error.
+func Recursive() (x interface{}, y int) {
+       return Recursive(), 0 // ERROR "single-value context"
+}