The Go frontend relies on the ability to convert from one struct type
to another, which it does using VIEW_CONVERT_EXPR.  For complete type
safety doing this we need to mark struct types as using structural
equality, which we were not doing.  We mostly got away with this, but
https://golang.org/issue/23667 shows a case where that fails (many
test failures were caused by a single miscompilation in the library).
This patch changes the Go frontend to GCC interface to mark structs as
using structural equality.  Bootstrapped and ran Go testsuite on
x86_64-pc-linux-gnu and powerpc64le-unknown-linux-gnu.  Committed to
mainline.

Ian


2018-02-03  Ian Lance Taylor  <i...@golang.org>

* go-gcc.cc (Gcc_backend::fill_in_struct): Mark struct types as
using structural equality.
Index: gcc/go/go-gcc.cc
===================================================================
--- gcc/go/go-gcc.cc    (revision 257319)
+++ gcc/go/go-gcc.cc    (working copy)
@@ -962,6 +962,13 @@ Gcc_backend::fill_in_struct(Btype* fill,
     }
   TYPE_FIELDS(fill_tree) = field_trees;
   layout_type(fill_tree);
+
+  // Because Go permits converting between named struct types and
+  // equivalent struct types, for which we use VIEW_CONVERT_EXPR, and
+  // because we don't try to maintain TYPE_CANONICAL for struct types,
+  // we need to tell the middle-end to use structural equality.
+  SET_TYPE_STRUCTURAL_EQUALITY(fill_tree);
+
   return fill;
 }
 

Reply via email to