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 @@ -2729,8 +2729,8 @@ return make(Encoding, Entity); } -// ::= [L]* -// ::= St [L]* # ::std:: +// ::= +// ::= St # ::std:: // [*] extension template Node * @@ -2743,7 +2743,6 @@ if (Std == nullptr) return nullptr; } - consumeIf('L'); Node *Res = nullptr; ModuleName *Module = nullptr; @@ -2761,29 +2760,32 @@ } } - if (Res == nullptr) + if (Res == nullptr || Std != nullptr) { Res = getDerived().parseUnqualifiedName(State, Std, Module); + } return Res; } -// ::= [] [] +// ::= [] L? [] // ::= [] [] -// ::= [] [] -// ::= [] [] +// ::= [] L? [] +// ::= [] L? [] // # structured binding declaration -// ::= [] DC + E +// ::= [] L? DC + E template Node *AbstractManglingParser::parseUnqualifiedName( NameState *State, Node *Scope, ModuleName *Module) { if (getDerived().parseModuleNameOpt(Module)) return nullptr; + consumeIf('L'); + Node *Result; - if (look() == 'U') { - Result = getDerived().parseUnnamedTypeName(State); - } else if (look() >= '1' && look() <= '9') { + if (look() >= '1' && look() <= '9') { Result = getDerived().parseSourceName(State); + } else if (look() == 'U') { + Result = getDerived().parseUnnamedTypeName(State); } else if (consumeIf("DC")) { // Structured binding size_t BindingsBegin = Names.size(); @@ -3163,10 +3165,12 @@ return nullptr; } -// ::= N [] [] E -// ::= N [] [] E +// ::= N [] [] +// E +// ::= N [] [] +// E // -// ::= [L]* +// ::= // ::= // ::= // ::= @@ -3230,7 +3234,6 @@ SoFar = getDerived().parseDecltype(); } else { ModuleName *Module = nullptr; - bool IsLocal = consumeIf('L'); // extension if (look() == 'S') { // ::= @@ -3245,7 +3248,7 @@ return nullptr; if (S->getKind() == Node::KModuleName) { Module = static_cast(S); - } else if (SoFar != nullptr || IsLocal) { + } else if (SoFar != nullptr) { return nullptr; // Cannot have a prefix. } else { SoFar = S; 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 @@ -30078,6 +30078,8 @@ {"_ZGIW3Foo", "initializer for module Foo"}, {"_ZGIW3FooW3Bar", "initializer for module Foo.Bar"}, {"_ZGIW3FooWP3BarW3Baz", "initializer for module Foo:Bar.Baz"}, + {"_ZW1ML4Oink", "Oink@M"}, + {"_ZW1ML1fi", "f@M(int)"}, }; const unsigned N = sizeof(cases) / sizeof(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 @@ -2729,8 +2729,8 @@ return make(Encoding, Entity); } -// ::= [L]* -// ::= St [L]* # ::std:: +// ::= +// ::= St # ::std:: // [*] extension template Node * @@ -2743,7 +2743,6 @@ if (Std == nullptr) return nullptr; } - consumeIf('L'); Node *Res = nullptr; ModuleName *Module = nullptr; @@ -2761,29 +2760,32 @@ } } - if (Res == nullptr) + if (Res == nullptr || Std != nullptr) { Res = getDerived().parseUnqualifiedName(State, Std, Module); + } return Res; } -// ::= [] [] +// ::= [] L? [] // ::= [] [] -// ::= [] [] -// ::= [] [] +// ::= [] L? [] +// ::= [] L? [] // # structured binding declaration -// ::= [] DC + E +// ::= [] L? DC + E template Node *AbstractManglingParser::parseUnqualifiedName( NameState *State, Node *Scope, ModuleName *Module) { if (getDerived().parseModuleNameOpt(Module)) return nullptr; + consumeIf('L'); + Node *Result; - if (look() == 'U') { - Result = getDerived().parseUnnamedTypeName(State); - } else if (look() >= '1' && look() <= '9') { + if (look() >= '1' && look() <= '9') { Result = getDerived().parseSourceName(State); + } else if (look() == 'U') { + Result = getDerived().parseUnnamedTypeName(State); } else if (consumeIf("DC")) { // Structured binding size_t BindingsBegin = Names.size(); @@ -3163,10 +3165,12 @@ return nullptr; } -// ::= N [] [] E -// ::= N [] [] E +// ::= N [] [] +// E +// ::= N [] [] +// E // -// ::= [L]* +// ::= // ::= // ::= // ::= @@ -3230,7 +3234,6 @@ SoFar = getDerived().parseDecltype(); } else { ModuleName *Module = nullptr; - bool IsLocal = consumeIf('L'); // extension if (look() == 'S') { // ::= @@ -3245,7 +3248,7 @@ return nullptr; if (S->getKind() == Node::KModuleName) { Module = static_cast(S); - } else if (SoFar != nullptr || IsLocal) { + } else if (SoFar != nullptr) { return nullptr; // Cannot have a prefix. } else { SoFar = S;