mirror of
https://github.com/golang/go
synced 2024-11-21 21:34:40 -07:00
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:
|
||||
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;
|
||||
|
22
test/fixedbugs/bug418.go
Normal file
22
test/fixedbugs/bug418.go
Normal file
@ -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
Block a user