compiler: Don't crash on malformed numeric constants.
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 16 Sep 2015 17:21:33 +0000 (17:21 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 16 Sep 2015 17:21:33 +0000 (17:21 +0000)
    Fixes golang/go#11548.

    Reviewed-on: https://go-review.googlesource.com/13794

From-SVN: r227830

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/expressions.cc

index bcaabac4b9cf85aa85ec26f5eef9a028a36ea836..fb61c64ea310ebdac4e7de6a876579846df3b2b4 100644 (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.
index 1c329b83050c5d52c494f401852f2f89791a2cc2..49d4d27071a601d565c70fe7479544769e2c56d6 100644 (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