From 1d3ca9236e93c8e0ba3cd7f14b758fc2c791ad34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Oudompheng?= Date: Thu, 16 Feb 2012 23:42:19 +0100 Subject: [PATCH] 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 --- src/cmd/gc/typecheck.c | 5 ++++- test/fixedbugs/bug418.go | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/bug418.go diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c index b791c9e2672..5bb386d8e50 100644 --- a/src/cmd/gc/typecheck.c +++ b/src/cmd/gc/typecheck.c @@ -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 index 00000000000..c7b758feb3b --- /dev/null +++ b/test/fixedbugs/bug418.go @@ -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" +}