compiler: Check for initialization cycles in bound method expressions.
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 16 Oct 2014 18:57:14 +0000 (18:57 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 16 Oct 2014 18:57:14 +0000 (18:57 +0000)
Fixes issue 7961.

From-SVN: r216342

gcc/go/gofrontend/gogo.cc

index 4c7eca4b247e412ab9953d258e8024d877ca675a..02a980607feed2e744a996f70435eb1377cc36b1 100644 (file)
@@ -953,13 +953,14 @@ Find_var::expression(Expression** pexpr)
        }
     }
 
-  // We traverse the code of any function we see.  Note that this
-  // means that we will traverse the code of a function whose address
-  // is taken even if it is not called.
+  // We traverse the code of any function or bound method we see.  Note that
+  // this means that we will traverse the code of a function or bound method
+  // whose address is taken even if it is not called.
   Func_expression* fe = e->func_expression();
-  if (fe != NULL)
+  Bound_method_expression* bme = e->bound_method_expression();
+  if (fe != NULL || bme != NULL)
     {
-      const Named_object* f = fe->named_object();
+      const Named_object* f = fe != NULL ? fe->named_object() : bme->function();
       if (f->is_function() && f->package() == NULL)
        {
          std::pair<Seen_objects::iterator, bool> ins =