diff --git a/src/plugins/debugger/namedemangler/parsetreenodes.cpp b/src/plugins/debugger/namedemangler/parsetreenodes.cpp index c40478bdb98c9d4bf89cc018ce049e0fb7b2ca72..92f88bfe0b1f364120349cf993a56a753af5cfdb 100644 --- a/src/plugins/debugger/namedemangler/parsetreenodes.cpp +++ b/src/plugins/debugger/namedemangler/parsetreenodes.cpp @@ -831,10 +831,10 @@ QByteArray ExpressionNode::toByteArray() const repr.append(CHILD_TO_BYTEARRAY(0)).append(".*").append(CHILD_TO_BYTEARRAY(1)); break; case ParameterPackSizeType: - repr = CHILD_TO_BYTEARRAY(0); // TODO: What does this look like? + repr = "sizeof...(" + CHILD_TO_BYTEARRAY(0) + ')'; break; case PackExpansionType: - repr = CHILD_TO_BYTEARRAY(0); // TODO: What does this look like? + repr = CHILD_TO_BYTEARRAY(0) + "..."; break; case ThrowType: repr.append("throw ").append(CHILD_TO_BYTEARRAY(0)); @@ -2008,7 +2008,7 @@ bool TemplateArgNode::mangledRepresentationStartsWith(char c) { return TypeNode::mangledRepresentationStartsWith(c) || ExprPrimaryNode::mangledRepresentationStartsWith(c) - || c == 'X' || c == 'I'; + || c == 'X' || c == 'J'; } /* @@ -2021,7 +2021,7 @@ void TemplateArgNode::parse() { m_isTemplateArgumentPack = false; - char next = PEEK(); + const char next = PEEK(); if (TypeNode::mangledRepresentationStartsWith(next)) { PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); } else if (ExprPrimaryNode::mangledRepresentationStartsWith(next)) { @@ -2032,6 +2032,7 @@ void TemplateArgNode::parse() if (ADVANCE() != 'E') throw ParseException(QString::fromLatin1("Invalid template-arg")); } else if (next == 'J') { + m_isTemplateArgumentPack = true; ADVANCE(); while (TemplateArgNode::mangledRepresentationStartsWith(PEEK())) PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateArgNode); @@ -2048,12 +2049,9 @@ QByteArray TemplateArgNode::toByteArray() const { if (m_isTemplateArgumentPack) { QByteArray repr; - for (int i = 0; i < childCount(); ++i) { - if (i > 0 && i < childCount() - 1) - repr += ", "; // TODO: Probably not the right syntax - repr += CHILD_TO_BYTEARRAY(i); - } - return repr; + for (int i = 0; i < childCount(); ++i) + repr.append(CHILD_TO_BYTEARRAY(i)).append(", "); + return repr += "typename..."; } return CHILD_TO_BYTEARRAY(0); } @@ -2402,7 +2400,7 @@ QByteArray TypeNode::toByteArray() const if (qualPtrRefList.isEmpty()) { switch (currentNode->m_type) { - case PackExpansionType: return CHILD_TO_BYTEARRAY(0); // TODO: What's the syntax? + case PackExpansionType: return CHILD_TO_BYTEARRAY(0) + "..."; case VendorType: return pasteAllChildren(); case OtherType: return pasteAllChildren(); @@ -2463,6 +2461,7 @@ QByteArray TypeNode::qualPtrRefListToByteArray(const QList<const ParseTreeNode * if (!repr.isEmpty()) repr.prepend(' '); repr.prepend("&&"); + break; default: DEMANGLER_ASSERT(false); }