compiler: fix buglet in function inlining related to sink names
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 15 Nov 2019 03:28:49 +0000 (03:28 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 15 Nov 2019 03:28:49 +0000 (03:28 +0000)
    When the compiler writes an inlinable function to the export data,
    parameter names are written out (in Export::write_name) using the
    Gogo::message_name as opposed to a raw/encoded name. This means that
    sink parameters (those named "_") get created with the name "_"
    instead of "._" (the name created by the lexer/parser). This confuses
    Gogo::is_sink_name, which looks for the latter sequence and not just
    "_". This can cause issues later on if an inlinable function is
    imported and fed through the rest of the compiler (things that are
    sinks are no recognized as such). To fix these issues, change
    Gogo::is_sink_name to return true for either variants ("_" or "._").

    Fixes golang/go#35586.

    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/207259

From-SVN: r278275

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/gogo.h

index c9efcba01130850957350671715c65c12a030ca9..84a5db844e196b5aa2cd5a778d7747d2b97c91c0 100644 (file)
@@ -1,4 +1,4 @@
-1e2d98b27701744cf0ec57b19d7fc8f594184b9a
+2d0504236c7236345ee17a0cb43a3bb9ce3acf7f
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index e742b6eb8e3f9af07fd6422d4f19651b2063af0b..8b791168894686f236baa228da737a60a4360073 100644 (file)
@@ -222,7 +222,9 @@ class Gogo
   {
     return (name[0] == '.'
            && name[name.length() - 1] == '_'
-           && name[name.length() - 2] == '.');
+           && name[name.length() - 2] == '.')
+        || (name[0] == '_'
+            && name.length() == 1);
   }
 
   // Helper used when adding parameters (including receiver param) to the