compiler: Type check params in sink function decl.

When a function is declared and named with the blank identifier, only
    the syntax is checked.  This patch modifies the parser to add a dummy
    node for each function declaration with a blank identifier name that
    will be type checked like any function declaration.
    
    Fixes golang/go#11535.
    
    Reviewed-on: https://go-review.googlesource.com/13792

From-SVN: r227160
This commit is contained in:
Ian Lance Taylor 2015-08-25 03:48:35 +00:00
parent cd0fea2ba9
commit e3552bf9f0
2 changed files with 14 additions and 2 deletions

View File

@ -1,4 +1,4 @@
cc7303c97b232ea979cab950d95aaf76c4e0f5b5 81810917af7ba19e1f9f8efc8b1989f7d6419d30
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

@ -2305,8 +2305,20 @@ Parse::function_decl(bool saw_nointerface)
if (!this->peek_token()->is_op(OPERATOR_LCURLY)) if (!this->peek_token()->is_op(OPERATOR_LCURLY))
{ {
if (named_object == NULL && !Gogo::is_sink_name(name)) if (named_object == NULL)
{ {
// Function declarations with the blank identifier as a name are
// mostly ignored since they cannot be called. We make an object
// for this declaration for type-checking purposes.
if (Gogo::is_sink_name(name))
{
static int count;
char buf[30];
snprintf(buf, sizeof buf, ".$sinkfndecl%d", count);
++count;
name = std::string(buf);
}
if (fntype == NULL if (fntype == NULL
|| (expected_receiver && rec == NULL)) || (expected_receiver && rec == NULL))
this->gogo_->add_erroneous_name(name); this->gogo_->add_erroneous_name(name);