Skip to content

Commit c545ebd

Browse files
committed
fixup! restore condition; mark "pm" as Named
1 parent 36e52b1 commit c545ebd

File tree

3 files changed

+24
-10
lines changed

3 files changed

+24
-10
lines changed

libcxxabi/src/demangle/ItaniumDemangle.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3389,8 +3389,10 @@ const typename AbstractManglingParser<
33893389
{"de", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator*"},
33903390
{"dl", OperatorInfo::Del, /*Ary*/ false, Node::Prec::Unary,
33913391
"operator delete"},
3392-
{"ds", OperatorInfo::Member, false, Node::Prec::PtrMem, "operator.*"},
3393-
{"dt", OperatorInfo::Member, false, Node::Prec::Postfix, "operator."},
3392+
{"ds", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
3393+
"operator.*"},
3394+
{"dt", OperatorInfo::Member, /*Named*/ false, Node::Prec::Postfix,
3395+
"operator."},
33943396
{"dv", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/"},
33953397
{"eO", OperatorInfo::Binary, false, Node::Prec::Assign, "operator^="},
33963398
{"eo", OperatorInfo::Binary, false, Node::Prec::Xor, "operator^"},
@@ -3419,10 +3421,12 @@ const typename AbstractManglingParser<
34193421
{"or", OperatorInfo::Binary, false, Node::Prec::Ior, "operator|"},
34203422
{"pL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator+="},
34213423
{"pl", OperatorInfo::Binary, false, Node::Prec::Additive, "operator+"},
3422-
{"pm", OperatorInfo::Member, false, Node::Prec::PtrMem, "operator->*"},
3424+
{"pm", OperatorInfo::Member, /*Named*/ true, Node::Prec::PtrMem,
3425+
"operator->*"},
34233426
{"pp", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator++"},
34243427
{"ps", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator+"},
3425-
{"pt", OperatorInfo::Member, false, Node::Prec::Postfix, "operator->"},
3428+
{"pt", OperatorInfo::Member, /*Named*/ true, Node::Prec::Postfix,
3429+
"operator->"},
34263430
{"qu", OperatorInfo::Conditional, false, Node::Prec::Conditional,
34273431
"operator?"},
34283432
{"rM", OperatorInfo::Binary, false, Node::Prec::Assign, "operator%="},
@@ -3495,6 +3499,9 @@ AbstractManglingParser<Derived, Alloc>::parseOperatorName(NameState *State) {
34953499
if (Op->getKind() >= OperatorInfo::Unnameable)
34963500
/* Not a nameable operator. */
34973501
return nullptr;
3502+
if (Op->getKind() == OperatorInfo::Member && !Op->getFlag())
3503+
/* Not a nameable MemberExpr */
3504+
return nullptr;
34983505

34993506
return make<NameType>(Op->getName());
35003507
}

libcxxabi/test/test_demangle.pass.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30248,8 +30248,6 @@ const char* cases[][2] = {
3024830248
{"_Z3fooIPU9__ptrauthILj1ELb0ELj64EEPiEvT_", "void foo<int* __ptrauth<1u, false, 64u>*>(int* __ptrauth<1u, false, 64u>*)"},
3024930249

3025030250
{"_ZN1CpmEi", "C::operator->*(int)"},
30251-
{"_ZN1CdtEi", "C::operator.(int)"},
30252-
{"_ZN1CdsEi", "C::operator.*(int)"},
3025330251
// clang-format on
3025430252
};
3025530253

@@ -30353,6 +30351,8 @@ const char *invalid_cases[] = {
3035330351
"_ZGI3Foo",
3035430352
"_ZGIW3Foov",
3035530353
"W1x",
30354+
"_ZN1CdtEi",
30355+
"_ZN1CdsEi",
3035630356
// clang-format on
3035730357
};
3035830358

llvm/include/llvm/Demangle/ItaniumDemangle.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3389,8 +3389,10 @@ const typename AbstractManglingParser<
33893389
{"de", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator*"},
33903390
{"dl", OperatorInfo::Del, /*Ary*/ false, Node::Prec::Unary,
33913391
"operator delete"},
3392-
{"ds", OperatorInfo::Member, false, Node::Prec::PtrMem, "operator.*"},
3393-
{"dt", OperatorInfo::Member, false, Node::Prec::Postfix, "operator."},
3392+
{"ds", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
3393+
"operator.*"},
3394+
{"dt", OperatorInfo::Member, /*Named*/ false, Node::Prec::Postfix,
3395+
"operator."},
33943396
{"dv", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/"},
33953397
{"eO", OperatorInfo::Binary, false, Node::Prec::Assign, "operator^="},
33963398
{"eo", OperatorInfo::Binary, false, Node::Prec::Xor, "operator^"},
@@ -3419,10 +3421,12 @@ const typename AbstractManglingParser<
34193421
{"or", OperatorInfo::Binary, false, Node::Prec::Ior, "operator|"},
34203422
{"pL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator+="},
34213423
{"pl", OperatorInfo::Binary, false, Node::Prec::Additive, "operator+"},
3422-
{"pm", OperatorInfo::Member, false, Node::Prec::PtrMem, "operator->*"},
3424+
{"pm", OperatorInfo::Member, /*Named*/ true, Node::Prec::PtrMem,
3425+
"operator->*"},
34233426
{"pp", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator++"},
34243427
{"ps", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator+"},
3425-
{"pt", OperatorInfo::Member, false, Node::Prec::Postfix, "operator->"},
3428+
{"pt", OperatorInfo::Member, /*Named*/ true, Node::Prec::Postfix,
3429+
"operator->"},
34263430
{"qu", OperatorInfo::Conditional, false, Node::Prec::Conditional,
34273431
"operator?"},
34283432
{"rM", OperatorInfo::Binary, false, Node::Prec::Assign, "operator%="},
@@ -3495,6 +3499,9 @@ AbstractManglingParser<Derived, Alloc>::parseOperatorName(NameState *State) {
34953499
if (Op->getKind() >= OperatorInfo::Unnameable)
34963500
/* Not a nameable operator. */
34973501
return nullptr;
3502+
if (Op->getKind() == OperatorInfo::Member && !Op->getFlag())
3503+
/* Not a nameable MemberExpr */
3504+
return nullptr;
34983505

34993506
return make<NameType>(Op->getName());
35003507
}

0 commit comments

Comments
 (0)