compiler: Don't crash on malformed numeric constants.

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

From-SVN: r227830
This commit is contained in:
Ian Lance Taylor 2015-09-16 17:21:33 +00:00
parent 48c6522f71
commit 1d44db181f
2 changed files with 28 additions and 3 deletions

View File

@ -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.

View File

@ -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