Go patch committed: Include constant types during export processing
diff mbox series

Message ID CAOyqgcWQyG1Cv0L4eCyAtv42vCvBjGjn1dJXYYd+Ynr3KvM+NQ@mail.gmail.com
State New
Headers show
Series
  • Go patch committed: Include constant types during export processing
Related show

Commit Message

Ian Lance Taylor Oct. 4, 2019, 6:14 p.m. UTC
This patch to the Go frontend by Than McIntosh includes selected
constant types during export processing.  The machinery that collects
types referenced by expressions that are part of inlinable function
bodies was missing the types of local named constants in certain
cases.  This patch updates the Collect_export_references::expression()
hook to look for references to local named constants and include their
types in the exported set.  This fixes https://golang.org/issue/34577.
Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu.  Committed
to mainline.

Ian

Patch
diff mbox series

Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE	(revision 276579)
+++ gcc/go/gofrontend/MERGE	(working copy)
@@ -1,4 +1,4 @@ 
-441f3f1f350b532707c48273d7f454cf1c4e959f
+ddfb845fad1f2e8b84383f262ed5ea5be7b3e35a
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: gcc/go/gofrontend/export.cc
===================================================================
--- gcc/go/gofrontend/export.cc	(revision 276382)
+++ gcc/go/gofrontend/export.cc	(working copy)
@@ -249,6 +249,14 @@  Collect_export_references::expression(Ex
       return TRAVERSE_CONTINUE;
     }
 
+  const Named_object* nco = expr->named_constant();
+  if (nco != 0 && nco->package() == NULL)
+    {
+      const Named_constant *nc = nco->const_value();
+      Type::traverse(nc->type(), this);
+      return TRAVERSE_CONTINUE;
+    }
+
   return TRAVERSE_CONTINUE;
 }
 
@@ -322,6 +330,10 @@  Collect_export_references::type(Type* ty
   if (type->is_void_type())
     return TRAVERSE_SKIP_COMPONENTS;
 
+  // Skip the nil type, turns up in function bodies.
+  if (type->is_nil_type())
+    return TRAVERSE_SKIP_COMPONENTS;
+
   // Skip abstract types.  We should never see these in real code,
   // only in things like const declarations.
   if (type->is_abstract())
Index: gcc/go/gofrontend/expressions.cc
===================================================================
--- gcc/go/gofrontend/expressions.cc	(revision 276579)
+++ gcc/go/gofrontend/expressions.cc	(working copy)
@@ -3234,6 +3234,10 @@  class Const_expression : public Expressi
   named_object()
   { return this->constant_; }
 
+  const Named_object*
+  named_object() const
+  { return this->constant_; }
+
   // Check that the initializer does not refer to the constant itself.
   void
   check_for_init_loop();
@@ -16782,6 +16786,15 @@  Expression::is_local_variable() const
 	  || (no->is_variable() && !no->var_value()->is_global()));
 }
 
+const Named_object*
+Expression::named_constant() const
+{
+  if (this->classification() != EXPRESSION_CONST_REFERENCE)
+    return NULL;
+  const Const_expression* ce = static_cast<const Const_expression*>(this);
+  return ce->named_object();
+}
+
 // Class Type_guard_expression.
 
 // Traversal.
Index: gcc/go/gofrontend/expressions.h
===================================================================
--- gcc/go/gofrontend/expressions.h	(revision 276382)
+++ gcc/go/gofrontend/expressions.h	(working copy)
@@ -587,6 +587,11 @@  class Expression
   boolean_constant_value(bool* val) const
   { return this->do_boolean_constant_value(val); }
 
+  // If this is a const reference expression, return the named
+  // object to which the expression refers, otherwise return NULL.
+  const Named_object*
+  named_constant() const;
+
   // This is called if the value of this expression is being
   // discarded.  This issues warnings about computed values being
   // unused.  This returns true if all is well, false if it issued an