| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | /****************************************************************************
 | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2016-01-15 14:55:33 +01:00
										 |  |  | ** Copyright (C) 2016 The Qt Company Ltd. | 
					
						
							|  |  |  | ** Contact: https://www.qt.io/licensing/
 | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** This file is part of Qt Creator. | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** Commercial License Usage | 
					
						
							|  |  |  | ** Licensees holding valid commercial Qt licenses may use this file in | 
					
						
							|  |  |  | ** accordance with the commercial license agreement provided with the | 
					
						
							|  |  |  | ** Software or, alternatively, in accordance with the terms contained in | 
					
						
							| 
									
										
										
										
											2016-01-15 14:55:33 +01:00
										 |  |  | ** a written agreement between you and The Qt Company. For licensing terms | 
					
						
							|  |  |  | ** and conditions see https://www.qt.io/terms-conditions. For further
 | 
					
						
							|  |  |  | ** information use the contact form at https://www.qt.io/contact-us.
 | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2016-01-15 14:55:33 +01:00
										 |  |  | ** GNU General Public License Usage | 
					
						
							|  |  |  | ** Alternatively, this file may be used under the terms of the GNU | 
					
						
							|  |  |  | ** General Public License version 3 as published by the Free Software | 
					
						
							|  |  |  | ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT | 
					
						
							|  |  |  | ** included in the packaging of this file. Please review the following | 
					
						
							|  |  |  | ** information to ensure the GNU General Public License requirements will | 
					
						
							|  |  |  | ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
 | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ****************************************************************************/ | 
					
						
							| 
									
										
										
										
											2014-01-15 12:34:17 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  | #include <namedemangler/namedemangler.h>
 | 
					
						
							|  |  |  | #include <namedemangler/parsetreenodes.h>
 | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <QObject>
 | 
					
						
							| 
									
										
										
										
											2014-01-15 12:57:35 +01:00
										 |  |  | #include <QDebug>
 | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  | #include <QTest>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-27 15:47:47 +02:00
										 |  |  | #include <cctype>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  | const char *toString(char c) { return (QByteArray("'") + c + "'").constData(); } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  | using namespace Debugger::Internal; | 
					
						
							| 
									
										
										
										
											2014-01-15 12:34:17 +01:00
										 |  |  | using namespace QTest; | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class NameDemanglerAutoTest : public QObject | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Q_OBJECT | 
					
						
							|  |  |  | private slots: | 
					
						
							|  |  |  |     void testUnmangledName(); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |     void testDisjunctFirstSets(); | 
					
						
							| 
									
										
										
										
											2012-07-06 16:14:07 +02:00
										 |  |  |     void testCorrectlyMangledNames(); | 
					
						
							| 
									
										
										
										
											2014-01-15 12:34:17 +01:00
										 |  |  |     void testCorrectlyMangledNames_data(); | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  |     void testIncorrectlyMangledNames(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     void testIncorrectlyMangledName(const QString &mangledName); | 
					
						
							|  |  |  |     NameDemangler demangler; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void NameDemanglerAutoTest::testUnmangledName() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-01-16 16:33:07 +01:00
										 |  |  |     QVERIFY(demangler.demangle(QLatin1String("f")) | 
					
						
							|  |  |  |             && demangler.demangledName() == QLatin1String("f")); | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-06 16:14:07 +02:00
										 |  |  | void NameDemanglerAutoTest::testCorrectlyMangledNames() | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-01-15 12:34:17 +01:00
										 |  |  |     QFETCH(QString, demangled); | 
					
						
							|  |  |  |     QString mangled = QString::fromLatin1(currentDataTag()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QVERIFY2(demangler.demangle(mangled), qPrintable(demangler.errorString())); | 
					
						
							|  |  |  |     QCOMPARE(demangler.demangledName(), demangled); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void NameDemanglerAutoTest::testCorrectlyMangledNames_data() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     addColumn<QString>("demangled"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     newRow("_Z1fv") | 
					
						
							|  |  |  |         << "f()"; | 
					
						
							|  |  |  |     newRow("_Z1fi") | 
					
						
							|  |  |  |         << "f(int)"; | 
					
						
							| 
									
										
										
										
											2014-01-15 12:57:35 +01:00
										 |  |  | #ifdef Q_OS_LINUX
 | 
					
						
							| 
									
										
										
										
											2014-01-15 12:34:17 +01:00
										 |  |  |     newRow("_Z3foo3bar") | 
					
						
							|  |  |  |         << "foo(bar)"; | 
					
						
							|  |  |  |     newRow("_Zrm1XS_") | 
					
						
							|  |  |  |         << "operator%(X, X)"; | 
					
						
							|  |  |  |     newRow("_ZplR1XS0_") | 
					
						
							|  |  |  |         << "operator+(X &, X &)"; | 
					
						
							|  |  |  |     newRow("_ZlsRK1XS1_") | 
					
						
							|  |  |  |         << "operator<<(X const &, X const &)"; | 
					
						
							|  |  |  |     newRow("_ZN3FooIA4_iE3barE") | 
					
						
							|  |  |  |         << "Foo<int[4]>::bar"; | 
					
						
							|  |  |  |     newRow("_Z5firstI3DuoEvS0_") | 
					
						
							|  |  |  |         << "void first<Duo>(Duo)"; | 
					
						
							|  |  |  |     newRow("_Z5firstI3DuoEvT_") | 
					
						
							|  |  |  |         << "void first<Duo>(Duo)"; | 
					
						
							|  |  |  |     newRow("_Z3fooIiPFidEiEvv") | 
					
						
							|  |  |  |         << "void foo<int, int (*)(double), int>()"; | 
					
						
							|  |  |  |     newRow("_ZN1N1fE") | 
					
						
							|  |  |  |         << "N::f"; | 
					
						
							|  |  |  |     newRow("_ZN6System5Sound4beepEv") | 
					
						
							|  |  |  |         << "System::Sound::beep()"; | 
					
						
							|  |  |  |     newRow("_ZN5Arena5levelE") | 
					
						
							|  |  |  |         << "Arena::level"; | 
					
						
							|  |  |  |     newRow("_ZN5StackIiiE5levelE") | 
					
						
							|  |  |  |         << "Stack<int, int>::level"; | 
					
						
							|  |  |  |     newRow("_Z1fI1XEvPVN1AIT_E1TE") | 
					
						
							|  |  |  |         << "void f<X>(A<X>::T volatile *)"; | 
					
						
							|  |  |  |     newRow("_ZngILi42EEvN1AIXplT_Li2EEE1TE") | 
					
						
							|  |  |  |         << "void operator-<42>(A<42 + 2>::T)"; | 
					
						
							|  |  |  |     newRow("_Z4makeI7FactoryiET_IT0_Ev") | 
					
						
							|  |  |  |         << "Factory<int> make<Factory, int>()"; | 
					
						
							|  |  |  |     newRow("_Z3foo5Hello5WorldS0_S_") | 
					
						
							|  |  |  |         << "foo(Hello, World, World, Hello)"; | 
					
						
							|  |  |  |     newRow("_Z3fooPM2ABi") | 
					
						
							|  |  |  |         << "foo(int AB::**)"; | 
					
						
							|  |  |  |     newRow("_ZlsRSoRKSs") | 
					
						
							|  |  |  |         << "operator<<(std::basic_ostream<char, std::char_traits<char> > &, " | 
					
						
							|  |  |  |            "std::basic_string<char, std::char_traits<char>, " | 
					
						
							|  |  |  |            "std::allocator<char> > const &)"; | 
					
						
							|  |  |  |     newRow("_ZTI7a_class") | 
					
						
							|  |  |  |         << "typeid(a_class)"; | 
					
						
							|  |  |  |     newRow("_ZZN1A3fooEiE1B") | 
					
						
							|  |  |  |         << "A::foo(int)::B"; | 
					
						
							|  |  |  |     newRow("_ZZ3foovEN1C1DE") | 
					
						
							|  |  |  |         << "foo()::C::D"; | 
					
						
							|  |  |  |     newRow("_ZZZ3foovEN1C3barEvEN1E3bazEv") | 
					
						
							|  |  |  |         << "foo()::C::bar()::E::baz()"; | 
					
						
							|  |  |  |     newRow("_ZZN1N1fEiE1p") | 
					
						
							|  |  |  |         << "N::f(int)::p"; | 
					
						
							|  |  |  |     newRow("_ZZN1N1fEiEs") | 
					
						
							|  |  |  |         << "N::f(int)::{string literal}"; | 
					
						
							|  |  |  |     newRow("_Z41__static_initialization_and_destruction_0ii") | 
					
						
							|  |  |  |         << "__static_initialization_and_destruction_0(int, int)"; | 
					
						
							|  |  |  |     newRow("_ZN20NameDemanglerPrivate3eoiE") | 
					
						
							|  |  |  |         << "NameDemanglerPrivate::eoi"; | 
					
						
							|  |  |  |     newRow("_ZZN20NameDemanglerPrivate15parseIdentifierEiE8__func__") | 
					
						
							|  |  |  |         << "NameDemanglerPrivate::parseIdentifier(int)::__func__"; | 
					
						
							|  |  |  |     newRow("_ZN4QSetI5QCharED1Ev") | 
					
						
							|  |  |  |         << "QSet<QChar>::~QSet()"; | 
					
						
							|  |  |  |     newRow("_Zne5QCharS_") | 
					
						
							|  |  |  |         << "operator!=(QChar, QChar)"; | 
					
						
							|  |  |  |     newRow("_ZN20NameDemanglerPrivate17parseFunctionTypeEv") | 
					
						
							|  |  |  |         << "NameDemanglerPrivate::parseFunctionType()"; | 
					
						
							|  |  |  |     newRow("_ZNK20NameDemanglerPrivate16ArrayNewOperator8makeExprERK11QStringList") | 
					
						
							|  |  |  |         << "NameDemanglerPrivate::ArrayNewOperator::makeExpr(QStringList const &) const"; | 
					
						
							|  |  |  |     newRow("_ZN13QLatin1StringC1EPKc") | 
					
						
							|  |  |  |         << "QLatin1String::QLatin1String(char const *)"; | 
					
						
							|  |  |  |     newRow("_ZN15QtSharedPointer16ExternalRefCountIN20NameDemanglerPrivate8OperatorEE12internalCopyIS2_EEvRKNS0_IT_EE") | 
					
						
							|  |  |  |         << "void QtSharedPointer::ExternalRefCount<NameDemanglerPrivate::Operator>" | 
					
						
							|  |  |  |            "::internalCopy<NameDemanglerPrivate::Operator>(QtSharedPointer" | 
					
						
							|  |  |  |            "::ExternalRefCount<NameDemanglerPrivate::Operator> const &)"; | 
					
						
							|  |  |  |     newRow("_ZN15QtSharedPointer16ExternalRefCountIN20NameDemanglerPrivate8OperatorEE11internalSetEPNS_20ExternalRefCountDataEPS2_") | 
					
						
							|  |  |  |         << "QtSharedPointer::ExternalRefCount<NameDemanglerPrivate::Operator>" | 
					
						
							|  |  |  |            "::internalSet(QtSharedPointer::ExternalRefCountData *, NameDemanglerPrivate::Operator *)"; | 
					
						
							|  |  |  |     newRow("_ZN20NameDemanglerPrivate17parseUnscopedNameEv") | 
					
						
							|  |  |  |         << "NameDemanglerPrivate::parseUnscopedName()"; | 
					
						
							|  |  |  |     newRow("_ZNK7QString3argExiiRK5QChar") | 
					
						
							|  |  |  |         << "QString::arg(long long, int, int, QChar const &) const"; | 
					
						
							|  |  |  |     newRow("_ZN20NameDemanglerPrivate8OperatorC2ERK7QStringS3_") | 
					
						
							|  |  |  |         << "NameDemanglerPrivate::Operator::Operator(QString const &, QString const &)"; | 
					
						
							|  |  |  |     newRow("_ZN15QtSharedPointer16ExternalRefCountIN20NameDemanglerPrivate8OperatorEEC2EN2Qt14InitializationE") | 
					
						
							|  |  |  |         << "QtSharedPointer::ExternalRefCount<NameDemanglerPrivate::Operator>::ExternalRefCount(Qt::Initialization)"; | 
					
						
							|  |  |  |     newRow("_ZN7QString5clearEv") | 
					
						
							|  |  |  |         << "QString::clear()"; | 
					
						
							|  |  |  |     newRow("_ZNK5QListI7QStringE2atEi") | 
					
						
							|  |  |  |         << "QList<QString>::at(int) const"; | 
					
						
							|  |  |  |     newRow("_ZNK7QString10startsWithERKS_N2Qt15CaseSensitivityE") | 
					
						
							|  |  |  |         << "QString::startsWith(QString const &, Qt::CaseSensitivity) const"; | 
					
						
							|  |  |  |     newRow("_ZNK4QSetI5QCharE8constEndEv") | 
					
						
							|  |  |  |         << "QSet<QChar>::constEnd() const"; | 
					
						
							|  |  |  |     newRow("_Z11qt_assert_xPKcS0_S0_i") | 
					
						
							|  |  |  |         << "qt_assert_x(char const *, char const *, char const *, int)"; | 
					
						
							|  |  |  |     newRow("_ZN9QHashData8willGrowEv") | 
					
						
							|  |  |  |         << "QHashData::willGrow()"; | 
					
						
							|  |  |  |     newRow("_ZNK5QHashI5QChar15QHashDummyValueE14const_iteratorneERKS3_") | 
					
						
							|  |  |  |         << "QHash<QChar, QHashDummyValue>::const_iterator::operator!=" | 
					
						
							|  |  |  |            "(QHash<QChar, QHashDummyValue>::const_iterator const &) const"; | 
					
						
							|  |  |  |     newRow("_ZNK13NameDemangler11errorStringEv") | 
					
						
							|  |  |  |         << "NameDemangler::errorString() const"; | 
					
						
							|  |  |  |     newRow("_ZN7QString7replaceERK7QRegExpRKS_") | 
					
						
							|  |  |  |         << "QString::replace(QRegExp const &, QString const &)"; | 
					
						
							|  |  |  |     newRow("_ZN7QString4freeEPNS_4DataE") | 
					
						
							|  |  |  |         << "QString::free(QString::Data *)"; | 
					
						
							|  |  |  |     newRow("_ZTSN20NameDemanglerPrivate19ArrayAccessOperatorE") | 
					
						
							|  |  |  |         << "typeid(NameDemanglerPrivate::ArrayAccessOperator).name()"; | 
					
						
							|  |  |  |     newRow("_ZN3ns11fERKPFPKiS1_RKhE") | 
					
						
							|  |  |  |         << "ns1::f(int const * (* const &)(int const *, unsigned char const &))"; | 
					
						
							|  |  |  |     newRow("_Z9test_funcMN3ns11cImEEKFPKvPiRlmE") | 
					
						
							|  |  |  |         << "test_func(void const * (ns1::c<unsigned long>::*)(int *, long &, unsigned long) const)"; | 
					
						
							|  |  |  |     newRow("_ZN3ns11fEPKPFPKiS1_RKhE") | 
					
						
							|  |  |  |         << "ns1::f(int const * (* const *)(int const *, unsigned char const &))"; | 
					
						
							|  |  |  |     newRow("_ZNK1CcviEv") | 
					
						
							|  |  |  |         << "C::operator int() const"; | 
					
						
							|  |  |  |     newRow("_ZN1CppEv") | 
					
						
							|  |  |  |         << "C::operator++()"; | 
					
						
							|  |  |  |     newRow("_ZN1CmmEv") | 
					
						
							|  |  |  |         << "C::operator--()"; | 
					
						
							|  |  |  |     newRow("_ZN1CppEi") | 
					
						
							|  |  |  |         << "C::operator++(int)"; | 
					
						
							|  |  |  |     newRow("_ZN1CmmEi") | 
					
						
							|  |  |  |         << "C::operator--(int)"; | 
					
						
							|  |  |  |     newRow("_ZNK1CcvT_IPKcEEv") | 
					
						
							|  |  |  |         << "C::operator char const *<char const *>() const"; | 
					
						
							|  |  |  |     newRow("_Z9weirdfuncIiEvT_KPFS0_S0_E") | 
					
						
							|  |  |  |         << "void weirdfunc<int>(int, int (* const)(int))"; | 
					
						
							|  |  |  |     newRow("_Z9weirdfuncIiEvT_PFS0_DtfL1p_EE") | 
					
						
							|  |  |  |         << "void weirdfunc<int>(int, int (*)(decltype({param#1})))"; | 
					
						
							|  |  |  |     newRow("_Z9weirdfuncIiEvT_S0_") | 
					
						
							|  |  |  |         << "void weirdfunc<int>(int, int)"; | 
					
						
							|  |  |  |     newRow("_Z9weirdfuncIiEvT_DtfL0p_E") | 
					
						
							|  |  |  |         << "void weirdfunc<int>(int, decltype({param#1}))"; | 
					
						
							|  |  |  |     newRow("_Z9weirdfuncIiEvT_S0_S0_") | 
					
						
							|  |  |  |         << "void weirdfunc<int>(int, int, int)"; | 
					
						
							|  |  |  |     newRow("_Z9weirdfuncIiEvT_S0_DtfL0p0_E") | 
					
						
							|  |  |  |         << "void weirdfunc<int>(int, int, decltype({param#2}))"; | 
					
						
							|  |  |  |     newRow("_Z8toStringIiESsT_") | 
					
						
							|  |  |  |         << "std::basic_string<char, std::char_traits<char>, std::allocator<char> > toString<int>(int)"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     newRow("_Z4funcIRA5_iEvOT_") | 
					
						
							|  |  |  |         << "void func<int (&)[5]>(int (&)[5])"; | 
					
						
							|  |  |  |     newRow("_ZSt9make_pairIiRA5_KcESt4pairINSt17__decay_and_stripIT_E6__typeENS4_IT0_E6__typeEEOS5_OS8_") | 
					
						
							|  |  |  |         << "std::pair<std::__decay_and_strip<int>::__type, " | 
					
						
							|  |  |  |            "std::__decay_and_strip<char const (&)[5]>::__type> " | 
					
						
							|  |  |  |            "std::make_pair<int, char const (&)[5]>(int &&, char const (&)[5])"; | 
					
						
							| 
									
										
										
										
											2012-07-06 20:03:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // All examples from the ABI spec.
 | 
					
						
							| 
									
										
										
										
											2014-01-15 12:34:17 +01:00
										 |  |  |     newRow("_ZN1S1xE") | 
					
						
							|  |  |  |         << "S::x"; | 
					
						
							|  |  |  |     newRow("_Z1fM1AKFvvE") | 
					
						
							|  |  |  |         << "f(void (A::*)() const)"; | 
					
						
							|  |  |  |     newRow("_Z1fIiEvT_") | 
					
						
							|  |  |  |         << "void f<int>(int)"; | 
					
						
							|  |  |  |     newRow("_Z3fooc") | 
					
						
							|  |  |  |         << "foo(char)"; | 
					
						
							|  |  |  |     newRow("_Z2CBIL_Z3foocEE") | 
					
						
							|  |  |  |         << "CB<foo(char)>"; | 
					
						
							|  |  |  |     newRow("_Z2CBIL_Z7IsEmptyEE") | 
					
						
							|  |  |  |         << "CB<IsEmpty>"; | 
					
						
							|  |  |  |     newRow("_ZZ1giEN1S1fE_2i") | 
					
						
							|  |  |  |         << "g(int)::S::f(int)"; | 
					
						
							|  |  |  |     newRow("_ZZ1gvEN1SC1Ev") | 
					
						
							|  |  |  |         << "g()::S::S()"; | 
					
						
							|  |  |  |     newRow("_ZZZ1gvEN1SC1EvEs") | 
					
						
							|  |  |  |         << "g()::S::S()::{string literal}"; | 
					
						
							|  |  |  |     newRow("_ZZ1gvE5str4a") | 
					
						
							|  |  |  |         << "g()::str4a"; | 
					
						
							|  |  |  |     newRow("_ZZ1gvEs_1") | 
					
						
							|  |  |  |         << "g()::{string literal}"; | 
					
						
							|  |  |  |     newRow("_ZZ1gvE5str4b") | 
					
						
							|  |  |  |         << "g()::str4b"; | 
					
						
							|  |  |  |     newRow("_Z1fPFvvEM1SFvvE") | 
					
						
							|  |  |  |         << "f(void (*)(), void (S::*)())"; | 
					
						
							|  |  |  |     newRow("_ZN1N1TIiiE2mfES0_IddE") | 
					
						
							|  |  |  |         << "N::T<int, int>::mf(N::T<double, double>)"; | 
					
						
							|  |  |  |     newRow("_ZSt5state") | 
					
						
							|  |  |  |         << "std::state"; | 
					
						
							|  |  |  |     newRow("_ZNSt3_In4wardE") | 
					
						
							|  |  |  |         << "std::_In::ward"; | 
					
						
							|  |  |  |     newRow("_Z1fN1SUt_E") | 
					
						
							|  |  |  |         << "f(S::{unnamed type#1})"; | 
					
						
							|  |  |  |     newRow("_ZZZ1giEN1S1fE_2iEUt1_") | 
					
						
							|  |  |  |         << "g(int)::S::f(int)::{unnamed type#3}"; | 
					
						
							|  |  |  |     newRow("_ZZZ1giEN1S1fE_2iENUt1_2fxEv") | 
					
						
							|  |  |  |         << "g(int)::S::f(int)::{unnamed type#3}::fx()"; | 
					
						
							|  |  |  |     newRow("_Z1AIcfE") | 
					
						
							|  |  |  |         << "A<char, float>"; | 
					
						
							|  |  |  |     newRow("_Z1fIiEvT_PDtfL0pK_E") | 
					
						
							|  |  |  |         << "void f<int>(int, decltype({param#1 const}) *)"; | 
					
						
							|  |  |  |     newRow("_Z1AILln42EE") | 
					
						
							|  |  |  |         << "A<-42L>"; | 
					
						
							|  |  |  |     newRow("_Z2f1I1QEDTpldtfp_1xdtL_Z1qE1xET_") | 
					
						
							|  |  |  |         << "decltype({param#1}.x + q.x) f1<Q>(Q)"; | 
					
						
							|  |  |  |     newRow("_Z2f2I1QEDTpldtfp_1xsrS0_1xET_") | 
					
						
							|  |  |  |         << "decltype({param#1}.x + Q::x) f2<Q>(Q)"; | 
					
						
							|  |  |  |     newRow("_Z2f3IiEDTplfp_dtL_Z1dEsr1B1XIT_EE1xES1_") | 
					
						
							|  |  |  |         << "decltype({param#1} + d.B::X<int>::x) f3<int>(int)"; | 
					
						
							|  |  |  |     newRow("_Z3fooILi2EEvRAplT_Li1E_i") | 
					
						
							|  |  |  |         << "void foo<2>(int (&)[2 + 1])"; | 
					
						
							|  |  |  |     newRow("_ZZ1giENKUlvE_clEv") | 
					
						
							|  |  |  |         << "g(int)::{lambda()#1}::operator()() const"; | 
					
						
							|  |  |  |     newRow("_ZZ1giENKUlvE0_clEv") | 
					
						
							|  |  |  |         << "g(int)::{lambda()#2}::operator()() const"; | 
					
						
							|  |  |  |     newRow("_ZNK1SIiE1xMUlvE_clEv") | 
					
						
							|  |  |  |         << "S<int>::x::{lambda()#1}::operator()() const"; | 
					
						
							|  |  |  |     newRow("_ZN1S4funcEii") | 
					
						
							|  |  |  |         << "S::func(int, int)"; | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Note: c++filt from binutils 2.22 demangles these wrong (counts default arguments from first instead of from last)
 | 
					
						
							| 
									
										
										
										
											2014-01-15 12:34:17 +01:00
										 |  |  |     newRow("_ZZN1S1fEiiEd0_NKUlvE_clEv") | 
					
						
							|  |  |  |         << "S::f(int, int)::{default arg#1}::{lambda()#1}::operator()() const"; | 
					
						
							|  |  |  |     newRow("_ZZN1S1fEiiEd0_NKUlvE0_clEv") | 
					
						
							|  |  |  |         << "S::f(int, int)::{default arg#1}::{lambda()#2}::operator()() const"; | 
					
						
							|  |  |  |     newRow("_ZZN1S1fEiiEd_NKUlvE_clEv") | 
					
						
							|  |  |  |         << "S::f(int, int)::{default arg#2}::{lambda()#1}::operator()() const"; | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |      // Note: gcc 4.6.3 encodes this as "_Z2f4I7OpClassEDTadsrT_miES1_".
 | 
					
						
							| 
									
										
										
										
											2014-01-15 12:34:17 +01:00
										 |  |  |     newRow("_Z2f4I7OpClassEDTadsrT_onmiES0_") | 
					
						
							|  |  |  |         << "decltype(&OpClass::operator-) f4<OpClass>(OpClass)"; | 
					
						
							| 
									
										
										
										
											2014-01-15 12:57:35 +01:00
										 |  |  | #else
 | 
					
						
							|  |  |  |     qDebug("Most tests disabled outside Linux"); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void NameDemanglerAutoTest::testIncorrectlyMangledNames() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  | void NameDemanglerAutoTest::testDisjunctFirstSets() | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |     for (char c = 0x20; c < 0x7e; ++c) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // <encoding>
 | 
					
						
							|  |  |  |         QVERIFY(!NameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !SpecialNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // <name>
 | 
					
						
							|  |  |  |         QVERIFY(!NestedNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !UnscopedNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!NestedNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !SubstitutionNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!NestedNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !LocalNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!UnscopedNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !SubstitutionNode::mangledRepresentationStartsWith(c) || c == 'S'); | 
					
						
							|  |  |  |         QVERIFY(!UnscopedNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !LocalNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!SubstitutionNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !LocalNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // <nested-name>
 | 
					
						
							|  |  |  |         QVERIFY(!CvQualifiersNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !PrefixNode::mangledRepresentationStartsWith(c) || c == 'r'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // <prefix>
 | 
					
						
							|  |  |  |         QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !SubstitutionNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!TemplateArgsNode::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-08-10 16:46:38 +02:00
										 |  |  |                 || !UnqualifiedNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |         QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-08-10 16:46:38 +02:00
										 |  |  |                 || !UnqualifiedNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |         QVERIFY(!SubstitutionNode::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-08-10 16:46:38 +02:00
										 |  |  |                 || !UnqualifiedNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // <template-arg>
 | 
					
						
							|  |  |  |         QVERIFY(!TypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !ExprPrimaryNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // <expression>
 | 
					
						
							|  |  |  |         QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !TemplateParamNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |                 || !FunctionParamNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY2(!OperatorNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !UnresolvedNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                  || c == 'd' || c == 'g' || c == 'o' || c == 's', toString(c)); | 
					
						
							|  |  |  |         QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !ExprPrimaryNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !FunctionParamNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |                 || !ExprPrimaryNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |                 || !FunctionParamNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !UnresolvedNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!FunctionParamNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !UnresolvedNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!FunctionParamNode::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |                 || !ExprPrimaryNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // <expr-primary>
 | 
					
						
							|  |  |  |         QVERIFY(!TypeNode::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-07-06 20:03:58 +02:00
										 |  |  |                 || !MangledNameRule::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // <type>
 | 
					
						
							|  |  |  |         QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !FunctionTypeNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY2(!BuiltinTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |                 || !ClassEnumTypeRule::mangledRepresentationStartsWith(c) || c == 'D', toString(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |         QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !ArrayTypeNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !PointerToMemberTypeNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !TemplateParamNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !SubstitutionNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !CvQualifiersNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |         QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !DeclTypeNode::mangledRepresentationStartsWith(c) || c == 'D'); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |         QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-07-06 20:03:58 +02:00
										 |  |  |                 || !ClassEnumTypeRule::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |         QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !ArrayTypeNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !PointerToMemberTypeNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !TemplateParamNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !SubstitutionNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !CvQualifiersNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |         QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !DeclTypeNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 20:03:58 +02:00
										 |  |  |         QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |                 || !ArrayTypeNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 20:03:58 +02:00
										 |  |  |         QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |                 || !PointerToMemberTypeNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 20:03:58 +02:00
										 |  |  |         QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |                 || !TemplateParamNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 20:03:58 +02:00
										 |  |  |         QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |                 || !SubstitutionNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 20:03:58 +02:00
										 |  |  |         QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |                 || !CvQualifiersNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |         QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !DeclTypeNode::mangledRepresentationStartsWith(c) || c == 'D'); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |         QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !PointerToMemberTypeNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !TemplateParamNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !SubstitutionNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !CvQualifiersNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |         QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !DeclTypeNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |         QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !TemplateParamNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !SubstitutionNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !CvQualifiersNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |         QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !DeclTypeNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |         QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !SubstitutionNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !CvQualifiersNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |         QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !DeclTypeNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |         QVERIFY(!SubstitutionNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !CvQualifiersNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |         QVERIFY(!SubstitutionNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !DeclTypeNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!CvQualifiersNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !DeclTypeNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // <unqualified-name>
 | 
					
						
							|  |  |  |         QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !CtorDtorNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !SourceNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |         QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !UnnamedTypeNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |         QVERIFY(!CtorDtorNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !SourceNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |         QVERIFY(!CtorDtorNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !UnnamedTypeNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							|  |  |  |         QVERIFY(!SourceNameNode::mangledRepresentationStartsWith(c) | 
					
						
							|  |  |  |                 || !UnnamedTypeNameNode::mangledRepresentationStartsWith(c)); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // <array-type>
 | 
					
						
							| 
									
										
										
										
											2012-07-06 16:14:07 +02:00
										 |  |  |         QVERIFY(!NonNegativeNumberNode<10>::mangledRepresentationStartsWith(c) | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |                 || !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)); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // <template-args>, <template-arg>
 | 
					
						
							|  |  |  |     QVERIFY(!TemplateArgNode::mangledRepresentationStartsWith('E')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // <template-arg>
 | 
					
						
							|  |  |  |     QVERIFY(!TypeNode::mangledRepresentationStartsWith('X') | 
					
						
							|  |  |  |             && !TypeNode::mangledRepresentationStartsWith('J') | 
					
						
							|  |  |  |             /* && !TypeNode::mangledRepresentationStartsWith('s') */); | 
					
						
							|  |  |  |     QVERIFY(!ExprPrimaryNode::mangledRepresentationStartsWith('X') | 
					
						
							|  |  |  |              && !ExprPrimaryNode::mangledRepresentationStartsWith('J') | 
					
						
							|  |  |  |              && !ExprPrimaryNode::mangledRepresentationStartsWith('s')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // <expression>
 | 
					
						
							|  |  |  |     QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith('c') | 
					
						
							|  |  |  |             && !TemplateParamNode::mangledRepresentationStartsWith('s') | 
					
						
							|  |  |  |             && !TemplateParamNode::mangledRepresentationStartsWith('a')); | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |     QVERIFY(!FunctionParamNode::mangledRepresentationStartsWith('c') | 
					
						
							|  |  |  |             && !FunctionParamNode::mangledRepresentationStartsWith('c') | 
					
						
							|  |  |  |             && !FunctionParamNode::mangledRepresentationStartsWith('c')); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |     QVERIFY(!ExprPrimaryNode::mangledRepresentationStartsWith('c') | 
					
						
							|  |  |  |             && !ExprPrimaryNode::mangledRepresentationStartsWith('s') | 
					
						
							|  |  |  |             && !ExprPrimaryNode::mangledRepresentationStartsWith('a')); | 
					
						
							|  |  |  |     QVERIFY(!ExpressionNode::mangledRepresentationStartsWith('E')); | 
					
						
							|  |  |  |     QVERIFY(!ExpressionNode::mangledRepresentationStartsWith('_')); | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |     QVERIFY(!InitializerNode::mangledRepresentationStartsWith('E')); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // <type>
 | 
					
						
							|  |  |  |     QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith('P') | 
					
						
							|  |  |  |             && !BuiltinTypeNode::mangledRepresentationStartsWith('R') | 
					
						
							|  |  |  |             && !BuiltinTypeNode::mangledRepresentationStartsWith('O') | 
					
						
							|  |  |  |             && !BuiltinTypeNode::mangledRepresentationStartsWith('C') | 
					
						
							|  |  |  |             && !BuiltinTypeNode::mangledRepresentationStartsWith('G') | 
					
						
							|  |  |  |             && !BuiltinTypeNode::mangledRepresentationStartsWith('U')); | 
					
						
							|  |  |  |     QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith('P') | 
					
						
							|  |  |  |             && !FunctionTypeNode::mangledRepresentationStartsWith('R') | 
					
						
							|  |  |  |             && !FunctionTypeNode::mangledRepresentationStartsWith('O') | 
					
						
							|  |  |  |             && !FunctionTypeNode::mangledRepresentationStartsWith('C') | 
					
						
							|  |  |  |             && !FunctionTypeNode::mangledRepresentationStartsWith('G') | 
					
						
							|  |  |  |             && !FunctionTypeNode::mangledRepresentationStartsWith('U') | 
					
						
							|  |  |  |             && !FunctionTypeNode::mangledRepresentationStartsWith('D')); | 
					
						
							| 
									
										
										
										
											2012-07-06 20:03:58 +02:00
										 |  |  |     QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith('P') | 
					
						
							|  |  |  |             && !ClassEnumTypeRule::mangledRepresentationStartsWith('R') | 
					
						
							|  |  |  |             && !ClassEnumTypeRule::mangledRepresentationStartsWith('O') | 
					
						
							|  |  |  |             && !ClassEnumTypeRule::mangledRepresentationStartsWith('C') | 
					
						
							|  |  |  |             && !ClassEnumTypeRule::mangledRepresentationStartsWith('G') | 
					
						
							|  |  |  |             && !ClassEnumTypeRule::mangledRepresentationStartsWith('U') | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |             /* && !firstSetClassEnumType.contains('D') */); | 
					
						
							|  |  |  |     QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith('P') | 
					
						
							|  |  |  |             && !ArrayTypeNode::mangledRepresentationStartsWith('R') | 
					
						
							|  |  |  |             && !ArrayTypeNode::mangledRepresentationStartsWith('O') | 
					
						
							|  |  |  |             && !ArrayTypeNode::mangledRepresentationStartsWith('C') | 
					
						
							|  |  |  |             && !ArrayTypeNode::mangledRepresentationStartsWith('G') | 
					
						
							|  |  |  |             && !ArrayTypeNode::mangledRepresentationStartsWith('U') | 
					
						
							|  |  |  |             && !ArrayTypeNode::mangledRepresentationStartsWith('D')); | 
					
						
							|  |  |  |     QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith('P') | 
					
						
							|  |  |  |             && !PointerToMemberTypeNode::mangledRepresentationStartsWith('R') | 
					
						
							|  |  |  |             && !PointerToMemberTypeNode::mangledRepresentationStartsWith('O') | 
					
						
							|  |  |  |             && !PointerToMemberTypeNode::mangledRepresentationStartsWith('C') | 
					
						
							|  |  |  |             && !PointerToMemberTypeNode::mangledRepresentationStartsWith('G') | 
					
						
							|  |  |  |             && !PointerToMemberTypeNode::mangledRepresentationStartsWith('U') | 
					
						
							|  |  |  |             && !PointerToMemberTypeNode::mangledRepresentationStartsWith('D')); | 
					
						
							|  |  |  |     QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith('P') | 
					
						
							|  |  |  |             && !TemplateParamNode::mangledRepresentationStartsWith('R') | 
					
						
							|  |  |  |             && !TemplateParamNode::mangledRepresentationStartsWith('O') | 
					
						
							|  |  |  |             && !TemplateParamNode::mangledRepresentationStartsWith('C') | 
					
						
							|  |  |  |             && !TemplateParamNode::mangledRepresentationStartsWith('G') | 
					
						
							|  |  |  |             && !TemplateParamNode::mangledRepresentationStartsWith('U') | 
					
						
							|  |  |  |             && !TemplateParamNode::mangledRepresentationStartsWith('D')); | 
					
						
							|  |  |  |     QVERIFY(!SubstitutionNode::mangledRepresentationStartsWith('P') | 
					
						
							|  |  |  |             && !SubstitutionNode::mangledRepresentationStartsWith('R') | 
					
						
							|  |  |  |             && !SubstitutionNode::mangledRepresentationStartsWith('O') | 
					
						
							|  |  |  |             && !SubstitutionNode::mangledRepresentationStartsWith('C') | 
					
						
							|  |  |  |             && !SubstitutionNode::mangledRepresentationStartsWith('G') | 
					
						
							|  |  |  |             && !SubstitutionNode::mangledRepresentationStartsWith('U') | 
					
						
							|  |  |  |             && !SubstitutionNode::mangledRepresentationStartsWith('D')); | 
					
						
							|  |  |  |     QVERIFY(!CvQualifiersNode::mangledRepresentationStartsWith('P') | 
					
						
							|  |  |  |             && !CvQualifiersNode::mangledRepresentationStartsWith('R') | 
					
						
							|  |  |  |             && !CvQualifiersNode::mangledRepresentationStartsWith('O') | 
					
						
							|  |  |  |             && !CvQualifiersNode::mangledRepresentationStartsWith('C') | 
					
						
							|  |  |  |             && !CvQualifiersNode::mangledRepresentationStartsWith('G') | 
					
						
							|  |  |  |             && !CvQualifiersNode::mangledRepresentationStartsWith('U') | 
					
						
							|  |  |  |             && !CvQualifiersNode::mangledRepresentationStartsWith('D')); | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |     QVERIFY(!DeclTypeNode::mangledRepresentationStartsWith('P') | 
					
						
							|  |  |  |             && !DeclTypeNode::mangledRepresentationStartsWith('R') | 
					
						
							|  |  |  |             && !DeclTypeNode::mangledRepresentationStartsWith('O') | 
					
						
							|  |  |  |             && !DeclTypeNode::mangledRepresentationStartsWith('C') | 
					
						
							|  |  |  |             && !DeclTypeNode::mangledRepresentationStartsWith('G') | 
					
						
							|  |  |  |             && !DeclTypeNode::mangledRepresentationStartsWith('U')); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // <array-type>
 | 
					
						
							| 
									
										
										
										
											2012-07-06 16:14:07 +02:00
										 |  |  |     QVERIFY(!NonNegativeNumberNode<10>::mangledRepresentationStartsWith('_')); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  |     QVERIFY(!ExpressionNode::mangledRepresentationStartsWith('_')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // <substitution>
 | 
					
						
							| 
									
										
										
										
											2012-07-06 16:14:07 +02:00
										 |  |  |     QVERIFY(!NonNegativeNumberNode<36>::mangledRepresentationStartsWith('_') | 
					
						
							|  |  |  |             && !NonNegativeNumberNode<36>::mangledRepresentationStartsWith('t') | 
					
						
							|  |  |  |             && !NonNegativeNumberNode<36>::mangledRepresentationStartsWith('a') | 
					
						
							|  |  |  |             && !NonNegativeNumberNode<36>::mangledRepresentationStartsWith('b') | 
					
						
							|  |  |  |             && !NonNegativeNumberNode<36>::mangledRepresentationStartsWith('s') | 
					
						
							|  |  |  |             && !NonNegativeNumberNode<36>::mangledRepresentationStartsWith('i') | 
					
						
							|  |  |  |             && !NonNegativeNumberNode<36>::mangledRepresentationStartsWith('o') | 
					
						
							|  |  |  |             && !NonNegativeNumberNode<36>::mangledRepresentationStartsWith('d')); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // <special-name>
 | 
					
						
							| 
									
										
										
										
											2012-07-06 20:03:58 +02:00
										 |  |  |     QVERIFY(!CallOffsetRule::mangledRepresentationStartsWith('V') | 
					
						
							|  |  |  |             && !CallOffsetRule::mangledRepresentationStartsWith('T') | 
					
						
							|  |  |  |             && !CallOffsetRule::mangledRepresentationStartsWith('I') | 
					
						
							|  |  |  |             && !CallOffsetRule::mangledRepresentationStartsWith('S') | 
					
						
							|  |  |  |             && !CallOffsetRule::mangledRepresentationStartsWith('c')); | 
					
						
							| 
									
										
										
										
											2012-07-06 09:29:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // <unscoped-name>
 | 
					
						
							|  |  |  |     QVERIFY(!UnqualifiedNameNode::mangledRepresentationStartsWith('S')); | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-10 16:46:38 +02:00
										 |  |  |     // <prefix>
 | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  |     QVERIFY(!TemplateArgsNode::mangledRepresentationStartsWith('M')); | 
					
						
							| 
									
										
										
										
											2012-08-10 16:46:38 +02:00
										 |  |  |     QVERIFY(!UnqualifiedNameNode::mangledRepresentationStartsWith('M')); | 
					
						
							| 
									
										
										
										
											2012-07-09 16:23:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // <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')); | 
					
						
							| 
									
										
										
										
											2012-05-09 12:08:22 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void NameDemanglerAutoTest::testIncorrectlyMangledName( | 
					
						
							|  |  |  |     const QString &mangledName) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QVERIFY(!demangler.demangle(mangledName)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QTEST_MAIN(NameDemanglerAutoTest) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "tst_namedemangler.moc"
 |