diff options
-rw-r--r-- | libcxxabi/src/cxa_demangle.cpp | 2 | ||||
-rw-r--r-- | libcxxabi/test/test_demangle.pass.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Demangle/ItaniumDemangle.cpp | 2 |
3 files changed, 6 insertions, 0 deletions
diff --git a/libcxxabi/src/cxa_demangle.cpp b/libcxxabi/src/cxa_demangle.cpp index 1007d7efaef..3a7ee061c94 100644 --- a/libcxxabi/src/cxa_demangle.cpp +++ b/libcxxabi/src/cxa_demangle.cpp @@ -4935,6 +4935,8 @@ Node *Db::parse() { bool RequireNumber = consumeIf('_'); if (parseNumber().empty() && RequireNumber) return nullptr; + if (look() == '.') + First = Last; if (numLeft() != 0) return nullptr; return make<SpecialName>("invocation function for block in ", Encoding); diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp index 305e179f90c..7c1fd2dd669 100644 --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -29753,6 +29753,8 @@ const char* cases[][2] = // reference collapsing: {"_Z1fIR1SEiOT_", "int f<S&>(S&)"}, {"_Z1fIJR1SS0_EEiDpOT_", "int f<S&, S>(S&, S&&)"}, + + {"___Z3foo_block_invoke.25", "invocation function for block in foo"}, }; const unsigned N = sizeof(cases) / sizeof(cases[0]); diff --git a/llvm/lib/Demangle/ItaniumDemangle.cpp b/llvm/lib/Demangle/ItaniumDemangle.cpp index 72e4b56c05e..98b92b04a26 100644 --- a/llvm/lib/Demangle/ItaniumDemangle.cpp +++ b/llvm/lib/Demangle/ItaniumDemangle.cpp @@ -4924,6 +4924,8 @@ Node *Db::parse() { bool RequireNumber = consumeIf('_'); if (parseNumber().empty() && RequireNumber) return nullptr; + if (look() == '.') + First = Last; if (numLeft() != 0) return nullptr; return make<SpecialName>("invocation function for block in ", Encoding); |