compiler: Avoid infinite recursion when describing initialization loops.
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 22 Jan 2015 17:11:36 +0000 (17:11 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 22 Jan 2015 17:11:36 +0000 (17:11 +0000)
Fixes infinite recursion from golang/go#7558.

From-SVN: r220009

gcc/go/gofrontend/gogo.cc

index 7bc54fcd658be09a1ba1e7b2e4f9935ebb989fad..252560d9e353ccd7194fd7d5032e079b843d51f5 100644 (file)
@@ -1089,6 +1089,7 @@ sort_var_inits(Gogo* gogo, Var_inits* var_inits)
   // variable initializations that depend on it.
   typedef std::map<Var_init, std::set<Var_init*> > Init_deps;
   Init_deps init_deps;
+  bool init_loop = false;
   for (Var_inits::iterator p1 = var_inits->begin();
        p1 != var_inits->end();
        ++p1)
@@ -1137,14 +1138,15 @@ sort_var_inits(Gogo* gogo, Var_inits* var_inits)
                           p2var->message_name().c_str());
                  inform(p2->var()->location(), "%qs defined here",
                         p2var->message_name().c_str());
-                 p2 = var_inits->end();
+                 init_loop = true;
+                 break;
                }
            }
        }
     }
 
   // If there are no dependencies then the declaration order is sorted.
-  if (!init_deps.empty())
+  if (!init_deps.empty() && !init_loop)
     {
       // Otherwise, sort variable initializations by emitting all variables with
       // no dependencies in declaration order. VAR_INITS is already in