diff --git a/go/expressions.cc b/go/expressions.cc index 542f3de6f..7ad271f10 100644 --- a/go/expressions.cc +++ b/go/expressions.cc @@ -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; } diff --git a/go/statements.cc b/go/statements.cc index 5d102bf2e..a84203a5f 100644 --- a/go/statements.cc +++ b/go/statements.cc @@ -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