Commit 364ed4ba by Ian Lance Taylor

compiler: Fix "missing return" error for case T1, T2 in type switches.

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
parent 5cf6635b
......@@ -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;
}
......
......@@ -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();
......
......@@ -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");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment