[demangler][NFC] Tweak legacy uuidof handling

We have to special-case 'u 8__uuidof [tz]' demangling for legacy
support.  That handling is a little duplicative.

* It seems better to just push the single expected node.

* We can also use 'consumeIf' rather than open-coding the peeking and increment.

* We don't need the numLeft < 2 check, as if there are few than that
  other paths will end up with detecting the error.

FWIW This simplifies a future change adding operator precedence.

Reviewed By: ChuanqiXu

Differential Revision: https://reviews.llvm.org/D119543
This commit is contained in:
Nathan Sidwell 2022-02-11 05:54:40 -08:00
parent 995c4f3068
commit 880e87580a
2 changed files with 38 additions and 40 deletions

View File

@ -5032,30 +5032,29 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
// interpreted as <type> node 'short' or 'ellipsis'. However, neither
// __uuidof(short) nor __uuidof(...) can actually appear, so there is no
// actual conflict here.
bool IsUUID = false;
Node *UUID = nullptr;
if (Name->getBaseName() == "__uuidof") {
if (numLeft() < 2)
return nullptr;
if (*First == 't') {
++First;
Node *Ty = getDerived().parseType();
if (!Ty)
return nullptr;
return make<CallExpr>(Name, makeNodeArray(&Ty, &Ty + 1));
}
if (*First == 'z') {
++First;
Node *Ex = getDerived().parseExpr();
if (!Ex)
return nullptr;
return make<CallExpr>(Name, makeNodeArray(&Ex, &Ex + 1));
if (consumeIf('t')) {
UUID = getDerived().parseType();
IsUUID = true;
} else if (consumeIf('z')) {
UUID = getDerived().parseExpr();
IsUUID = true;
}
}
size_t ExprsBegin = Names.size();
while (!consumeIf('E')) {
Node *E = getDerived().parseTemplateArg();
if (E == nullptr)
return E;
Names.push_back(E);
if (IsUUID) {
if (UUID == nullptr)
return nullptr;
Names.push_back(UUID);
} else {
while (!consumeIf('E')) {
Node *E = getDerived().parseTemplateArg();
if (E == nullptr)
return E;
Names.push_back(E);
}
}
return make<CallExpr>(Name, popTrailingNodeArray(ExprsBegin));
}

View File

@ -5032,30 +5032,29 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
// interpreted as <type> node 'short' or 'ellipsis'. However, neither
// __uuidof(short) nor __uuidof(...) can actually appear, so there is no
// actual conflict here.
bool IsUUID = false;
Node *UUID = nullptr;
if (Name->getBaseName() == "__uuidof") {
if (numLeft() < 2)
return nullptr;
if (*First == 't') {
++First;
Node *Ty = getDerived().parseType();
if (!Ty)
return nullptr;
return make<CallExpr>(Name, makeNodeArray(&Ty, &Ty + 1));
}
if (*First == 'z') {
++First;
Node *Ex = getDerived().parseExpr();
if (!Ex)
return nullptr;
return make<CallExpr>(Name, makeNodeArray(&Ex, &Ex + 1));
if (consumeIf('t')) {
UUID = getDerived().parseType();
IsUUID = true;
} else if (consumeIf('z')) {
UUID = getDerived().parseExpr();
IsUUID = true;
}
}
size_t ExprsBegin = Names.size();
while (!consumeIf('E')) {
Node *E = getDerived().parseTemplateArg();
if (E == nullptr)
return E;
Names.push_back(E);
if (IsUUID) {
if (UUID == nullptr)
return nullptr;
Names.push_back(UUID);
} else {
while (!consumeIf('E')) {
Node *E = getDerived().parseTemplateArg();
if (E == nullptr)
return E;
Names.push_back(E);
}
}
return make<CallExpr>(Name, popTrailingNodeArray(ExprsBegin));
}