diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 0915152e5b3..caf0af58f1b 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -9931f2c150e2da4b7d468db332823d8ef4fb8c34 +4c676d965c19b9c5d5e5049d0f8070502e9c27b0 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc index d521fb1e2b7..0824102ccc1 100644 --- a/gcc/go/gofrontend/gogo.cc +++ b/gcc/go/gofrontend/gogo.cc @@ -3154,6 +3154,28 @@ Check_types_traverse::variable(Named_object* named_object) reason.c_str()); var->clear_init(); } + else if (init != NULL + && init->func_expression() != NULL) + { + Named_object* no = init->func_expression()->named_object(); + Function_type* fntype; + if (no->is_function()) + fntype = no->func_value()->type(); + else if (no->is_function_declaration()) + fntype = no->func_declaration_value()->type(); + else + go_unreachable(); + + // Builtin functions cannot be used as function values for variable + // initialization. + if (fntype->is_builtin()) + { + error_at(init->location(), + "invalid use of special builtin function %qs; " + "must be called", + no->message_name().c_str()); + } + } else if (!var->is_used() && !var->is_global() && !var->is_parameter()