In the Go frontend, 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.
The test case is https://golang.org/cl/227783.  Bootstrapped and ran
Go testsuite on x86_64-pc-linux-gnu.  Committed to mainline.

Ian
4c3e7ca2e90b9339a2aca677be568312b9d076d2
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index c5e8b29879e..b3cc9ecb9d1 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 42ad93b9830..deac87448f3 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());
 }

Reply via email to