mirror of https://github.com/golang/go.git
cmd/gc: correctly typecheck expression lists in returns.
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
This commit is contained in:
parent
f43d2b7fa8
commit
1d3ca9236e
|
|
@ -1410,7 +1410,10 @@ reswitch:
|
||||||
|
|
||||||
case ORETURN:
|
case ORETURN:
|
||||||
ok |= Etop;
|
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) {
|
if(curfn == N) {
|
||||||
yyerror("return outside function");
|
yyerror("return outside function");
|
||||||
goto error;
|
goto error;
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue