Author: epilk Date: Mon Feb 12 16:15:53 2018 New Revision: 324969 URL: http://llvm.org/viewvc/llvm-project?rev=324969&view=rev Log: [demangler] Support for dependent elaborate type specifiers.
Modified: libcxxabi/trunk/src/cxa_demangle.cpp libcxxabi/trunk/test/test_demangle.pass.cpp Modified: libcxxabi/trunk/src/cxa_demangle.cpp URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_demangle.cpp?rev=324969&r1=324968&r2=324969&view=diff ============================================================================== --- libcxxabi/trunk/src/cxa_demangle.cpp (original) +++ libcxxabi/trunk/src/cxa_demangle.cpp Mon Feb 12 16:15:53 2018 @@ -165,6 +165,7 @@ public: KQualType, KConversionOperatorType, KPostfixQualifiedType, + KElaboratedTypeSpefType, KNameType, KAbiTagAttr, KObjCProtoName, @@ -443,6 +444,22 @@ public: void printLeft(OutputStream &s) const override { s += Name; } }; +class ElaboratedTypeSpefType : public Node { + StringView Kind; + Node *Child; +public: + ElaboratedTypeSpefType(StringView Kind_, Node *Child_) + : Node(KElaboratedTypeSpefType), Kind(Kind_), Child(Child_) { + ParameterPackSize = Child->ParameterPackSize; + } + + void printLeft(OutputStream &S) const override { + S += Kind; + S += ' '; + Child->print(S); + } +}; + class AbiTagAttr final : public Node { const Node* Base; StringView Tag; @@ -2235,8 +2252,22 @@ Node *Db::parsePointerToMemberType() { // ::= Tu <name> # dependent elaborated type specifier using 'union' // ::= Te <name> # dependent elaborated type specifier using 'enum' Node *Db::parseClassEnumType() { - // FIXME: try to parse the elaborated type specifiers here! - return legacyParse<parse_name>(); + StringView ElabSpef; + if (consumeIf("Ts")) + ElabSpef = "struct"; + else if (consumeIf("Tu")) + ElabSpef = "union"; + else if (consumeIf("Te")) + ElabSpef = "enum"; + + Node *Name = legacyParse<parse_name>(); + if (Name == nullptr) + return nullptr; + + if (!ElabSpef.empty()) + return make<ElaboratedTypeSpefType>(ElabSpef, Name); + + return Name; } // <qualified-type> ::= <qualifiers> <type> @@ -2495,6 +2526,12 @@ Node *Db::parseType() { } // ::= <template-param> case 'T': { + // This could be an elaborate type specifier on a <class-enum-type>. + if (look(1) == 's' || look(1) == 'u' || look(1) == 'e') { + Result = parseClassEnumType(); + break; + } + Result = legacyParse<parse_template_param>(); if (Result == nullptr) return nullptr; Modified: libcxxabi/trunk/test/test_demangle.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/test_demangle.pass.cpp?rev=324969&r1=324968&r2=324969&view=diff ============================================================================== --- libcxxabi/trunk/test/test_demangle.pass.cpp (original) +++ libcxxabi/trunk/test/test_demangle.pass.cpp Mon Feb 12 16:15:53 2018 @@ -29658,7 +29658,11 @@ const char* cases[][2] = {"_ZNK5test81XIiE3barIiEEDTcl3fooIT_EEEv", "decltype(foo<int>()) test8::X<int>::bar<int>() const"}, // Multiple qualifiers on the same type should all get the same entry in the substitution table. - {"_Z1fPU3AS1KiS0_", "f(int const AS1*, int const AS1*)"} + {"_Z1fPU3AS1KiS0_", "f(int const AS1*, int const AS1*)"}, + + {"_ZN6test471fINS_1SEEEvPTsNT_1cE", "void test47::f<test47::S>(struct test47::S::c*)"}, + {"_ZN6test481fINS_1SEEEvPTuNT_1uE", "void test48::f<test48::S>(union test48::S::u*)"}, + {"_ZN6test451fINS_1SEEEvPTeNT_1eE", "void test45::f<test45::S>(enum test45::S::e*)"}, }; const unsigned N = sizeof(cases) / sizeof(cases[0]); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits