From d09f80ae014613edb0197b36d94242f83da75696 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 9 Apr 2020 17:42:37 -0700 Subject: 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 --- gcc/go/gofrontend/MERGE | 2 +- gcc/go/gofrontend/expressions.cc | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) (limited to 'gcc/go') diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index c5e8b29..b3cc9ec 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -4a31d064fd6996f64b620104e849292af8f25e12 +b31fbf7d8f23508cfbd578c5c44b13eefd8f359e The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 42ad93b..deac874 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -16032,9 +16032,17 @@ Composite_literal_key_expression::do_lower(Gogo* gogo, Named_object*, Named_object* no = gogo->lookup(this->name_, NULL); 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()); + // Gogo::lookup doesn't look in the global namespace, and names + // used in composite literal keys aren't seen by + // 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()); } -- cgit v1.1