This patch by Cherry Zhang avoids double counting "." in nested_function_num in the Go frontend. Nested functions are named "outerfunc.$nestedN", where N is a number. nested_function_num extracts that number. The name is first passed to unpack_hidden_name, which handles the "." and should result "$nestedN". Don't expect the "." again.
This fixes an assertion failure when escape analysis is enabled and -fgo-debug-escape is on. The failure looks like go1: internal compiler error: in nested_function_num, at go/gofrontend/names.cc:241 0x7bd7d3 Gogo::nested_function_num(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline. Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 254476) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -1427cedcb0faa627fd89a75e009f7898c25aa86c +7fd845bd9414c348bfa30bd24aa0bb8e4eebf83a The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: gcc/go/gofrontend/names.cc =================================================================== --- gcc/go/gofrontend/names.cc (revision 254090) +++ gcc/go/gofrontend/names.cc (working copy) @@ -238,8 +238,8 @@ int Gogo::nested_function_num(const std::string& name) { std::string n(Gogo::unpack_hidden_name(name)); - go_assert(n.compare(0, 8, ".$nested") == 0); - return strtol(n.substr(8).c_str(), NULL, 0); + go_assert(n.compare(0, 7, "$nested") == 0); + return strtol(n.substr(7).c_str(), NULL, 0); } // Return the name to use for a sink function, a function whose name