compiler: Don't crash on invalid builtin calls.
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 27 Aug 2015 00:44:11 +0000 (00:44 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 27 Aug 2015 00:44:11 +0000 (00:44 +0000)
    Fixes golang/go#11544.

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

From-SVN: r227245

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

index b3fcc04206f104c191d9f739859cebdfb81a4258..f29ffd4c71e7ae9c4788d30e55ef87a131cf6597 100644 (file)
@@ -1,4 +1,4 @@
-cd5362c7bb0b207f484a8dfb8db229fd2bffef09
+5ee78e7d52a4cad0b23f5bc62e5b452489243c70
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 79b772e20a29362152a3d454349ed1955d140982..c18ae4a3b482d229064ba4f5d1bb0c1a0084cc77 100644 (file)
@@ -6588,7 +6588,11 @@ Builtin_call_expression::Builtin_call_expression(Gogo* gogo,
     recover_arg_is_set_(false)
 {
   Func_expression* fnexp = this->fn()->func_expression();
-  go_assert(fnexp != NULL);
+  if (fnexp == NULL)
+    {
+      this->code_ = BUILTIN_INVALID;
+      return;
+    }
   const std::string& name(fnexp->named_object()->name());
   if (name == "append")
     this->code_ = BUILTIN_APPEND;
@@ -6661,7 +6665,7 @@ Expression*
 Builtin_call_expression::do_lower(Gogo* gogo, Named_object* function,
                                  Statement_inserter* inserter, int)
 {
-  if (this->classification() == EXPRESSION_ERROR)
+  if (this->is_error_expression())
     return this;
 
   Location loc = this->location();
@@ -7500,11 +7504,13 @@ Builtin_call_expression::do_discarding_value()
 Type*
 Builtin_call_expression::do_type()
 {
+  if (this->is_error_expression())
+    return Type::make_error_type();
   switch (this->code_)
     {
     case BUILTIN_INVALID:
     default:
-      go_unreachable();
+      return Type::make_error_type();
 
     case BUILTIN_NEW:
     case BUILTIN_MAKE: