compiler: Fix "missing return" error for case T1, T2 in type switches.
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 7 Aug 2013 19:01:16 +0000 (19:01 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 7 Aug 2013 19:01:16 +0000 (19:01 +0000)
Also change the "missing return" text and report it at the end
of the function, rather than the start, to match the gc
compiler.

From-SVN: r201579

gcc/go/gofrontend/gogo.cc
gcc/go/gofrontend/statements.cc
gcc/testsuite/go.test/test/fixedbugs/bug086.go

index 0b69d5d..4e5bd44 100644 (file)
@@ -3133,7 +3133,8 @@ Check_return_statements_traverse::function(Named_object* no)
     return TRAVERSE_CONTINUE;
 
   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");
 
   return TRAVERSE_CONTINUE;
 }
index ca1ad07..7314918 100644 (file)
@@ -4093,6 +4093,16 @@ Type_case_clauses::Type_case_clause::lower(Type* switch_val_type,
 bool
 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 fc69e0e..40d2362 100644 (file)
@@ -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");