This patch by Chris Manghane fixes the Go frontend to avoid an infinite loop when reporting an initialization loop. This is Go issue 7558. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian
diff -r 4a641c29091f go/gogo.cc --- a/go/gogo.cc Wed Jan 21 20:07:40 2015 -0800 +++ b/go/gogo.cc Thu Jan 22 08:43:48 2015 -0800 @@ -1089,6 +1089,7 @@ // 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 @@ 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