Debugger:Sync name demangler with specification.

The new stuff is mostly C++11 features (closures etc.).
Also fix a number of bugs uncovered along the way.
All tests succeed now, including the examples
from the specification.

Change-Id: I9b224b0dd82ad8f5b17d5f5d1809d1dea1a7a803
Reviewed-by: Christian Kandeler <christian.kandeler@nokia.com>
This commit is contained in:
Christian Kandeler
2012-07-09 16:23:02 +02:00
parent db265b1fa9
commit 3afbd2f912
5 changed files with 1095 additions and 167 deletions

View File

@@ -62,18 +62,11 @@ public:
int templateParamCount() const { return m_templateParams.count(); } int templateParamCount() const { return m_templateParams.count(); }
ParseTreeNode *templateParamAt(int index) const { return m_templateParams.at(index); } ParseTreeNode *templateParamAt(int index) const { return m_templateParams.at(index); }
void addTemplateParam(ParseTreeNode *node) { m_templateParams << node; } void addTemplateParam(ParseTreeNode *node) { m_templateParams << node; }
void clearTemplateParams() { m_templateParams.clear(); }
// TODO: Can we get rid of this by analyzing the stack?
bool isConversionOperator() const { return m_isConversionOperator; }
void setIsConversionOperator(bool is) { m_isConversionOperator = is; }
private: private:
int m_pos; int m_pos;
QByteArray m_mangledName; QByteArray m_mangledName;
QList<QByteArray> m_substitutions; QList<QByteArray> m_substitutions;
QList<ParseTreeNode *> m_templateParams; QList<ParseTreeNode *> m_templateParams;
bool m_isConversionOperator;
QStack<ParseTreeNode *> m_parseStack; QStack<ParseTreeNode *> m_parseStack;
static const char eoi = '$'; static const char eoi = '$';

View File

@@ -60,7 +60,6 @@ bool NameDemanglerPrivate::demangle(const QString &mangledName)
try { try {
m_parseState.m_mangledName = mangledName.toAscii(); m_parseState.m_mangledName = mangledName.toAscii();
m_parseState.m_pos = 0; m_parseState.m_pos = 0;
m_parseState.m_isConversionOperator = false;
m_demangledName.clear(); m_demangledName.clear();
if (!MangledNameRule::mangledRepresentationStartsWith(m_parseState.peek())) { if (!MangledNameRule::mangledRepresentationStartsWith(m_parseState.peek())) {
@@ -90,7 +89,7 @@ bool NameDemanglerPrivate::demangle(const QString &mangledName)
qDeleteAll(m_parseState.m_parseStack); qDeleteAll(m_parseState.m_parseStack);
m_parseState.m_parseStack.clear(); m_parseState.m_parseStack.clear();
m_parseState.m_substitutions.clear(); m_parseState.m_substitutions.clear();
m_parseState.clearTemplateParams(); m_parseState.m_templateParams.clear();
return success; return success;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -113,7 +113,7 @@ public:
SignedLongLongType, UnsignedLongLongType, SignedInt128Type, UnsignedInt128Type, SignedLongLongType, UnsignedLongLongType, SignedInt128Type, UnsignedInt128Type,
FloatType, DoubleType, LongDoubleType, Float128Type, EllipsisType, FloatType, DoubleType, LongDoubleType, Float128Type, EllipsisType,
DecimalFloatingType64, DecimalFloatingType128, DecimalFloatingType32, DecimalFloatingType64, DecimalFloatingType128, DecimalFloatingType32,
DecimalFloatingType16, Char32Type, Char16Type, VendorType DecimalFloatingType16, Char32Type, Char16Type, AutoType, NullPtrType, VendorType
}; };
Type type() const { return m_type; } Type type() const { return m_type; }
@@ -128,6 +128,9 @@ class CallOffsetRule
public: public:
static bool mangledRepresentationStartsWith(char c); static bool mangledRepresentationStartsWith(char c);
static void parse(GlobalParseState *parseState, ParseTreeNode *parentNode); static void parse(GlobalParseState *parseState, ParseTreeNode *parentNode);
private:
CallOffsetRule();
}; };
class NvOffsetNode : public ParseTreeNode class NvOffsetNode : public ParseTreeNode
@@ -153,6 +156,9 @@ class ClassEnumTypeRule
public: public:
static bool mangledRepresentationStartsWith(char c); static bool mangledRepresentationStartsWith(char c);
static void parse(GlobalParseState *parseState, ParseTreeNode *parentNode); static void parse(GlobalParseState *parseState, ParseTreeNode *parentNode);
private:
ClassEnumTypeRule();
}; };
class DiscriminatorRule class DiscriminatorRule
@@ -160,6 +166,9 @@ class DiscriminatorRule
public: public:
static bool mangledRepresentationStartsWith(char c); static bool mangledRepresentationStartsWith(char c);
static void parse(GlobalParseState *parseState, ParseTreeNode *parentNode); static void parse(GlobalParseState *parseState, ParseTreeNode *parentNode);
private:
DiscriminatorRule();
}; };
class CtorDtorNameNode : public ParseTreeNode class CtorDtorNameNode : public ParseTreeNode
@@ -213,8 +222,14 @@ private:
void parse(); void parse();
enum Type { enum Type {
ConversionType, SizeofType, AlignofType, OperatorType, OtherType, ParameterPackSizeType ConversionType, SizeofType, AlignofType, OperatorType, ParameterPackSizeType,
NewType, ArrayNewType, DeleteType, ArrayDeleteType, PrefixIncrementType,
PrefixDecrementType, TypeIdTypeType, TypeIdExpressionType, DynamicCastType,
StaticCastType, ConstCastType, ReinterpretCastType, MemberAccessType,
PointerMemberAccessType, MemberDerefType, PackExpansionType, ThrowType,
RethrowType, OtherType
} m_type; } m_type;
bool m_globalNamespace;
}; };
class OperatorNameNode : public ParseTreeNode class OperatorNameNode : public ParseTreeNode
@@ -253,6 +268,9 @@ public:
private: private:
void parse(); void parse();
QByteArray m_suffix;
bool m_isNullPtr;
}; };
class FunctionTypeNode : public ParseTreeNode class FunctionTypeNode : public ParseTreeNode
@@ -277,10 +295,15 @@ public:
QByteArray toByteArray() const; QByteArray toByteArray() const;
bool isTemplate() const;
bool isConstructorOrDestructorOrConversionOperator() const;
const CvQualifiersNode *cvQualifiers() const;
private: private:
void parse(); void parse();
bool m_isStringLiteral; bool m_isStringLiteral;
bool m_isDefaultArg;
}; };
class MangledNameRule class MangledNameRule
@@ -288,6 +311,9 @@ class MangledNameRule
public: public:
static bool mangledRepresentationStartsWith(char c); static bool mangledRepresentationStartsWith(char c);
static void parse(GlobalParseState *parseState, ParseTreeNode *parentNode); static void parse(GlobalParseState *parseState, ParseTreeNode *parentNode);
private:
MangledNameRule();
}; };
class NumberNode : public ParseTreeNode class NumberNode : public ParseTreeNode
@@ -351,6 +377,7 @@ public:
bool isTemplate() const; bool isTemplate() const;
bool isConstructorOrDestructorOrConversionOperator() const; bool isConstructorOrDestructorOrConversionOperator() const;
const CvQualifiersNode *cvQualifiers() const;
QByteArray toByteArray() const; QByteArray toByteArray() const;
@@ -452,6 +479,7 @@ public:
bool isTemplate() const; bool isTemplate() const;
bool isConstructorOrDestructorOrConversionOperator() const; bool isConstructorOrDestructorOrConversionOperator() const;
const CvQualifiersNode *cvQualifiers() const;
QByteArray toByteArray() const; QByteArray toByteArray() const;
@@ -507,7 +535,7 @@ public:
enum Type { enum Type {
QualifiedType, PointerType, ReferenceType, RValueType, VendorType, PackExpansionType, QualifiedType, PointerType, ReferenceType, RValueType, VendorType, PackExpansionType,
DeclType, OtherType OtherType
}; };
Type type() const { return m_type; } Type type() const { return m_type; }
@@ -536,6 +564,135 @@ private:
double m_value; double m_value;
}; };
class LambdaSigNode : public ParseTreeNode
{
static bool mangledRepresentationStartsWith(char c);
QByteArray toByteArray() const;
private:
void parse();
};
class ClosureTypeNameNode : public ParseTreeNode
{
QByteArray toByteArray() const;
private:
void parse();
};
class UnnamedTypeNameNode : public ParseTreeNode
{
public:
static bool mangledRepresentationStartsWith(char c);
QByteArray toByteArray() const;
private:
void parse();
};
class DeclTypeNode : public ParseTreeNode
{
public:
static bool mangledRepresentationStartsWith(char c);
QByteArray toByteArray() const;
private:
void parse();
};
class UnresolvedTypeRule
{
public:
static bool mangledRepresentationStartsWith(char c);
static void parse(GlobalParseState *parseState, ParseTreeNode *parentNode);
private:
UnresolvedTypeRule();
};
class SimpleIdNode : public ParseTreeNode
{
public:
static bool mangledRepresentationStartsWith(char c);
QByteArray toByteArray() const;
private:
void parse();
};
class DestructorNameNode : public ParseTreeNode
{
static bool mangledRepresentationStartsWith(char c);
QByteArray toByteArray() const;
private:
void parse();
};
class UnresolvedQualifierLevelRule
{
public:
static bool mangledRepresentationStartsWith(char c);
static void parse(GlobalParseState *parseState, ParseTreeNode *parentNode);
private:
UnresolvedQualifierLevelRule();
};
class BaseUnresolvedNameNode : public ParseTreeNode
{
public:
static bool mangledRepresentationStartsWith(char c);
QByteArray toByteArray() const;
private:
void parse();
bool m_isOperator;
};
class InitializerNode : public ParseTreeNode
{
public:
static bool mangledRepresentationStartsWith(char c);
QByteArray toByteArray() const;
private:
void parse();
};
class UnresolvedNameNode : public ParseTreeNode
{
public:
static bool mangledRepresentationStartsWith(char c);
QByteArray toByteArray() const;
private:
void parse();
bool m_globalNamespace;
};
class FunctionParamNode : public ParseTreeNode
{
public:
static bool mangledRepresentationStartsWith(char c);
QByteArray toByteArray() const;
private:
void parse();
};
} // namespace Internal } // namespace Internal
} // namespace Debugger } // namespace Debugger

