compiler: Don't allow builtin function values.

According to the spec, http://golang.org/ref/spec#Built-in_functions:
    "built-in functions do not have standard Go types, so they can only
    appear in call expressions; they cannot be used as function values."
    
    Fixes golang/go#11570.
    
    Reviewed-on: https://go-review.googlesource.com/12543

From-SVN: r226448
This commit is contained in:
Ian Lance Taylor 2015-07-31 17:52:38 +00:00
parent d459fde28f
commit 2e2fc3bd51
2 changed files with 23 additions and 1 deletions

View File

@ -1,4 +1,4 @@
9931f2c150e2da4b7d468db332823d8ef4fb8c34 4c676d965c19b9c5d5e5049d0f8070502e9c27b0
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.

View File

@ -3154,6 +3154,28 @@ Check_types_traverse::variable(Named_object* named_object)
reason.c_str()); reason.c_str());
var->clear_init(); 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() else if (!var->is_used()
&& !var->is_global() && !var->is_global()
&& !var->is_parameter() && !var->is_parameter()