summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libcxxabi/src/cxa_demangle.cpp2
-rw-r--r--libcxxabi/test/test_demangle.pass.cpp2
-rw-r--r--llvm/lib/Demangle/ItaniumDemangle.cpp2
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);
OpenPOWER on IntegriCloud