Skip to content

Commit

Permalink
[demangler] Fix unresolvedname demangling
Browse files Browse the repository at this point in the history
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
  • Loading branch information
urnathan committed Feb 7, 2022
1 parent 704b21c commit 8d38273
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 16 deletions.
15 changes: 7 additions & 8 deletions libcxxabi/src/demangle/ItaniumDemangle.h
Expand Up @@ -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();
Expand Down Expand Up @@ -3353,14 +3353,15 @@ 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
// (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
//
// <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>
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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("||");
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -5084,7 +5083,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
case '7':
case '8':
case '9':
return getDerived().parseUnresolvedName();
return getDerived().parseUnresolvedName(Global);
}
return nullptr;
}
Expand Down
2 changes: 2 additions & 0 deletions libcxxabi/test/test_demangle.pass.cpp
Expand Up @@ -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)"},
};

Expand Down
15 changes: 7 additions & 8 deletions llvm/include/llvm/Demangle/ItaniumDemangle.h
Expand Up @@ -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();
Expand Down Expand Up @@ -3353,14 +3353,15 @@ 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
// (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
//
// <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>
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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("||");
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -5084,7 +5083,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
case '7':
case '8':
case '9':
return getDerived().parseUnresolvedName();
return getDerived().parseUnresolvedName(Global);
}
return nullptr;
}
Expand Down

0 comments on commit 8d38273

Please sign in to comment.