Commit 1d44db18 by Ian Lance Taylor

compiler: Don't crash on malformed numeric constants.

    
    Fixes golang/go#11548.
    
    Reviewed-on: https://go-review.googlesource.com/13794

From-SVN: r227830
parent 48c6522f
01a574c1b2bb244be764b6a18aab980ca0aef43c 79f457a267ff2bf8e65db4bcec0cbc7add79227a
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -1904,6 +1904,13 @@ Integer_expression::do_check_types(Gogo*) ...@@ -1904,6 +1904,13 @@ Integer_expression::do_check_types(Gogo*)
Bexpression* Bexpression*
Integer_expression::do_get_backend(Translate_context* context) 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; Type* resolved_type = NULL;
if (this->type_ != NULL && !this->type_->is_abstract()) if (this->type_ != NULL && !this->type_->is_abstract())
resolved_type = this->type_; resolved_type = this->type_;
...@@ -2266,6 +2273,13 @@ Float_expression::do_check_types(Gogo*) ...@@ -2266,6 +2273,13 @@ Float_expression::do_check_types(Gogo*)
Bexpression* Bexpression*
Float_expression::do_get_backend(Translate_context* context) 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; Type* resolved_type;
if (this->type_ != NULL && !this->type_->is_abstract()) if (this->type_ != NULL && !this->type_->is_abstract())
resolved_type = this->type_; resolved_type = this->type_;
...@@ -2448,6 +2462,13 @@ Complex_expression::do_check_types(Gogo*) ...@@ -2448,6 +2462,13 @@ Complex_expression::do_check_types(Gogo*)
Bexpression* Bexpression*
Complex_expression::do_get_backend(Translate_context* context) 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; Type* resolved_type;
if (this->type_ != NULL && !this->type_->is_abstract()) if (this->type_ != NULL && !this->type_->is_abstract())
resolved_type = this->type_; resolved_type = this->type_;
...@@ -2826,8 +2847,12 @@ Const_expression::do_check_types(Gogo*) ...@@ -2826,8 +2847,12 @@ Const_expression::do_check_types(Gogo*)
Bexpression* Bexpression*
Const_expression::do_get_backend(Translate_context* context) Const_expression::do_get_backend(Translate_context* context)
{ {
if (this->type_ != NULL && this->type_->is_error()) if (this->is_error_expression()
return context->backend()->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 // 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 // object is an abstract int or float, we try to get the abstract
......
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