Go patch committed: Fix missing return error for type switches

Message ID mcrtxj19vgi.fsf@iant-glaptop.roam.corp.google.com
State New
Headers show

Commit Message

Ian Taylor Aug. 7, 2013, 7:01 p.m.
The Go frontend gave an incorrect "missing return" error message for a
type switch with a case with multiple types, as in "case T1, T2:".  This
patch fixes that problem.  This patch also changes the "missing return"
error message to use the same text as the gc compiler, and reports it at
the end of the function rather than the start of the function, again to
match the gc compiler.  Bootstrapped and ran Go testsuite on
x86_64-unknown-linux-gnu.  Committed to mainline and 4.8 branch.



Index: gcc/go/gofrontend/gogo.cc
--- gcc/go/gofrontend/gogo.cc	(revision 201536)
+++ gcc/go/gofrontend/gogo.cc	(working copy)
@@ -3133,7 +3133,8 @@  Check_return_statements_traverse::functi
   if (func->block()->may_fall_through())
-    error_at(func->location(), "control reaches end of non-void function");
+    error_at(func->block()->end_location(),
+	     "missing return at end of function");
Index: gcc/go/gofrontend/statements.cc
--- gcc/go/gofrontend/statements.cc	(revision 201536)
+++ gcc/go/gofrontend/statements.cc	(working copy)
@@ -4093,6 +4093,16 @@  Type_case_clauses::Type_case_clause::low
 Type_case_clauses::Type_case_clause::may_fall_through() const
+  if (this->is_fallthrough_)
+    {
+      // This case means that we automatically fall through to the
+      // next case (it's used for T1 in case T1, T2:).  It does not
+      // mean that we fall through to the end of the type switch as a
+      // whole.  There is sure to be a next case and that next case
+      // will determine whether we fall through to the statements
+      // after the type switch.
+      return false;
+    }
   if (this->statements_ == NULL)
     return true;
   return this->statements_->may_fall_through();
Index: gcc/testsuite/go.test/test/fixedbugs/bug086.go
--- gcc/testsuite/go.test/test/fixedbugs/bug086.go	(revision 200210)
+++ gcc/testsuite/go.test/test/fixedbugs/bug086.go	(working copy)
@@ -6,12 +6,12 @@ 
 package main
-func f() int {	// ERROR "return|control"
+func f() int {
 	if false {
 		return 0;
 	// we should not be able to return successfully w/o a return statement
+} // ERROR "return"
 func main() {
 	print(f(), "\n");