Index: llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp =================================================================== --- llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp +++ llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp @@ -1276,12 +1276,16 @@ return nullptr; } +// Returns MangledName's prefix before the first '@', or an error if +// MangledName contains no '@' or the prefix has length 0. StringView Demangler::demangleSimpleString(StringView &MangledName, bool Memorize) { StringView S; for (size_t i = 0; i < MangledName.size(); ++i) { if (MangledName[i] != '@') continue; + if (i == 0) + break; S = MangledName.substr(0, i); MangledName = MangledName.dropFront(i + 1); Index: llvm/trunk/test/Demangle/invalid-manglings.test =================================================================== --- llvm/trunk/test/Demangle/invalid-manglings.test +++ llvm/trunk/test/Demangle/invalid-manglings.test @@ -8,4 +8,9 @@ ?f0@@YAXPEU?$AS_@$00$$CAD@__clang@@@Z ; CHECK-EMPTY: ; CHECK-NEXT: ?f0@@YAXPEU?$AS_@$00$$CAD@__clang@@@Z -; CHECK-NEXT: error: Invalid mangled name \ No newline at end of file +; CHECK-NEXT: error: Invalid mangled name + +?@@8 +; CHECK-EMPTY: +; CHECK-NEXT: ?@@8 +; CHECK-NEXT: error: Invalid mangled name