This patch by Chris Manghane fixes the Go compiler to not crash when
it sees invalid builtin calls. This fixes
https://golang.org/issue/11544 . 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 227227)
+++ gcc/go/gofrontend/MERGE (working copy)
@@ -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: gcc/go/gofrontend/expressions.cc
===================================================================
--- gcc/go/gofrontend/expressions.cc (revision 227227)
+++ gcc/go/gofrontend/expressions.cc (working copy)
@@ -6588,7 +6588,11 @@ Builtin_call_expression::Builtin_call_ex
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_v
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: