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
-1cb26dc898bda1e85f4dd2ee204adbce792e4813
+e069d4417a692c1261df99fe3323277e1a0193d2
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
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();
}
Type* type = this->channel_->type();
if (type->is_error())
{
+ go_assert(saw_errors());
this->set_is_error();
return;
}
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