compiler: add types used by inline functions to export data
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 27 Nov 2018 21:37:42 +0000 (21:37 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 27 Nov 2018 21:37:42 +0000 (21:37 +0000)
    Reviewed-on: https://go-review.googlesource.com/c/150069

From-SVN: r266531

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/export.cc

index 9947fcf68a1826e018afd67d0bce51fd0bbbc555..9ad1464fe57b482c3c7a79de1048c7ec43ab1888 100644 (file)
@@ -1,4 +1,4 @@
-c11d9528a0846293e4d615c86fc773c97252fdce
+21cf8069ceb078de54cc43ac25c9c89bd15cba56
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index fde240380da88bf31822e168f4e44315917065a9..d021ac4c6b151e98ab69e69ecdc3679adb26d307 100644 (file)
@@ -290,6 +290,11 @@ Find_types_to_prepare::type(Type* type)
   if (type->is_void_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())
+    return TRAVERSE_SKIP_COMPONENTS;
+
   if (!this->exp_->set_type_index(type))
     {
       // We've already seen this type.
@@ -367,7 +372,12 @@ Find_types_to_prepare::traverse_named_type(Named_type* nt)
             methods->begin_definitions();
           pm != methods->end_definitions();
           ++pm)
-       this->traverse_function((*pm)->func_value()->type());
+       {
+         Function* fn = (*pm)->func_value();
+         this->traverse_function(fn->type());
+         if (fn->export_for_inlining())
+           fn->block()->traverse(this);
+       }
 
       for (Bindings::const_declarations_iterator pm =
             methods->begin_declarations();
@@ -434,7 +444,12 @@ Export::prepare_types(const std::vector<Named_object*>* exports,
          break;
 
        case Named_object::NAMED_OBJECT_FUNC:
-         find.traverse_function(no->func_value()->type());
+         {
+           Function* fn = no->func_value();
+           find.traverse_function(fn->type());
+           if (fn->export_for_inlining())
+             fn->block()->traverse(&find);
+         }
          break;
 
        case Named_object::NAMED_OBJECT_FUNC_DECLARATION: