Commit d09f80ae by Ian Lance Taylor

compiler: look up composite literal keys in the global namespace

A composite literal key may not have a global definition, so
Gogo::define_global_names may not see it.  In order to correctly
handle the case in which a predeclared identifier is used as a
composite literal key, do an explicit check of the global namespace.

Test case is https://golang.org/cl/227783.

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/227784
parent fef3d8b4
4a31d064fd6996f64b620104e849292af8f25e12 b31fbf7d8f23508cfbd578c5c44b13eefd8f359e
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.
...@@ -16032,9 +16032,17 @@ Composite_literal_key_expression::do_lower(Gogo* gogo, Named_object*, ...@@ -16032,9 +16032,17 @@ Composite_literal_key_expression::do_lower(Gogo* gogo, Named_object*,
Named_object* no = gogo->lookup(this->name_, NULL); Named_object* no = gogo->lookup(this->name_, NULL);
if (no == NULL) if (no == NULL)
{ {
go_error_at(this->location(), "reference to undefined name %qs", // Gogo::lookup doesn't look in the global namespace, and names
Gogo::message_name(this->name_).c_str()); // used in composite literal keys aren't seen by
return Expression::make_error(this->location()); // Gogo::define_global_names, so we have to look in the global
// namespace ourselves.
no = gogo->lookup_global(Gogo::unpack_hidden_name(this->name_).c_str());
if (no == NULL)
{
go_error_at(this->location(), "reference to undefined name %qs",
Gogo::message_name(this->name_).c_str());
return Expression::make_error(this->location());
}
} }
return Expression::make_unknown_reference(no, this->location()); return Expression::make_unknown_reference(no, this->location());
} }
......
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