Index: llvm/lib/Demangle/MicrosoftDemangle.cpp =================================================================== --- llvm/lib/Demangle/MicrosoftDemangle.cpp +++ llvm/lib/Demangle/MicrosoftDemangle.cpp @@ -466,6 +466,10 @@ Demangler::demangleFunctionIdentifierCode(StringView &MangledName) { assert(MangledName.startsWith('?')); MangledName = MangledName.dropFront(); + if (MangledName.empty()) { + Error = true; + return nullptr; + } if (MangledName.consumeFront("__")) return demangleFunctionIdentifierCode( @@ -637,6 +641,7 @@ IdentifierNode * Demangler::demangleFunctionIdentifierCode(StringView &MangledName, FunctionIdentifierCodeGroup Group) { + assert(!MangledName.empty()); switch (Group) { case FunctionIdentifierCodeGroup::Basic: switch (char CH = MangledName.popFront()) { Index: llvm/test/Demangle/invalid-manglings.test =================================================================== --- llvm/test/Demangle/invalid-manglings.test +++ llvm/test/Demangle/invalid-manglings.test @@ -14,3 +14,8 @@ ; CHECK-EMPTY: ; CHECK-NEXT: ?@@8 ; CHECK-NEXT: error: Invalid mangled name + +?? +; CHECK-EMPTY: +; CHECK-NEXT: ?? +; CHECK-NEXT: error: Invalid mangled name