From a552480298c7774ecaabcef34f8025f5d16fa31d Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Thu, 8 Oct 2015 03:02:09 +0000 Subject: [PATCH] Fix incorrect parsing of arguments for nested functions. Reviewed as http://reviews.llvm.org/D13192. Thanks to Anseny Kapoulkine for the patch. llvm-svn: 249649 --- libcxxabi/src/cxa_demangle.cpp | 5 +++-- libcxxabi/test/test_demangle.pass.cpp | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/libcxxabi/src/cxa_demangle.cpp b/libcxxabi/src/cxa_demangle.cpp index 2865bdeefe45..e6bf1675a2f9 100644 --- a/libcxxabi/src/cxa_demangle.cpp +++ b/libcxxabi/src/cxa_demangle.cpp @@ -4054,7 +4054,7 @@ parse_nested_name(const char* first, const char* last, C& db, // := _ # when number < 10 // := __ _ # when number >= 10 -// extension := decimal-digit+ +// extension := decimal-digit+ # at the end of string const char* parse_discriminator(const char* first, const char* last) @@ -4083,7 +4083,8 @@ parse_discriminator(const char* first, const char* last) const char* t1 = first+1; for (; t1 != last && std::isdigit(*t1); ++t1) ; - first = t1; + if (t1 == last) + first = last; } } return first; diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp index 8a4685accc51..7e845b10bfef 100644 --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -29593,6 +29593,7 @@ const char* cases[][2] = {"_ZNK3Ncr6Silver7Utility6detail12CallOnThreadIZ53-[DeploymentSetupController handleManualServerEntry:]E3$_5EclIJEEEDTclclL_ZNS2_4getTIS4_EERT_vEEspclsr3stdE7forwardIT_Efp_EEEDpOSA_", "decltype(-[DeploymentSetupController handleManualServerEntry:]::$_5& Ncr::Silver::Utility::detail::getT<-[DeploymentSetupController handleManualServerEntry:]::$_5>()()(std::forward<-[DeploymentSetupController handleManualServerEntry:]::$_5>(fp))) Ncr::Silver::Utility::detail::CallOnThread<-[DeploymentSetupController handleManualServerEntry:]::$_5>::operator()<>(-[DeploymentSetupController handleManualServerEntry:]::$_5&&) const"}, {"_Zli2_xy", "operator\"\" _x(unsigned long long)"}, {"_Z1fIiEDcT_", "decltype(auto) f(int)"}, + {"_ZZ4testvEN1g3fooE5Point", "test()::g::foo(Point)"}, }; const unsigned N = sizeof(cases) / sizeof(cases[0]);