The Go spec says that builtin functions may not be referenced other than being called. This patch from Chris Manghane implements that restriction in the Go frontend. This fixes https://golang.org/issue/11570 . 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 226366) +++ gcc/go/gofrontend/MERGE (working copy) @@ -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. Index: gcc/go/gofrontend/gogo.cc =================================================================== --- gcc/go/gofrontend/gogo.cc (revision 226009) +++ gcc/go/gofrontend/gogo.cc (working copy) @@ -3154,6 +3154,28 @@ Check_types_traverse::variable(Named_obj 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()