Commit 2e2fc3bd by Ian Lance Taylor

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
parent d459fde2
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.
...@@ -3154,6 +3154,28 @@ Check_types_traverse::variable(Named_object* named_object) ...@@ -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()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment