compiler: fix parsing issue with non-ASCII first package char
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 28 Sep 2018 13:50:44 +0000 (13:50 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 28 Sep 2018 13:50:44 +0000 (13:50 +0000)
    Fix a bug in the parser code that decides whether a given name should
    be considered exported or not. The function Lex::is_exported_name
    (which assumes that its input is a mangled name) was being called on
    non-mangled (raw utf-8) names in various places. For the bug in
    question this caused an imported package to be registered under the
    wrong name. To fix the issue, rename 'Lex::is_exported_name' to
    'Lex::is_exported_mangled_name', and add a new 'Lex::is_exported_name'
    that works on utf-8 strings.

    Fixes golang/go#27836.

    Reviewed-on: https://go-review.googlesource.com/137736

From-SVN: r264690

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/import.cc
gcc/go/gofrontend/lex.cc
gcc/go/gofrontend/lex.h

index 8cb370f0aac7c2de830930f63e0e2a11a22c9967..590d2eb5b4e4ece00eab07fe4b6a59196e052215 100644 (file)
@@ -1,4 +1,4 @@
-944784a93cf89d3a238e5607c993ea5f18f99c12
+f4a224ec481957ca4f14d0e8cc4fe59cc95b3a49
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 7e06a3c085047d9531434756e805302ba307d7ee..f9586ac1600d19f43d16a13955a67a991f5e8966 100644 (file)
@@ -983,8 +983,6 @@ Import::read_name()
   std::string ret = this->read_identifier();
   if (ret == "?")
     ret.clear();
-  else if (!Lex::is_exported_name(ret))
-    ret = '.' + this->package_->pkgpath() + '.' + ret;
   return ret;
 }
 
index 3965f30d80810d556630817966840ac043a2e945..e641b7eaf39f33a1593905fd2b34b9f572cb50e9 100644 (file)
@@ -2764,7 +2764,7 @@ Lex::is_unicode_uppercase(unsigned int c)
 // mangled name which includes only ASCII characters.
 
 bool
-Lex::is_exported_name(const std::string& name)
+Lex::is_exported_mangled_name(const std::string& name)
 {
   unsigned char c = name[0];
   if (c != '.')
@@ -2791,6 +2791,18 @@ Lex::is_exported_name(const std::string& name)
     }
 }
 
+// Return whether the identifier NAME should be exported.  NAME is a
+// an unmangled utf-8 string and may contain non-ASCII characters.
+
+bool
+Lex::is_exported_name(const std::string& name)
+{
+  unsigned int uchar;
+  if (Lex::fetch_char(name.c_str(), &uchar) != 0)
+    return Lex::is_unicode_letter(uchar) && Lex::is_unicode_uppercase(uchar);
+  return false;
+}
+
 // Return whether the identifier NAME contains an invalid character.
 // This is based on how we handle invalid characters in
 // gather_identifier.
index 70f752b7326d298048ffd452cbe9939fad031be1..cf3de8d557564e24d9a333321311b0cb0d1d3965 100644 (file)
@@ -408,6 +408,11 @@ class Lex
   // Return whether the identifier NAME should be exported.  NAME is a
   // mangled name which includes only ASCII characters.
   static bool
+  is_exported_mangled_name(const std::string& name);
+
+  // Return whether the identifier NAME should be exported.  NAME is
+  // an unmangled utf-8 string and may contain non-ASCII characters.
+  static bool
   is_exported_name(const std::string& name);
 
   // Return whether the identifier NAME is invalid.  When we see an