diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h --- a/libcxxabi/src/demangle/ItaniumDemangle.h +++ b/libcxxabi/src/demangle/ItaniumDemangle.h @@ -3188,15 +3188,6 @@ Node *SoFar = nullptr; while (!consumeIf('E')) { - consumeIf('L'); // extension - - if (consumeIf('M')) { - // := [] M - if (SoFar == nullptr) - return nullptr; - continue; - } - if (State) // Only set end-with-template on the case that does that. State->EndsWithTemplateArgs = false; @@ -3241,12 +3232,17 @@ return nullptr; continue; // Do not push a new substitution. } else { + consumeIf('L'); // extension // ::= [] SoFar = getDerived().parseUnqualifiedName(State, SoFar); } if (SoFar == nullptr) return nullptr; Subs.push_back(SoFar); + + // No longer used. + // := [] M + consumeIf('M'); } if (SoFar == nullptr || Subs.empty()) diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -29947,6 +29947,9 @@ "_ZN3CLSIiEIiEE", "_ZN3CLSDtLi0EEE", "_ZN3CLSIiEEvNS_T_Ev", + + "_ZN1fIiEEvNTUt_E", + "_ZNDTUt_Ev", }; const unsigned NI = sizeof(invalid_cases) / sizeof(invalid_cases[0]); diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h --- a/llvm/include/llvm/Demangle/ItaniumDemangle.h +++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h @@ -3188,15 +3188,6 @@ Node *SoFar = nullptr; while (!consumeIf('E')) { - consumeIf('L'); // extension - - if (consumeIf('M')) { - // := [] M - if (SoFar == nullptr) - return nullptr; - continue; - } - if (State) // Only set end-with-template on the case that does that. State->EndsWithTemplateArgs = false; @@ -3241,12 +3232,17 @@ return nullptr; continue; // Do not push a new substitution. } else { + consumeIf('L'); // extension // ::= [] SoFar = getDerived().parseUnqualifiedName(State, SoFar); } if (SoFar == nullptr) return nullptr; Subs.push_back(SoFar); + + // No longer used. + // := [] M + consumeIf('M'); } if (SoFar == nullptr || Subs.empty())