forked from OSchip/llvm-project
[demangler] Fix unresolvedname demangling
We were dropping the [gs] modifier by parsing it in parseExpr, but not forwarding it on to parseUnresolvedName. This is the straightforwards fix to forward that flag -- parseExpr must see past it. Reviewed By: ChuanqiXu Differential Revision: https://reviews.llvm.org/D118504
This commit is contained in:
parent
704b21cb4f
commit
8d38273a3d
|
@ -2551,7 +2551,7 @@ template <typename Derived, typename Alloc> struct AbstractManglingParser {
|
|||
Node *parseAbiTags(Node *N);
|
||||
|
||||
/// Parse the <unresolved-name> production.
|
||||
Node *parseUnresolvedName();
|
||||
Node *parseUnresolvedName(bool Global);
|
||||
Node *parseSimpleId();
|
||||
Node *parseBaseUnresolvedName();
|
||||
Node *parseUnresolvedType();
|
||||
|
@ -3353,6 +3353,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseBaseUnresolvedName() {
|
|||
// ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
|
||||
// ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
|
||||
// # A::x, N::y, A<T>::z; "gs" means leading "::"
|
||||
// [gs] has been parsed by caller.
|
||||
// ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
|
||||
// extension ::= sr <unresolved-type> <template-args> <base-unresolved-name>
|
||||
// # T::N::x /decltype(p)::N::x
|
||||
|
@ -3360,7 +3361,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseBaseUnresolvedName() {
|
|||
//
|
||||
// <unresolved-qualifier-level> ::= <simple-id>
|
||||
template <typename Derived, typename Alloc>
|
||||
Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedName() {
|
||||
Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedName(bool Global) {
|
||||
Node *SoFar = nullptr;
|
||||
|
||||
// srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
|
||||
|
@ -3394,8 +3395,6 @@ Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedName() {
|
|||
return make<QualifiedName>(SoFar, Base);
|
||||
}
|
||||
|
||||
bool Global = consumeIf("gs");
|
||||
|
||||
// [gs] <base-unresolved-name> # x or (with "gs") ::x
|
||||
if (!consumeIf("sr")) {
|
||||
SoFar = getDerived().parseBaseUnresolvedName();
|
||||
|
@ -4695,7 +4694,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
|
|||
return make<DeleteExpr>(E, Global, /*is_array=*/false);
|
||||
}
|
||||
case 'n':
|
||||
return getDerived().parseUnresolvedName();
|
||||
return getDerived().parseUnresolvedName(Global);
|
||||
case 's': {
|
||||
First += 2;
|
||||
Node *LHS = getDerived().parseExpr();
|
||||
|
@ -4840,7 +4839,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
|
|||
case 'o':
|
||||
switch (First[1]) {
|
||||
case 'n':
|
||||
return getDerived().parseUnresolvedName();
|
||||
return getDerived().parseUnresolvedName(Global);
|
||||
case 'o':
|
||||
First += 2;
|
||||
return getDerived().parseBinaryExpr("||");
|
||||
|
@ -4951,7 +4950,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
|
|||
return make<ParameterPackExpansion>(Child);
|
||||
}
|
||||
case 'r':
|
||||
return getDerived().parseUnresolvedName();
|
||||
return getDerived().parseUnresolvedName(Global);
|
||||
case 't': {
|
||||
First += 2;
|
||||
Node *Ty = getDerived().parseType();
|
||||
|
@ -5084,7 +5083,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
|
|||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
return getDerived().parseUnresolvedName();
|
||||
return getDerived().parseUnresolvedName(Global);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
@ -29856,6 +29856,8 @@ const char* cases[][2] =
|
|||
// See https://llvm.org/PR51407
|
||||
{"_Zcv1BIRT_EIS1_E", "operator B<><>"},
|
||||
|
||||
{"_ZN2FnIXgs4BaseEX4BaseEEEvv","void Fn<::Base, Base>()"},
|
||||
|
||||
{"_Z3TPLIiET_S0_", "int TPL<int>(int)"},
|
||||
};
|
||||
|
||||
|
|
|
@ -2551,7 +2551,7 @@ template <typename Derived, typename Alloc> struct AbstractManglingParser {
|
|||
Node *parseAbiTags(Node *N);
|
||||
|
||||
/// Parse the <unresolved-name> production.
|
||||
Node *parseUnresolvedName();
|
||||
Node *parseUnresolvedName(bool Global);
|
||||
Node *parseSimpleId();
|
||||
Node *parseBaseUnresolvedName();
|
||||
Node *parseUnresolvedType();
|
||||
|
@ -3353,6 +3353,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseBaseUnresolvedName() {
|
|||
// ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
|
||||
// ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
|
||||
// # A::x, N::y, A<T>::z; "gs" means leading "::"
|
||||
// [gs] has been parsed by caller.
|
||||
// ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
|
||||
// extension ::= sr <unresolved-type> <template-args> <base-unresolved-name>
|
||||
// # T::N::x /decltype(p)::N::x
|
||||
|
@ -3360,7 +3361,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseBaseUnresolvedName() {
|
|||
//
|
||||
// <unresolved-qualifier-level> ::= <simple-id>
|
||||
template <typename Derived, typename Alloc>
|
||||
Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedName() {
|
||||
Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedName(bool Global) {
|
||||
Node *SoFar = nullptr;
|
||||
|
||||
// srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
|
||||
|
@ -3394,8 +3395,6 @@ Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedName() {
|
|||
return make<QualifiedName>(SoFar, Base);
|
||||
}
|
||||
|
||||
bool Global = consumeIf("gs");
|
||||
|
||||
// [gs] <base-unresolved-name> # x or (with "gs") ::x
|
||||
if (!consumeIf("sr")) {
|
||||
SoFar = getDerived().parseBaseUnresolvedName();
|
||||
|
@ -4695,7 +4694,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
|
|||
return make<DeleteExpr>(E, Global, /*is_array=*/false);
|
||||
}
|
||||
case 'n':
|
||||
return getDerived().parseUnresolvedName();
|
||||
return getDerived().parseUnresolvedName(Global);
|
||||
case 's': {
|
||||
First += 2;
|
||||
Node *LHS = getDerived().parseExpr();
|
||||
|
@ -4840,7 +4839,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
|
|||
case 'o':
|
||||
switch (First[1]) {
|
||||
case 'n':
|
||||
return getDerived().parseUnresolvedName();
|
||||
return getDerived().parseUnresolvedName(Global);
|
||||
case 'o':
|
||||
First += 2;
|
||||
return getDerived().parseBinaryExpr("||");
|
||||
|
@ -4951,7 +4950,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
|
|||
return make<ParameterPackExpansion>(Child);
|
||||
}
|
||||
case 'r':
|
||||
return getDerived().parseUnresolvedName();
|
||||
return getDerived().parseUnresolvedName(Global);
|
||||
case 't': {
|
||||
First += 2;
|
||||
Node *Ty = getDerived().parseType();
|
||||
|
@ -5084,7 +5083,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
|
|||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
return getDerived().parseUnresolvedName();
|
||||
return getDerived().parseUnresolvedName(Global);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue