[libcxx-commits] [libcxxabi] c47bcf9 - [demangler][NFC] OperatorInfo table unit test
Nathan Sidwell via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Apr 25 10:02:18 PDT 2022
Author: Nathan Sidwell
Date: 2022-04-25T10:02:08-07:00
New Revision: c47bcf9af6fcfd565af25ab95932d7ceadd5d5ab
URL: https://github.com/llvm/llvm-project/commit/c47bcf9af6fcfd565af25ab95932d7ceadd5d5ab
DIFF: https://github.com/llvm/llvm-project/commit/c47bcf9af6fcfd565af25ab95932d7ceadd5d5ab.diff
LOG: [demangler][NFC] OperatorInfo table unit test
Placing a run-once test inside the operator lookup function caused
problems with the thread sanitizer. See D122975.
Break out the operator table into a member variable, and move the test
to the unit test machinery.
Reviewed By: dblaikie
Differential Revision: https://reviews.llvm.org/D123390
Added:
Modified:
libcxxabi/src/demangle/ItaniumDemangle.h
llvm/include/llvm/Demangle/ItaniumDemangle.h
llvm/unittests/Demangle/ItaniumDemangleTest.cpp
Removed:
################################################################################
diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h
index 90f62bab0bd9f..4f72bdd4cf0cd 100644
--- a/libcxxabi/src/demangle/ItaniumDemangle.h
+++ b/libcxxabi/src/demangle/ItaniumDemangle.h
@@ -2658,6 +2658,8 @@ template <typename Derived, typename Alloc> struct AbstractManglingParser {
bool getFlag() const { return Flag; }
Node::Prec getPrecedence() const { return Prec; }
};
+ static const OperatorInfo Ops[];
+ static const size_t NumOps;
const OperatorInfo *parseOperatorEncoding();
/// Parse the <unresolved-name> production.
@@ -2955,111 +2957,97 @@ Node *AbstractManglingParser<Derived, Alloc>::parseSourceName(NameState *) {
return make<NameType>(Name);
}
+// Operator encodings
+template <typename Derived, typename Alloc>
+const typename AbstractManglingParser<
+ Derived, Alloc>::OperatorInfo AbstractManglingParser<Derived,
+ Alloc>::Ops[] = {
+ // Keep ordered by encoding
+ {"aN", OperatorInfo::Binary, false, Node::Prec::Assign, "operator&="},
+ {"aS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator="},
+ {"aa", OperatorInfo::Binary, false, Node::Prec::AndIf, "operator&&"},
+ {"ad", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator&"},
+ {"an", OperatorInfo::Binary, false, Node::Prec::And, "operator&"},
+ {"at", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Unary, "alignof "},
+ {"aw", OperatorInfo::NameOnly, false, Node::Prec::Primary,
+ "operator co_await"},
+ {"az", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Unary, "alignof "},
+ {"cc", OperatorInfo::NamedCast, false, Node::Prec::Postfix, "const_cast"},
+ {"cl", OperatorInfo::Call, false, Node::Prec::Postfix, "operator()"},
+ {"cm", OperatorInfo::Binary, false, Node::Prec::Comma, "operator,"},
+ {"co", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator~"},
+ {"cv", OperatorInfo::CCast, false, Node::Prec::Cast, "operator"}, // C Cast
+ {"dV", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/="},
+ {"da", OperatorInfo::Del, /*Ary*/ true, Node::Prec::Unary,
+ "operator delete[]"},
+ {"dc", OperatorInfo::NamedCast, false, Node::Prec::Postfix, "dynamic_cast"},
+ {"de", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator*"},
+ {"dl", OperatorInfo::Del, /*Ary*/ false, Node::Prec::Unary,
+ "operator delete"},
+ {"ds", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
+ "operator.*"},
+ {"dt", OperatorInfo::Member, /*Named*/ false, Node::Prec::Postfix,
+ "operator."},
+ {"dv", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/"},
+ {"eO", OperatorInfo::Binary, false, Node::Prec::Assign, "operator^="},
+ {"eo", OperatorInfo::Binary, false, Node::Prec::Xor, "operator^"},
+ {"eq", OperatorInfo::Binary, false, Node::Prec::Equality, "operator=="},
+ {"ge", OperatorInfo::Binary, false, Node::Prec::Relational, "operator>="},
+ {"gt", OperatorInfo::Binary, false, Node::Prec::Relational, "operator>"},
+ {"ix", OperatorInfo::Array, false, Node::Prec::Postfix, "operator[]"},
+ {"lS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator<<="},
+ {"le", OperatorInfo::Binary, false, Node::Prec::Relational, "operator<="},
+ {"ls", OperatorInfo::Binary, false, Node::Prec::Shift, "operator<<"},
+ {"lt", OperatorInfo::Binary, false, Node::Prec::Relational, "operator<"},
+ {"mI", OperatorInfo::Binary, false, Node::Prec::Assign, "operator-="},
+ {"mL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator*="},
+ {"mi", OperatorInfo::Binary, false, Node::Prec::Additive, "operator-"},
+ {"ml", OperatorInfo::Binary, false, Node::Prec::Multiplicative,
+ "operator*"},
+ {"mm", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator--"},
+ {"na", OperatorInfo::New, /*Ary*/ true, Node::Prec::Unary,
+ "operator new[]"},
+ {"ne", OperatorInfo::Binary, false, Node::Prec::Equality, "operator!="},
+ {"ng", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator-"},
+ {"nt", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator!"},
+ {"nw", OperatorInfo::New, /*Ary*/ false, Node::Prec::Unary, "operator new"},
+ {"oR", OperatorInfo::Binary, false, Node::Prec::Assign, "operator|="},
+ {"oo", OperatorInfo::Binary, false, Node::Prec::OrIf, "operator||"},
+ {"or", OperatorInfo::Binary, false, Node::Prec::Ior, "operator|"},
+ {"pL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator+="},
+ {"pl", OperatorInfo::Binary, false, Node::Prec::Additive, "operator+"},
+ {"pm", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
+ "operator->*"},
+ {"pp", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator++"},
+ {"ps", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator+"},
+ {"pt", OperatorInfo::Member, /*Named*/ true, Node::Prec::Postfix,
+ "operator->"},
+ {"qu", OperatorInfo::Conditional, false, Node::Prec::Conditional,
+ "operator?"},
+ {"rM", OperatorInfo::Binary, false, Node::Prec::Assign, "operator%="},
+ {"rS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator>>="},
+ {"rc", OperatorInfo::NamedCast, false, Node::Prec::Postfix,
+ "reinterpret_cast"},
+ {"rm", OperatorInfo::Binary, false, Node::Prec::Multiplicative,
+ "operator%"},
+ {"rs", OperatorInfo::Binary, false, Node::Prec::Shift, "operator>>"},
+ {"sc", OperatorInfo::NamedCast, false, Node::Prec::Postfix, "static_cast"},
+ {"ss", OperatorInfo::Binary, false, Node::Prec::Spaceship, "operator<=>"},
+ {"st", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Unary, "sizeof "},
+ {"sz", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Unary, "sizeof "},
+ {"te", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Postfix,
+ "typeid "},
+ {"ti", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Postfix, "typeid "},
+};
+template <typename Derived, typename Alloc>
+const size_t AbstractManglingParser<Derived, Alloc>::NumOps = sizeof(Ops) /
+ sizeof(Ops[0]);
+
// If the next 2 chars are an operator encoding, consume them and return their
// OperatorInfo. Otherwise return nullptr.
template <typename Derived, typename Alloc>
const typename AbstractManglingParser<Derived, Alloc>::OperatorInfo *
AbstractManglingParser<Derived, Alloc>::parseOperatorEncoding() {
- static const OperatorInfo Ops[] = {
- // Keep ordered by encoding
- {"aN", OperatorInfo::Binary, false, Node::Prec::Assign, "operator&="},
- {"aS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator="},
- {"aa", OperatorInfo::Binary, false, Node::Prec::AndIf, "operator&&"},
- {"ad", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator&"},
- {"an", OperatorInfo::Binary, false, Node::Prec::And, "operator&"},
- {"at", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Unary,
- "alignof "},
- {"aw", OperatorInfo::NameOnly, false, Node::Prec::Primary,
- "operator co_await"},
- {"az", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Unary,
- "alignof "},
- {"cc", OperatorInfo::NamedCast, false, Node::Prec::Postfix, "const_cast"},
- {"cl", OperatorInfo::Call, false, Node::Prec::Postfix, "operator()"},
- {"cm", OperatorInfo::Binary, false, Node::Prec::Comma, "operator,"},
- {"co", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator~"},
- {"cv", OperatorInfo::CCast, false, Node::Prec::Cast,
- "operator"}, // C Cast
- {"dV", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/="},
- {"da", OperatorInfo::Del, /*Ary*/ true, Node::Prec::Unary,
- "operator delete[]"},
- {"dc", OperatorInfo::NamedCast, false, Node::Prec::Postfix,
- "dynamic_cast"},
- {"de", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator*"},
- {"dl", OperatorInfo::Del, /*Ary*/ false, Node::Prec::Unary,
- "operator delete"},
- {"ds", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
- "operator.*"},
- {"dt", OperatorInfo::Member, /*Named*/ false, Node::Prec::Postfix,
- "operator."},
- {"dv", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/"},
- {"eO", OperatorInfo::Binary, false, Node::Prec::Assign, "operator^="},
- {"eo", OperatorInfo::Binary, false, Node::Prec::Xor, "operator^"},
- {"eq", OperatorInfo::Binary, false, Node::Prec::Equality, "operator=="},
- {"ge", OperatorInfo::Binary, false, Node::Prec::Relational, "operator>="},
- {"gt", OperatorInfo::Binary, false, Node::Prec::Relational, "operator>"},
- {"ix", OperatorInfo::Array, false, Node::Prec::Postfix, "operator[]"},
- {"lS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator<<="},
- {"le", OperatorInfo::Binary, false, Node::Prec::Relational, "operator<="},
- {"ls", OperatorInfo::Binary, false, Node::Prec::Shift, "operator<<"},
- {"lt", OperatorInfo::Binary, false, Node::Prec::Relational, "operator<"},
- {"mI", OperatorInfo::Binary, false, Node::Prec::Assign, "operator-="},
- {"mL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator*="},
- {"mi", OperatorInfo::Binary, false, Node::Prec::Additive, "operator-"},
- {"ml", OperatorInfo::Binary, false, Node::Prec::Multiplicative,
- "operator*"},
- {"mm", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator--"},
- {"na", OperatorInfo::New, /*Ary*/ true, Node::Prec::Unary,
- "operator new[]"},
- {"ne", OperatorInfo::Binary, false, Node::Prec::Equality, "operator!="},
- {"ng", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator-"},
- {"nt", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator!"},
- {"nw", OperatorInfo::New, /*Ary*/ false, Node::Prec::Unary,
- "operator new"},
- {"oR", OperatorInfo::Binary, false, Node::Prec::Assign, "operator|="},
- {"oo", OperatorInfo::Binary, false, Node::Prec::OrIf, "operator||"},
- {"or", OperatorInfo::Binary, false, Node::Prec::Ior, "operator|"},
- {"pL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator+="},
- {"pl", OperatorInfo::Binary, false, Node::Prec::Additive, "operator+"},
- {"pm", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
- "operator->*"},
- {"pp", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator++"},
- {"ps", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator+"},
- {"pt", OperatorInfo::Member, /*Named*/ true, Node::Prec::Postfix,
- "operator->"},
- {"qu", OperatorInfo::Conditional, false, Node::Prec::Conditional,
- "operator?"},
- {"rM", OperatorInfo::Binary, false, Node::Prec::Assign, "operator%="},
- {"rS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator>>="},
- {"rc", OperatorInfo::NamedCast, false, Node::Prec::Postfix,
- "reinterpret_cast"},
- {"rm", OperatorInfo::Binary, false, Node::Prec::Multiplicative,
- "operator%"},
- {"rs", OperatorInfo::Binary, false, Node::Prec::Shift, "operator>>"},
- {"sc", OperatorInfo::NamedCast, false, Node::Prec::Postfix,
- "static_cast"},
- {"ss", OperatorInfo::Binary, false, Node::Prec::Spaceship, "operator<=>"},
- {"st", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Unary, "sizeof "},
- {"sz", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Unary,
- "sizeof "},
- {"te", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Postfix,
- "typeid "},
- {"ti", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Postfix,
- "typeid "},
- };
- const auto NumOps = sizeof(Ops) / sizeof(Ops[0]);
-
-#ifndef NDEBUG
- {
- // Verify table order.
- static bool Done;
- if (!Done) {
- Done = true;
- for (const auto *Op = &Ops[0]; Op != &Ops[NumOps - 1]; Op++)
- assert(Op[0] < Op[1] && "Operator table is not ordered");
- }
- }
-#endif
-
if (numLeft() < 2)
return nullptr;
diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h
index 40a99bfe6d57c..b33a297a414b6 100644
--- a/llvm/include/llvm/Demangle/ItaniumDemangle.h
+++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h
@@ -2658,6 +2658,8 @@ template <typename Derived, typename Alloc> struct AbstractManglingParser {
bool getFlag() const { return Flag; }
Node::Prec getPrecedence() const { return Prec; }
};
+ static const OperatorInfo Ops[];
+ static const size_t NumOps;
const OperatorInfo *parseOperatorEncoding();
/// Parse the <unresolved-name> production.
@@ -2955,111 +2957,97 @@ Node *AbstractManglingParser<Derived, Alloc>::parseSourceName(NameState *) {
return make<NameType>(Name);
}
+// Operator encodings
+template <typename Derived, typename Alloc>
+const typename AbstractManglingParser<
+ Derived, Alloc>::OperatorInfo AbstractManglingParser<Derived,
+ Alloc>::Ops[] = {
+ // Keep ordered by encoding
+ {"aN", OperatorInfo::Binary, false, Node::Prec::Assign, "operator&="},
+ {"aS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator="},
+ {"aa", OperatorInfo::Binary, false, Node::Prec::AndIf, "operator&&"},
+ {"ad", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator&"},
+ {"an", OperatorInfo::Binary, false, Node::Prec::And, "operator&"},
+ {"at", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Unary, "alignof "},
+ {"aw", OperatorInfo::NameOnly, false, Node::Prec::Primary,
+ "operator co_await"},
+ {"az", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Unary, "alignof "},
+ {"cc", OperatorInfo::NamedCast, false, Node::Prec::Postfix, "const_cast"},
+ {"cl", OperatorInfo::Call, false, Node::Prec::Postfix, "operator()"},
+ {"cm", OperatorInfo::Binary, false, Node::Prec::Comma, "operator,"},
+ {"co", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator~"},
+ {"cv", OperatorInfo::CCast, false, Node::Prec::Cast, "operator"}, // C Cast
+ {"dV", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/="},
+ {"da", OperatorInfo::Del, /*Ary*/ true, Node::Prec::Unary,
+ "operator delete[]"},
+ {"dc", OperatorInfo::NamedCast, false, Node::Prec::Postfix, "dynamic_cast"},
+ {"de", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator*"},
+ {"dl", OperatorInfo::Del, /*Ary*/ false, Node::Prec::Unary,
+ "operator delete"},
+ {"ds", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
+ "operator.*"},
+ {"dt", OperatorInfo::Member, /*Named*/ false, Node::Prec::Postfix,
+ "operator."},
+ {"dv", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/"},
+ {"eO", OperatorInfo::Binary, false, Node::Prec::Assign, "operator^="},
+ {"eo", OperatorInfo::Binary, false, Node::Prec::Xor, "operator^"},
+ {"eq", OperatorInfo::Binary, false, Node::Prec::Equality, "operator=="},
+ {"ge", OperatorInfo::Binary, false, Node::Prec::Relational, "operator>="},
+ {"gt", OperatorInfo::Binary, false, Node::Prec::Relational, "operator>"},
+ {"ix", OperatorInfo::Array, false, Node::Prec::Postfix, "operator[]"},
+ {"lS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator<<="},
+ {"le", OperatorInfo::Binary, false, Node::Prec::Relational, "operator<="},
+ {"ls", OperatorInfo::Binary, false, Node::Prec::Shift, "operator<<"},
+ {"lt", OperatorInfo::Binary, false, Node::Prec::Relational, "operator<"},
+ {"mI", OperatorInfo::Binary, false, Node::Prec::Assign, "operator-="},
+ {"mL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator*="},
+ {"mi", OperatorInfo::Binary, false, Node::Prec::Additive, "operator-"},
+ {"ml", OperatorInfo::Binary, false, Node::Prec::Multiplicative,
+ "operator*"},
+ {"mm", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator--"},
+ {"na", OperatorInfo::New, /*Ary*/ true, Node::Prec::Unary,
+ "operator new[]"},
+ {"ne", OperatorInfo::Binary, false, Node::Prec::Equality, "operator!="},
+ {"ng", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator-"},
+ {"nt", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator!"},
+ {"nw", OperatorInfo::New, /*Ary*/ false, Node::Prec::Unary, "operator new"},
+ {"oR", OperatorInfo::Binary, false, Node::Prec::Assign, "operator|="},
+ {"oo", OperatorInfo::Binary, false, Node::Prec::OrIf, "operator||"},
+ {"or", OperatorInfo::Binary, false, Node::Prec::Ior, "operator|"},
+ {"pL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator+="},
+ {"pl", OperatorInfo::Binary, false, Node::Prec::Additive, "operator+"},
+ {"pm", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
+ "operator->*"},
+ {"pp", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator++"},
+ {"ps", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator+"},
+ {"pt", OperatorInfo::Member, /*Named*/ true, Node::Prec::Postfix,
+ "operator->"},
+ {"qu", OperatorInfo::Conditional, false, Node::Prec::Conditional,
+ "operator?"},
+ {"rM", OperatorInfo::Binary, false, Node::Prec::Assign, "operator%="},
+ {"rS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator>>="},
+ {"rc", OperatorInfo::NamedCast, false, Node::Prec::Postfix,
+ "reinterpret_cast"},
+ {"rm", OperatorInfo::Binary, false, Node::Prec::Multiplicative,
+ "operator%"},
+ {"rs", OperatorInfo::Binary, false, Node::Prec::Shift, "operator>>"},
+ {"sc", OperatorInfo::NamedCast, false, Node::Prec::Postfix, "static_cast"},
+ {"ss", OperatorInfo::Binary, false, Node::Prec::Spaceship, "operator<=>"},
+ {"st", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Unary, "sizeof "},
+ {"sz", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Unary, "sizeof "},
+ {"te", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Postfix,
+ "typeid "},
+ {"ti", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Postfix, "typeid "},
+};
+template <typename Derived, typename Alloc>
+const size_t AbstractManglingParser<Derived, Alloc>::NumOps = sizeof(Ops) /
+ sizeof(Ops[0]);
+
// If the next 2 chars are an operator encoding, consume them and return their
// OperatorInfo. Otherwise return nullptr.
template <typename Derived, typename Alloc>
const typename AbstractManglingParser<Derived, Alloc>::OperatorInfo *
AbstractManglingParser<Derived, Alloc>::parseOperatorEncoding() {
- static const OperatorInfo Ops[] = {
- // Keep ordered by encoding
- {"aN", OperatorInfo::Binary, false, Node::Prec::Assign, "operator&="},
- {"aS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator="},
- {"aa", OperatorInfo::Binary, false, Node::Prec::AndIf, "operator&&"},
- {"ad", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator&"},
- {"an", OperatorInfo::Binary, false, Node::Prec::And, "operator&"},
- {"at", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Unary,
- "alignof "},
- {"aw", OperatorInfo::NameOnly, false, Node::Prec::Primary,
- "operator co_await"},
- {"az", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Unary,
- "alignof "},
- {"cc", OperatorInfo::NamedCast, false, Node::Prec::Postfix, "const_cast"},
- {"cl", OperatorInfo::Call, false, Node::Prec::Postfix, "operator()"},
- {"cm", OperatorInfo::Binary, false, Node::Prec::Comma, "operator,"},
- {"co", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator~"},
- {"cv", OperatorInfo::CCast, false, Node::Prec::Cast,
- "operator"}, // C Cast
- {"dV", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/="},
- {"da", OperatorInfo::Del, /*Ary*/ true, Node::Prec::Unary,
- "operator delete[]"},
- {"dc", OperatorInfo::NamedCast, false, Node::Prec::Postfix,
- "dynamic_cast"},
- {"de", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator*"},
- {"dl", OperatorInfo::Del, /*Ary*/ false, Node::Prec::Unary,
- "operator delete"},
- {"ds", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
- "operator.*"},
- {"dt", OperatorInfo::Member, /*Named*/ false, Node::Prec::Postfix,
- "operator."},
- {"dv", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/"},
- {"eO", OperatorInfo::Binary, false, Node::Prec::Assign, "operator^="},
- {"eo", OperatorInfo::Binary, false, Node::Prec::Xor, "operator^"},
- {"eq", OperatorInfo::Binary, false, Node::Prec::Equality, "operator=="},
- {"ge", OperatorInfo::Binary, false, Node::Prec::Relational, "operator>="},
- {"gt", OperatorInfo::Binary, false, Node::Prec::Relational, "operator>"},
- {"ix", OperatorInfo::Array, false, Node::Prec::Postfix, "operator[]"},
- {"lS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator<<="},
- {"le", OperatorInfo::Binary, false, Node::Prec::Relational, "operator<="},
- {"ls", OperatorInfo::Binary, false, Node::Prec::Shift, "operator<<"},
- {"lt", OperatorInfo::Binary, false, Node::Prec::Relational, "operator<"},
- {"mI", OperatorInfo::Binary, false, Node::Prec::Assign, "operator-="},
- {"mL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator*="},
- {"mi", OperatorInfo::Binary, false, Node::Prec::Additive, "operator-"},
- {"ml", OperatorInfo::Binary, false, Node::Prec::Multiplicative,
- "operator*"},
- {"mm", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator--"},
- {"na", OperatorInfo::New, /*Ary*/ true, Node::Prec::Unary,
- "operator new[]"},
- {"ne", OperatorInfo::Binary, false, Node::Prec::Equality, "operator!="},
- {"ng", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator-"},
- {"nt", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator!"},
- {"nw", OperatorInfo::New, /*Ary*/ false, Node::Prec::Unary,
- "operator new"},
- {"oR", OperatorInfo::Binary, false, Node::Prec::Assign, "operator|="},
- {"oo", OperatorInfo::Binary, false, Node::Prec::OrIf, "operator||"},
- {"or", OperatorInfo::Binary, false, Node::Prec::Ior, "operator|"},
- {"pL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator+="},
- {"pl", OperatorInfo::Binary, false, Node::Prec::Additive, "operator+"},
- {"pm", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
- "operator->*"},
- {"pp", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator++"},
- {"ps", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator+"},
- {"pt", OperatorInfo::Member, /*Named*/ true, Node::Prec::Postfix,
- "operator->"},
- {"qu", OperatorInfo::Conditional, false, Node::Prec::Conditional,
- "operator?"},
- {"rM", OperatorInfo::Binary, false, Node::Prec::Assign, "operator%="},
- {"rS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator>>="},
- {"rc", OperatorInfo::NamedCast, false, Node::Prec::Postfix,
- "reinterpret_cast"},
- {"rm", OperatorInfo::Binary, false, Node::Prec::Multiplicative,
- "operator%"},
- {"rs", OperatorInfo::Binary, false, Node::Prec::Shift, "operator>>"},
- {"sc", OperatorInfo::NamedCast, false, Node::Prec::Postfix,
- "static_cast"},
- {"ss", OperatorInfo::Binary, false, Node::Prec::Spaceship, "operator<=>"},
- {"st", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Unary, "sizeof "},
- {"sz", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Unary,
- "sizeof "},
- {"te", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Postfix,
- "typeid "},
- {"ti", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Postfix,
- "typeid "},
- };
- const auto NumOps = sizeof(Ops) / sizeof(Ops[0]);
-
-#ifndef NDEBUG
- {
- // Verify table order.
- static bool Done;
- if (!Done) {
- Done = true;
- for (const auto *Op = &Ops[0]; Op != &Ops[NumOps - 1]; Op++)
- assert(Op[0] < Op[1] && "Operator table is not ordered");
- }
- }
-#endif
-
if (numLeft() < 2)
return nullptr;
diff --git a/llvm/unittests/Demangle/ItaniumDemangleTest.cpp b/llvm/unittests/Demangle/ItaniumDemangleTest.cpp
index 5a057116c1bcd..c0db749539d86 100644
--- a/llvm/unittests/Demangle/ItaniumDemangleTest.cpp
+++ b/llvm/unittests/Demangle/ItaniumDemangleTest.cpp
@@ -56,6 +56,14 @@ void Visitor() {
}
} // namespace NodeMatcher
+// Verify Operator table is ordered
+TEST(ItaniumDemangle, OperatorOrdering) {
+ struct TestParser : AbstractManglingParser<TestParser, TestAllocator> {};
+ for (const auto *Op = &TestParser::Ops[0];
+ Op != &TestParser::Ops[TestParser::NumOps - 1]; Op++)
+ ASSERT_LT(Op[0], Op[1]);
+}
+
TEST(ItaniumDemangle, MethodOverride) {
struct TestParser : AbstractManglingParser<TestParser, TestAllocator> {
std::vector<char> Types;
More information about the libcxx-commits
mailing list