Go patch committed: Avoid generating unnamed bool type descriptor

Ian Lance Taylor iant@golang.org
Sat Jul 11 19:42:09 GMT 2020


This patch to the Go frontend avoids generating a type descriptor for
the unnamed abstract boolean type.  We were generating it in cases
where a boolean expression was converted directly to an empty
interface type, which caused equality comparisons to fail.  This patch
adds a check that we never generate a type descriptor for an unnamed
abstract type.  The test case is https://golang.org/cl/242000.  This
fixes https://golang.org/issue/40152.  Bootstrapped and ran Go
testsuite on x86_64-pc-linux-gnu.  Committed to mainline.

Ian
-------------- next part --------------
e109f6e438b72ef3e403162971068d28d09b82f5
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index c65fd8eecfc..7bec9a8a78e 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -1,4 +1,4 @@
-ce70fa16a73e3f162de01deab6b5d17783e6b76b
+9703ad5fa23ca63062cb403bd12bc7da4d7845bd
 
 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 deac87448f3..327f9403b39 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -6041,10 +6041,7 @@ Binary_expression::do_lower(Gogo* gogo, Named_object*,
 						     &right_nc, location,
 						     &result))
 	      return this;
-	    return Expression::make_cast(Type::make_boolean_type(),
-					 Expression::make_boolean(result,
-								  location),
-					 location);
+	    return Expression::make_boolean(result, location);
 	  }
 	else
 	  {
diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc
index 212ef45a29c..c1021e5679c 100644
--- a/gcc/go/gofrontend/gogo.cc
+++ b/gcc/go/gofrontend/gogo.cc
@@ -3309,7 +3309,11 @@ Remove_deadcode::expression(Expression** pexpr)
       && be->boolean_constant_value(&bval)
       && (be->op() == OPERATOR_ANDAND
           || be->op() == OPERATOR_OROR))
-    *pexpr = Expression::make_boolean(bval, be->location());
+    {
+      *pexpr = Expression::make_boolean(bval, be->location());
+      Type_context context(NULL, false);
+      (*pexpr)->determine_type(&context);
+    }
   return TRAVERSE_CONTINUE;
 }
 
diff --git a/gcc/go/gofrontend/names.cc b/gcc/go/gofrontend/names.cc
index a721a364212..1f0a54502db 100644
--- a/gcc/go/gofrontend/names.cc
+++ b/gcc/go/gofrontend/names.cc
@@ -975,7 +975,14 @@ Gogo::type_descriptor_name(const Type* type, Named_type* nt)
     return "unsafe.Pointer..d";
 
   if (nt == NULL)
-    return "type.." + type->mangled_name(this);
+    {
+      // Sanity check: we should never generate a type descriptor for
+      // an unnamed primitive type.  For those we should always be
+      // using a named type, like "int".
+      go_assert(!type->is_basic_type());
+
+      return "type.." + type->mangled_name(this);
+    }
 
   std::string ret;
   Named_object* no = nt->named_object();


More information about the Gcc-patches mailing list