summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorErik Pilkington <erik.pilkington@gmail.com>2018-04-09 18:31:50 +0000
committerErik Pilkington <erik.pilkington@gmail.com>2018-04-09 18:31:50 +0000
commit650130ac04c608df194a28e1e2ce397ee0e16851 (patch)
treee32230a2bff2209bd927f191dab93194419aab23 /llvm/lib
parent682a417e51e9af492f5b9b1e12793e157e3b1be9 (diff)
downloadbcm5719-llvm-650130ac04c608df194a28e1e2ce397ee0e16851.tar.gz
bcm5719-llvm-650130ac04c608df194a28e1e2ce397ee0e16851.zip
[demangler] Support for partially substituted sizeof....
llvm-svn: 329599
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Demangle/ItaniumDemangle.cpp25
1 files changed, 24 insertions, 1 deletions
diff --git a/llvm/lib/Demangle/ItaniumDemangle.cpp b/llvm/lib/Demangle/ItaniumDemangle.cpp
index 3f610a41422..894af7e4fb5 100644
--- a/llvm/lib/Demangle/ItaniumDemangle.cpp
+++ b/llvm/lib/Demangle/ItaniumDemangle.cpp
@@ -153,6 +153,7 @@ public:
class Node {
public:
enum Kind : unsigned char {
+ KNodeArrayNode,
KDotSuffix,
KVendorExtQualType,
KQualType,
@@ -315,6 +316,14 @@ public:
}
};
+struct NodeArrayNode : Node {
+ NodeArray Array;
+ NodeArrayNode(NodeArray Array_) : Node(KNodeArrayNode), Array(Array_) {}
+ void printLeft(OutputStream &S) const override {
+ Array.printWithComma(S);
+ }
+};
+
class DotSuffix final : public Node {
const Node *Prefix;
const StringView Suffix;
@@ -3813,6 +3822,7 @@ Node *Db::parseBracedExpr() {
// ::= ds <expression> <expression> # expr.*expr
// ::= sZ <template-param> # size of a parameter pack
// ::= sZ <function-param> # size of a function parameter pack
+// ::= sP <template-arg>* E # sizeof...(T), size of a captured template parameter pack from an alias template
// ::= sp <expression> # pack expansion
// ::= tw <expression> # throw expression
// ::= tr # throw with no operand (rethrow)
@@ -4213,9 +4223,22 @@ Node *Db::parseExpr() {
Node *FP = parseFunctionParam();
if (FP == nullptr)
return nullptr;
- return make<EnclosingExpr>("sizeof...", FP, ")");
+ return make<EnclosingExpr>("sizeof... (", FP, ")");
}
return nullptr;
+ case 'P': {
+ First += 2;
+ size_t ArgsBegin = Names.size();
+ while (!consumeIf('E')) {
+ Node *Arg = parseTemplateArg();
+ if (Arg == nullptr)
+ return nullptr;
+ Names.push_back(Arg);
+ }
+ return make<EnclosingExpr>(
+ "sizeof... (", make<NodeArrayNode>(popTrailingNodeArray(ArgsBegin)),
+ ")");
+ }
}
return nullptr;
case 't':
OpenPOWER on IntegriCloud