compiler: look up composite literal keys in the global namespace
authorIan Lance Taylor <iant@golang.org>
Fri, 10 Apr 2020 00:42:37 +0000 (17:42 -0700)
committerIan Lance Taylor <iant@golang.org>
Fri, 10 Apr 2020 01:19:11 +0000 (18:19 -0700)
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
gcc/go/gofrontend/expressions.cc

index c5e8b29879eb8dc987324d9a14bdfcabbbc5029e..b3cc9ecb9d16dff284f7043e7d1fe49ceda8893e 100644 (file)
@@ -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.
index 42ad93b98305717d3ba11870ce34ba967420a26a..deac87448f33e42f7ddf7c9ae7ce890487839a14 100644 (file)
@@ -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());
 }