diff --git a/llvm/lib/Demangle/MicrosoftDemangle.cpp b/llvm/lib/Demangle/MicrosoftDemangle.cpp index e7872b3bebc3..8b253bf67bcf 100644 --- a/llvm/lib/Demangle/MicrosoftDemangle.cpp +++ b/llvm/lib/Demangle/MicrosoftDemangle.cpp @@ -2165,11 +2165,13 @@ Name *Demangler::demangleAnonymousNamespaceName(StringView &MangledName) { Name *Node = Arena.alloc(); Node->Str = "`anonymous namespace'"; - if (MangledName.consumeFront('@')) - return Node; - - Error = true; - return nullptr; + size_t EndPos = MangledName.find('@'); + if (EndPos == StringView::npos) { + Error = true; + return nullptr; + } + MangledName = MangledName.substr(EndPos + 1); + return Node; } Name *Demangler::demangleLocallyScopedNamePiece(StringView &MangledName) { diff --git a/llvm/test/Demangle/ms-basic.test b/llvm/test/Demangle/ms-basic.test index 972a8b7749ae..285334fb4f1d 100644 --- a/llvm/test/Demangle/ms-basic.test +++ b/llvm/test/Demangle/ms-basic.test @@ -228,3 +228,5 @@ ??_V@YAXPEAXAEAVklass@@@Z ; CHECK: void __cdecl operator delete[](void *, class klass &) +; ?A@?A0x43583946@@3VB@@B +class B const `anonymous namespace'::A \ No newline at end of file