View File

@@ -41,6 +41,8 @@
QCOMPARE(demangler.demangledName(), QLatin1String(expectedDemangled)); \ QCOMPARE(demangler.demangledName(), QLatin1String(expectedDemangled)); \
} while (0) } while (0)
const char *toString(char c) { return (QByteArray("'") + c + "'").constData(); }
using namespace Debugger::Internal; using namespace Debugger::Internal;
class NameDemanglerAutoTest : public QObject class NameDemanglerAutoTest : public QObject
@@ -99,7 +101,7 @@ void NameDemanglerAutoTest::testCorrectlyMangledNames()
TEST_CORRECTLY_MANGLED_NAME("_ZZZ3foovEN1C3barEvEN1E3bazEv", TEST_CORRECTLY_MANGLED_NAME("_ZZZ3foovEN1C3barEvEN1E3bazEv",
"foo()::C::bar()::E::baz()"); "foo()::C::bar()::E::baz()");
TEST_CORRECTLY_MANGLED_NAME("_ZZN1N1fEiE1p", "N::f(int)::p"); TEST_CORRECTLY_MANGLED_NAME("_ZZN1N1fEiE1p", "N::f(int)::p");
TEST_CORRECTLY_MANGLED_NAME("_ZZN1N1fEiEs", "N::f(int)::[string literal]"); TEST_CORRECTLY_MANGLED_NAME("_ZZN1N1fEiEs", "N::f(int)::{string literal}");
TEST_CORRECTLY_MANGLED_NAME("_Z41__static_initialization_and_destruction_0ii", TEST_CORRECTLY_MANGLED_NAME("_Z41__static_initialization_and_destruction_0ii",
"__static_initialization_and_destruction_0(int, int)"); "__static_initialization_and_destruction_0(int, int)");
TEST_CORRECTLY_MANGLED_NAME("_ZN20NameDemanglerPrivate3eoiE", TEST_CORRECTLY_MANGLED_NAME("_ZN20NameDemanglerPrivate3eoiE",
@@ -168,6 +170,12 @@ void NameDemanglerAutoTest::testCorrectlyMangledNames()
TEST_CORRECTLY_MANGLED_NAME("_ZN1CppEi", "C::operator++(int)"); TEST_CORRECTLY_MANGLED_NAME("_ZN1CppEi", "C::operator++(int)");
TEST_CORRECTLY_MANGLED_NAME("_ZN1CmmEi", "C::operator--(int)"); TEST_CORRECTLY_MANGLED_NAME("_ZN1CmmEi", "C::operator--(int)");
TEST_CORRECTLY_MANGLED_NAME("_ZNK1CcvT_IPKcEEv", "C::operator char const *<char const *>() const"); TEST_CORRECTLY_MANGLED_NAME("_ZNK1CcvT_IPKcEEv", "C::operator char const *<char const *>() const");
TEST_CORRECTLY_MANGLED_NAME("_Z9weirdfuncIiEvT_KPFS0_S0_E", "void weirdfunc<int>(int, int (* const)(int))");
TEST_CORRECTLY_MANGLED_NAME("_Z9weirdfuncIiEvT_PFS0_DtfL1p_EE", "void weirdfunc<int>(int, int (*)(decltype({param#1})))");
TEST_CORRECTLY_MANGLED_NAME("_Z9weirdfuncIiEvT_S0_", "void weirdfunc<int>(int, int)");
TEST_CORRECTLY_MANGLED_NAME("_Z9weirdfuncIiEvT_DtfL0p_E", "void weirdfunc<int>(int, decltype({param#1}))");
TEST_CORRECTLY_MANGLED_NAME("_Z9weirdfuncIiEvT_S0_S0_", "void weirdfunc<int>(int, int, int)");
TEST_CORRECTLY_MANGLED_NAME("_Z9weirdfuncIiEvT_S0_DtfL0p0_E", "void weirdfunc<int>(int, int, decltype({param#2}))");
// All examples from the ABI spec. // All examples from the ABI spec.
TEST_CORRECTLY_MANGLED_NAME("_ZN1S1xE", "S::x"); TEST_CORRECTLY_MANGLED_NAME("_ZN1S1xE", "S::x");
@@ -178,30 +186,36 @@ void NameDemanglerAutoTest::testCorrectlyMangledNames()
TEST_CORRECTLY_MANGLED_NAME("_Z2CBIL_Z7IsEmptyEE", "CB<IsEmpty>"); TEST_CORRECTLY_MANGLED_NAME("_Z2CBIL_Z7IsEmptyEE", "CB<IsEmpty>");
TEST_CORRECTLY_MANGLED_NAME("_ZZ1giEN1S1fE_2i", "g(int)::S::f(int)"); TEST_CORRECTLY_MANGLED_NAME("_ZZ1giEN1S1fE_2i", "g(int)::S::f(int)");
TEST_CORRECTLY_MANGLED_NAME("_ZZ1gvEN1SC1Ev", "g()::S::S()"); TEST_CORRECTLY_MANGLED_NAME("_ZZ1gvEN1SC1Ev", "g()::S::S()");
TEST_CORRECTLY_MANGLED_NAME("_ZZZ1gvEN1SC1EvEs", "g()::S::S()::[string literal]"); TEST_CORRECTLY_MANGLED_NAME("_ZZZ1gvEN1SC1EvEs", "g()::S::S()::{string literal}");
TEST_CORRECTLY_MANGLED_NAME("_ZZ1gvE5str4a", "g()::str4a"); TEST_CORRECTLY_MANGLED_NAME("_ZZ1gvE5str4a", "g()::str4a");
TEST_CORRECTLY_MANGLED_NAME("_ZZ1gvEs_1", "g()::[string literal]"); TEST_CORRECTLY_MANGLED_NAME("_ZZ1gvEs_1", "g()::{string literal}");
TEST_CORRECTLY_MANGLED_NAME("_ZZ1gvE5str4b", "g()::str4b"); TEST_CORRECTLY_MANGLED_NAME("_ZZ1gvE5str4b", "g()::str4b");
TEST_CORRECTLY_MANGLED_NAME("_Z1fPFvvEM1SFvvE", "f(void (*)(), void (S::*)())"); TEST_CORRECTLY_MANGLED_NAME("_Z1fPFvvEM1SFvvE", "f(void (*)(), void (S::*)())");
TEST_CORRECTLY_MANGLED_NAME("_ZN1N1TIiiE2mfES0_IddE", "N::T<int, int>::mf(N::T<double, double>)"); TEST_CORRECTLY_MANGLED_NAME("_ZN1N1TIiiE2mfES0_IddE", "N::T<int, int>::mf(N::T<double, double>)");
TEST_CORRECTLY_MANGLED_NAME("_ZSt5state", "std::state"); TEST_CORRECTLY_MANGLED_NAME("_ZSt5state", "std::state");
TEST_CORRECTLY_MANGLED_NAME("_ZNSt3_In4wardE", "std::_In::ward"); TEST_CORRECTLY_MANGLED_NAME("_ZNSt3_In4wardE", "std::_In::ward");
/* ABI examples that do not work yet. Partly due to unimplemented C++11 features and missing ABI updates.
TEST_CORRECTLY_MANGLED_NAME("_Z1fIiEvT_PDtfL0pK_E", "??");
TEST_CORRECTLY_MANGLED_NAME("_Z1fN1SUt_E", "f(S::{unnamed type#1})"); TEST_CORRECTLY_MANGLED_NAME("_Z1fN1SUt_E", "f(S::{unnamed type#1})");
TEST_CORRECTLY_MANGLED_NAME("_Z3fooILi2EEvRAplT_Li1E_i", "template void foo<2> (int (&)[3])");
TEST_CORRECTLY_MANGLED_NAME("_ZDTpldtfp_1xdtL_Z1qE1xE", "??");
TEST_CORRECTLY_MANGLED_NAME("_ZDTplfp_dtL_Z1dEsr1B1XIT_EE1xE", "??");
TEST_CORRECTLY_MANGLED_NAME("_ZZZ1giEN1S1fE_2iEUt1_", "g(int)::S::f(int)::{unnamed type#3}"); TEST_CORRECTLY_MANGLED_NAME("_ZZZ1giEN1S1fE_2iEUt1_", "g(int)::S::f(int)::{unnamed type#3}");
TEST_CORRECTLY_MANGLED_NAME("_ZZZ1giEN1S1fE_2iENUt1_2fxEv", "g(int)::S::f(int)::{unnamed type#3}::fx()"); TEST_CORRECTLY_MANGLED_NAME("_ZZZ1giEN1S1fE_2iENUt1_2fxEv", "g(int)::S::f(int)::{unnamed type#3}::fx()");
TEST_CORRECTLY_MANGLED_NAME("_Z1AIcfE", "A<char, float>");
TEST_CORRECTLY_MANGLED_NAME("_Z1fIiEvT_PDtfL0pK_E", "void f<int>(int, decltype({param#1 const}) *)");
TEST_CORRECTLY_MANGLED_NAME("_Z1AILln42EE", "A<-42L>");
TEST_CORRECTLY_MANGLED_NAME("_Z2f1I1QEDTpldtfp_1xdtL_Z1qE1xET_", "decltype({param#1}.x + q.x) f1<Q>(Q)");
TEST_CORRECTLY_MANGLED_NAME("_Z2f2I1QEDTpldtfp_1xsrS0_1xET_", "decltype({param#1}.x + Q::x) f2<Q>(Q)");
TEST_CORRECTLY_MANGLED_NAME("_Z2f3IiEDTplfp_dtL_Z1dEsr1B1XIT_EE1xES1_", "decltype({param#1} + d.B::X<int>::x) f3<int>(int)");
TEST_CORRECTLY_MANGLED_NAME("_Z3fooILi2EEvRAplT_Li1E_i", "void foo<2>(int (&)[2 + 1])");
TEST_CORRECTLY_MANGLED_NAME("_ZZ1giENKUlvE_clEv", "g(int)::{lambda()#1}::operator()() const"); TEST_CORRECTLY_MANGLED_NAME("_ZZ1giENKUlvE_clEv", "g(int)::{lambda()#1}::operator()() const");
TEST_CORRECTLY_MANGLED_NAME("_ZZ1giENKUlvE0_clEv", "g(int)::{lambda()#2}::operator()() const"); TEST_CORRECTLY_MANGLED_NAME("_ZZ1giENKUlvE0_clEv", "g(int)::{lambda()#2}::operator()() const");
TEST_CORRECTLY_MANGLED_NAME("_ZZN1S1fEiiEd0_NKUlvE_clEv", "S::f(int, int)::{default arg#2}::{lambda()#1}::operator()() const");
TEST_CORRECTLY_MANGLED_NAME("_ZZN1S1fEiiEd0_NKUlvE0_clEv", "S::f(int, int)::{default arg#2}::{lambda()#2}::operator()() const");
TEST_CORRECTLY_MANGLED_NAME("_ZZN1S1fEiiEd_NKUlvE_clEv", "S::f(int, int)::{default arg#1}::{lambda()#1}::operator()() const");
TEST_CORRECTLY_MANGLED_NAME("_ZNK1SIiE1xMUlvE_clEv", "S<int>::x::{lambda()#1}::operator()() const"); TEST_CORRECTLY_MANGLED_NAME("_ZNK1SIiE1xMUlvE_clEv", "S<int>::x::{lambda()#1}::operator()() const");
*/ TEST_CORRECTLY_MANGLED_NAME("_ZN1S4funcEii", "S::func(int, int)");
// Note: c++filt from binutils 2.22 demangles these wrong (counts default arguments from first instead of from last)
TEST_CORRECTLY_MANGLED_NAME("_ZZN1S1fEiiEd0_NKUlvE_clEv", "S::f(int, int)::{default arg#1}::{lambda()#1}::operator()() const");
TEST_CORRECTLY_MANGLED_NAME("_ZZN1S1fEiiEd0_NKUlvE0_clEv", "S::f(int, int)::{default arg#1}::{lambda()#2}::operator()() const");
TEST_CORRECTLY_MANGLED_NAME("_ZZN1S1fEiiEd_NKUlvE_clEv", "S::f(int, int)::{default arg#2}::{lambda()#1}::operator()() const");
// Note: gcc 4.6.3 encodes this as "_Z2f4I7OpClassEDTadsrT_miES1_".
TEST_CORRECTLY_MANGLED_NAME("_Z2f4I7OpClassEDTadsrT_onmiES0_", "decltype(&OpClass::operator-) f4<OpClass>(OpClass)");
} }
void NameDemanglerAutoTest::testIncorrectlyMangledNames() void NameDemanglerAutoTest::testIncorrectlyMangledNames()
@@ -248,7 +262,6 @@ void NameDemanglerAutoTest::testDisjunctFirstSets()
QVERIFY(!TemplateArgsNode::mangledRepresentationStartsWith(c) QVERIFY(!TemplateArgsNode::mangledRepresentationStartsWith(c)
|| !Prefix2Node::mangledRepresentationStartsWith(c)); || !Prefix2Node::mangledRepresentationStartsWith(c));
// <template-arg> // <template-arg>
QVERIFY(!TypeNode::mangledRepresentationStartsWith(c) QVERIFY(!TypeNode::mangledRepresentationStartsWith(c)
|| !ExprPrimaryNode::mangledRepresentationStartsWith(c)); || !ExprPrimaryNode::mangledRepresentationStartsWith(c));
@@ -256,16 +269,25 @@ void NameDemanglerAutoTest::testDisjunctFirstSets()
// <expression> // <expression>
QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c)
|| !TemplateParamNode::mangledRepresentationStartsWith(c)); || !TemplateParamNode::mangledRepresentationStartsWith(c));
// QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c)
// || !FunctionParamNode::mangledRepresentationStartsWith(c)) || !FunctionParamNode::mangledRepresentationStartsWith(c));
QVERIFY2(!OperatorNameNode::mangledRepresentationStartsWith(c)
|| !UnresolvedNameNode::mangledRepresentationStartsWith(c)
|| c == 'd' || c == 'g' || c == 'o' || c == 's', toString(c));
QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c)
|| !ExprPrimaryNode::mangledRepresentationStartsWith(c)); || !ExprPrimaryNode::mangledRepresentationStartsWith(c));
// QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c)
// || !FunctionParamNode::mangledRepresentationStartsWith(c)); || !FunctionParamNode::mangledRepresentationStartsWith(c));
QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c)
|| !ExprPrimaryNode::mangledRepresentationStartsWith(c)); || !ExprPrimaryNode::mangledRepresentationStartsWith(c));
// QVERIFY(!FunctionParamNode::mangledRepresentationStartsWith(c) QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c)
// || !ExprPrimaryNode::mangledRepresentationStartsWith(c)); || !FunctionParamNode::mangledRepresentationStartsWith(c));
QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c)
|| !UnresolvedNameNode::mangledRepresentationStartsWith(c));
QVERIFY(!FunctionParamNode::mangledRepresentationStartsWith(c)
|| !UnresolvedNameNode::mangledRepresentationStartsWith(c));
QVERIFY(!FunctionParamNode::mangledRepresentationStartsWith(c)
|| !ExprPrimaryNode::mangledRepresentationStartsWith(c));
// <expr-primary> // <expr-primary>
QVERIFY(!TypeNode::mangledRepresentationStartsWith(c) QVERIFY(!TypeNode::mangledRepresentationStartsWith(c)
@@ -274,9 +296,8 @@ void NameDemanglerAutoTest::testDisjunctFirstSets()
// <type> // <type>
QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c)
|| !FunctionTypeNode::mangledRepresentationStartsWith(c)); || !FunctionTypeNode::mangledRepresentationStartsWith(c));
QVERIFY2(!BuiltinTypeNode::mangledRepresentationStartsWith(c) QVERIFY2(!BuiltinTypeNode::mangledRepresentationStartsWith(c)
|| !ClassEnumTypeRule::mangledRepresentationStartsWith(c) || c == 'D', &c); || !ClassEnumTypeRule::mangledRepresentationStartsWith(c) || c == 'D', toString(c));
QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c)
|| !ArrayTypeNode::mangledRepresentationStartsWith(c)); || !ArrayTypeNode::mangledRepresentationStartsWith(c));
QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c)
@@ -287,6 +308,8 @@ void NameDemanglerAutoTest::testDisjunctFirstSets()
|| !SubstitutionNode::mangledRepresentationStartsWith(c)); || !SubstitutionNode::mangledRepresentationStartsWith(c));
QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c)
|| !CvQualifiersNode::mangledRepresentationStartsWith(c)); || !CvQualifiersNode::mangledRepresentationStartsWith(c));
QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c)
|| !DeclTypeNode::mangledRepresentationStartsWith(c) || c == 'D');
QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c)
|| !ClassEnumTypeRule::mangledRepresentationStartsWith(c)); || !ClassEnumTypeRule::mangledRepresentationStartsWith(c));
QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c)
@@ -299,6 +322,8 @@ void NameDemanglerAutoTest::testDisjunctFirstSets()
|| !SubstitutionNode::mangledRepresentationStartsWith(c)); || !SubstitutionNode::mangledRepresentationStartsWith(c));
QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c)
|| !CvQualifiersNode::mangledRepresentationStartsWith(c)); || !CvQualifiersNode::mangledRepresentationStartsWith(c));
QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c)
|| !DeclTypeNode::mangledRepresentationStartsWith(c));
QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c)
|| !ArrayTypeNode::mangledRepresentationStartsWith(c)); || !ArrayTypeNode::mangledRepresentationStartsWith(c));
QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c)
@@ -309,6 +334,8 @@ void NameDemanglerAutoTest::testDisjunctFirstSets()
|| !SubstitutionNode::mangledRepresentationStartsWith(c)); || !SubstitutionNode::mangledRepresentationStartsWith(c));
QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c)
|| !CvQualifiersNode::mangledRepresentationStartsWith(c)); || !CvQualifiersNode::mangledRepresentationStartsWith(c));
QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c)
|| !DeclTypeNode::mangledRepresentationStartsWith(c) || c == 'D');
QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c) QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c)
|| !PointerToMemberTypeNode::mangledRepresentationStartsWith(c)); || !PointerToMemberTypeNode::mangledRepresentationStartsWith(c));
QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c) QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c)
@@ -317,30 +344,58 @@ void NameDemanglerAutoTest::testDisjunctFirstSets()
|| !SubstitutionNode::mangledRepresentationStartsWith(c)); || !SubstitutionNode::mangledRepresentationStartsWith(c));
QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c) QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c)
|| !CvQualifiersNode::mangledRepresentationStartsWith(c)); || !CvQualifiersNode::mangledRepresentationStartsWith(c));
QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c)
|| !DeclTypeNode::mangledRepresentationStartsWith(c));
QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c) QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c)
|| !TemplateParamNode::mangledRepresentationStartsWith(c)); || !TemplateParamNode::mangledRepresentationStartsWith(c));
QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c) QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c)
|| !SubstitutionNode::mangledRepresentationStartsWith(c)); || !SubstitutionNode::mangledRepresentationStartsWith(c));
QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c) QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c)
|| !CvQualifiersNode::mangledRepresentationStartsWith(c)); || !CvQualifiersNode::mangledRepresentationStartsWith(c));
QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c)
|| !DeclTypeNode::mangledRepresentationStartsWith(c));
QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c)
|| !SubstitutionNode::mangledRepresentationStartsWith(c)); || !SubstitutionNode::mangledRepresentationStartsWith(c));
QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c)
|| !CvQualifiersNode::mangledRepresentationStartsWith(c)); || !CvQualifiersNode::mangledRepresentationStartsWith(c));
QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c)
|| !DeclTypeNode::mangledRepresentationStartsWith(c));
QVERIFY(!SubstitutionNode::mangledRepresentationStartsWith(c) QVERIFY(!SubstitutionNode::mangledRepresentationStartsWith(c)
|| !CvQualifiersNode::mangledRepresentationStartsWith(c)); || !CvQualifiersNode::mangledRepresentationStartsWith(c));
QVERIFY(!SubstitutionNode::mangledRepresentationStartsWith(c)
|| !DeclTypeNode::mangledRepresentationStartsWith(c));
QVERIFY(!CvQualifiersNode::mangledRepresentationStartsWith(c)
|| !DeclTypeNode::mangledRepresentationStartsWith(c));
// <unqualified-name> // <unqualified-name>
QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c)
|| !CtorDtorNameNode::mangledRepresentationStartsWith(c)); || !CtorDtorNameNode::mangledRepresentationStartsWith(c));
QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c)
|| !SourceNameNode::mangledRepresentationStartsWith(c)); || !SourceNameNode::mangledRepresentationStartsWith(c));
QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c)
|| !UnnamedTypeNameNode::mangledRepresentationStartsWith(c));
QVERIFY(!CtorDtorNameNode::mangledRepresentationStartsWith(c) QVERIFY(!CtorDtorNameNode::mangledRepresentationStartsWith(c)
|| !SourceNameNode::mangledRepresentationStartsWith(c)); || !SourceNameNode::mangledRepresentationStartsWith(c));
QVERIFY(!CtorDtorNameNode::mangledRepresentationStartsWith(c)
|| !UnnamedTypeNameNode::mangledRepresentationStartsWith(c));
QVERIFY(!SourceNameNode::mangledRepresentationStartsWith(c)
|| !UnnamedTypeNameNode::mangledRepresentationStartsWith(c));
// <array-type> // <array-type>
QVERIFY(!NonNegativeNumberNode<10>::mangledRepresentationStartsWith(c) QVERIFY(!NonNegativeNumberNode<10>::mangledRepresentationStartsWith(c)
|| !ExpressionNode::mangledRepresentationStartsWith(c)); || !ExpressionNode::mangledRepresentationStartsWith(c) || std::isdigit(c));
// <unresolved-type>
QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c)
|| !DeclTypeNode::mangledRepresentationStartsWith(c));
QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c)
|| !SubstitutionNode::mangledRepresentationStartsWith(c));
QVERIFY(!DeclTypeNode::mangledRepresentationStartsWith(c)
|| !SubstitutionNode::mangledRepresentationStartsWith(c));
// <desctructor-name>
QVERIFY(!UnresolvedTypeRule::mangledRepresentationStartsWith(c)
|| !SimpleIdNode::mangledRepresentationStartsWith(c));
} }
// <template-args>, <template-arg> // <template-args>, <template-arg>
@@ -358,14 +413,15 @@ void NameDemanglerAutoTest::testDisjunctFirstSets()
QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith('c') QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith('c')
&& !TemplateParamNode::mangledRepresentationStartsWith('s') && !TemplateParamNode::mangledRepresentationStartsWith('s')
&& !TemplateParamNode::mangledRepresentationStartsWith('a')); && !TemplateParamNode::mangledRepresentationStartsWith('a'));
// QVERIFY(!FunctionParamNode::mangledRepresentationStartsWith('c') QVERIFY(!FunctionParamNode::mangledRepresentationStartsWith('c')
// && !FunctionParamNode::mangledRepresentationStartsWith('c') && !FunctionParamNode::mangledRepresentationStartsWith('c')
// && !FunctionParamNode::mangledRepresentationStartsWith('c')); && !FunctionParamNode::mangledRepresentationStartsWith('c'));
QVERIFY(!ExprPrimaryNode::mangledRepresentationStartsWith('c') QVERIFY(!ExprPrimaryNode::mangledRepresentationStartsWith('c')
&& !ExprPrimaryNode::mangledRepresentationStartsWith('s') && !ExprPrimaryNode::mangledRepresentationStartsWith('s')
&& !ExprPrimaryNode::mangledRepresentationStartsWith('a')); && !ExprPrimaryNode::mangledRepresentationStartsWith('a'));
QVERIFY(!ExpressionNode::mangledRepresentationStartsWith('E')); QVERIFY(!ExpressionNode::mangledRepresentationStartsWith('E'));
QVERIFY(!ExpressionNode::mangledRepresentationStartsWith('_')); QVERIFY(!ExpressionNode::mangledRepresentationStartsWith('_'));
QVERIFY(!InitializerNode::mangledRepresentationStartsWith('E'));
// <type> // <type>
QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith('P') QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith('P')
@@ -423,6 +479,12 @@ void NameDemanglerAutoTest::testDisjunctFirstSets()
&& !CvQualifiersNode::mangledRepresentationStartsWith('G') && !CvQualifiersNode::mangledRepresentationStartsWith('G')
&& !CvQualifiersNode::mangledRepresentationStartsWith('U') && !CvQualifiersNode::mangledRepresentationStartsWith('U')
&& !CvQualifiersNode::mangledRepresentationStartsWith('D')); && !CvQualifiersNode::mangledRepresentationStartsWith('D'));
QVERIFY(!DeclTypeNode::mangledRepresentationStartsWith('P')
&& !DeclTypeNode::mangledRepresentationStartsWith('R')
&& !DeclTypeNode::mangledRepresentationStartsWith('O')
&& !DeclTypeNode::mangledRepresentationStartsWith('C')
&& !DeclTypeNode::mangledRepresentationStartsWith('G')
&& !DeclTypeNode::mangledRepresentationStartsWith('U'));
// <array-type> // <array-type>
QVERIFY(!NonNegativeNumberNode<10>::mangledRepresentationStartsWith('_')); QVERIFY(!NonNegativeNumberNode<10>::mangledRepresentationStartsWith('_'));
@@ -447,6 +509,24 @@ void NameDemanglerAutoTest::testDisjunctFirstSets()
// <unscoped-name> // <unscoped-name>
QVERIFY(!UnqualifiedNameNode::mangledRepresentationStartsWith('S')); QVERIFY(!UnqualifiedNameNode::mangledRepresentationStartsWith('S'));
// <prefix2>
QVERIFY(!TemplateArgsNode::mangledRepresentationStartsWith('M'));
QVERIFY(!Prefix2Node::mangledRepresentationStartsWith('M'));
// <base-unresolved-name>
QVERIFY(!SimpleIdNode::mangledRepresentationStartsWith('o'));
QVERIFY(!SimpleIdNode::mangledRepresentationStartsWith('d'));
// <initializer>
QVERIFY(!ExpressionNode::mangledRepresentationStartsWith('E'));
// <unresolved-name-node>
QVERIFY(!BaseUnresolvedNameNode::mangledRepresentationStartsWith('g'));
QVERIFY(!BaseUnresolvedNameNode::mangledRepresentationStartsWith('s'));
QVERIFY(!UnresolvedTypeRule::mangledRepresentationStartsWith('N'));
QVERIFY(!UnresolvedQualifierLevelRule::mangledRepresentationStartsWith('N'));
QVERIFY(!UnresolvedQualifierLevelRule::mangledRepresentationStartsWith('E'));
} }
void NameDemanglerAutoTest::testIncorrectlyMangledName( void NameDemanglerAutoTest::testIncorrectlyMangledName(