This patch by Chris Manghane fixes the Go frontend to not crash on malformed numeric constants. This fixes https://golang.org/issue/11548 . Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 227813) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -01a574c1b2bb244be764b6a18aab980ca0aef43c +79f457a267ff2bf8e65db4bcec0cbc7add79227a The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: gcc/go/gofrontend/expressions.cc =================================================================== --- gcc/go/gofrontend/expressions.cc (revision 227813) +++ gcc/go/gofrontend/expressions.cc (working copy) @@ -1904,6 +1904,13 @@ Integer_expression::do_check_types(Gogo* Bexpression* Integer_expression::do_get_backend(Translate_context* context) { + if (this->is_error_expression() + || (this->type_ != NULL && this->type_->is_error_type())) + { + go_assert(saw_errors()); + return context->gogo()->backend()->error_expression(); + } + Type* resolved_type = NULL; if (this->type_ != NULL && !this->type_->is_abstract()) resolved_type = this->type_; @@ -2266,6 +2273,13 @@ Float_expression::do_check_types(Gogo*) Bexpression* Float_expression::do_get_backend(Translate_context* context) { + if (this->is_error_expression() + || (this->type_ != NULL && this->type_->is_error_type())) + { + go_assert(saw_errors()); + return context->gogo()->backend()->error_expression(); + } + Type* resolved_type; if (this->type_ != NULL && !this->type_->is_abstract()) resolved_type = this->type_; @@ -2448,6 +2462,13 @@ Complex_expression::do_check_types(Gogo* Bexpression* Complex_expression::do_get_backend(Translate_context* context) { + if (this->is_error_expression() + || (this->type_ != NULL && this->type_->is_error_type())) + { + go_assert(saw_errors()); + return context->gogo()->backend()->error_expression(); + } + Type* resolved_type; if (this->type_ != NULL && !this->type_->is_abstract()) resolved_type = this->type_; @@ -2826,8 +2847,12 @@ Const_expression::do_check_types(Gogo*) Bexpression* Const_expression::do_get_backend(Translate_context* context) { - if (this->type_ != NULL && this->type_->is_error()) - return context->backend()->error_expression(); + if (this->is_error_expression() + || (this->type_ != NULL && this->type_->is_error())) + { + go_assert(saw_errors()); + return context->backend()->error_expression(); + } // If the type has been set for this expression, but the underlying // object is an abstract int or float, we try to get the abstract