Commit a78eb72a by Ian Lance Taylor

compiler: Issue channel type errors earlier.

    
    When asking for the type of a receive operation, the compiler would
    return an error type if the receive operator was being used on an
    invalid channel type and the error would be reported in a later pass.
    There are several ways that the type checking pass would not see
    the original node and fail to issue the error.  This patch modifies
    receive operations to give an error immediately once it is known that
    the channel type is invalid.
    
    Fixes golang/go#12323.
    
    Reviewed-on: https://go-review.googlesource.com/13987

From-SVN: r227863
parent 4fb94ef9
1cb26dc898bda1e85f4dd2ee204adbce792e4813
e069d4417a692c1261df99fe3323277e1a0193d2
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
......@@ -13502,9 +13502,14 @@ Expression::make_heap_expression(Expression* expr, Location location)
Type*
Receive_expression::do_type()
{
if (this->is_error_expression())
return Type::make_error_type();
Channel_type* channel_type = this->channel_->type()->channel_type();
if (channel_type == NULL)
return Type::make_error_type();
{
this->report_error(_("expected channel"));
return Type::make_error_type();
}
return channel_type->element_type();
}
......@@ -13516,6 +13521,7 @@ Receive_expression::do_check_types(Gogo*)
Type* type = this->channel_->type();
if (type->is_error())
{
go_assert(saw_errors());
this->set_is_error();
return;
}
......
......@@ -3856,7 +3856,10 @@ Switch_statement::do_lower(Gogo*, Named_object*, Block* enclosing,
if (this->val_ != NULL
&& (this->val_->is_error_expression()
|| this->val_->type()->is_error()))
return Statement::make_error_statement(loc);
{
go_assert(saw_errors());
return Statement::make_error_statement(loc);
}
if (this->val_ != NULL
&& this->val_->type()->integer_type() != NULL
......
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