diff --git a/libcxxabi/src/cxa_demangle.cpp b/libcxxabi/src/cxa_demangle.cpp index f10f6a3a2338..429b3c710c0f 100644 --- a/libcxxabi/src/cxa_demangle.cpp +++ b/libcxxabi/src/cxa_demangle.cpp @@ -1022,8 +1022,6 @@ parse_base_unresolved_name(const char* first, const char* last, C& db) db.names.back().first += std::move(args); } } - else - first = t; } else { @@ -2071,7 +2069,7 @@ parse_type(const char* first, const char* last, C& db) size_t k0 = db.names.size(); t = parse_type(first+2, last, db); size_t k1 = db.names.size(); - if (t != first+1) + if (t != first+2) { db.subs.emplace_back(db.names.get_allocator()); for (size_t k = k0; k < k1; ++k) @@ -3841,7 +3839,7 @@ parse_nested_name(const char* first, const char* last, C& db) } first = t0 + 1; db.cv = cv; - if (pop_subs) + if (pop_subs && !db.subs.empty()) db.subs.pop_back(); } return first; diff --git a/libcxxabi/test/test_demangle.cpp b/libcxxabi/test/test_demangle.cpp index 2ec53c64d8c4..e32647f048ed 100644 --- a/libcxxabi/test/test_demangle.cpp +++ b/libcxxabi/test/test_demangle.cpp @@ -29591,6 +29591,8 @@ const char* invalid_cases[] = { "_ZIPPreEncode", "Agentt", + "NSoERj5E=Y1[uM:ga", + "Aon_PmKVPDk7?fg4XP5smMUL6;Vl<>IL8ayHpiVDDDXTY;^o9;i", }; const unsigned NI = sizeof(invalid_cases) / sizeof(invalid_cases[0]);