summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErik Pilkington <erik.pilkington@gmail.com>2018-03-10 21:31:15 +0000
committerErik Pilkington <erik.pilkington@gmail.com>2018-03-10 21:31:15 +0000
commitb1a7f3c741a260df1c0e9e9f62518601f72ac2a7 (patch)
tree2a25f692c7e60a9d51222968d96039d55dd8283f
parentd88204fe1bb1785dd14d06233308ac95d4de7906 (diff)
downloadbcm5719-llvm-b1a7f3c741a260df1c0e9e9f62518601f72ac2a7.tar.gz
bcm5719-llvm-b1a7f3c741a260df1c0e9e9f62518601f72ac2a7.zip
[demangler] Support for structured bindings.
llvm-svn: 327226
-rw-r--r--libcxxabi/src/cxa_demangle.cpp29
-rw-r--r--libcxxabi/test/test_demangle.pass.cpp5
2 files changed, 30 insertions, 4 deletions
diff --git a/libcxxabi/src/cxa_demangle.cpp b/libcxxabi/src/cxa_demangle.cpp
index ffd887a71da..5c313cb46fb 100644
--- a/libcxxabi/src/cxa_demangle.cpp
+++ b/libcxxabi/src/cxa_demangle.cpp
@@ -197,6 +197,7 @@ public:
KDtorName,
KUnnamedTypeName,
KClosureTypeName,
+ KStructuredBindingName,
KExpr,
KBracedExpr,
KBracedRangeExpr,
@@ -1337,6 +1338,19 @@ public:
}
};
+class StructuredBindingName : public Node {
+ NodeArray Bindings;
+public:
+ StructuredBindingName(NodeArray Bindings_)
+ : Node(KStructuredBindingName), Bindings(Bindings_) {}
+
+ void printLeft(OutputStream &S) const override {
+ S += "'structured-binding'[";
+ Bindings.printWithComma(S);
+ S += ']';
+ }
+};
+
// -- Expression Nodes --
struct Expr : public Node {
@@ -2217,7 +2231,7 @@ Node *Db::parseUnscopedName(NameState *State) {
// ::= <ctor-dtor-name>
// ::= <source-name>
// ::= <unnamed-type-name>
-// FIXME: ::= DC <source-name>+ E # structured binding declaration
+// ::= DC <source-name>+ E # structured binding declaration
Node *Db::parseUnqualifiedName(NameState *State) {
// <ctor-dtor-name>s are special-cased in parseNestedName().
Node *Result;
@@ -2225,7 +2239,16 @@ Node *Db::parseUnqualifiedName(NameState *State) {
Result = parseUnnamedTypeName(State);
else if (look() >= '1' && look() <= '9')
Result = parseSourceName(State);
- else
+ else if (consumeIf("DC")) {
+ size_t BindingsBegin = Names.size();
+ do {
+ Node *Binding = parseSourceName(State);
+ if (Binding == nullptr)
+ return nullptr;
+ Names.push_back(Binding);
+ } while (!consumeIf('E'));
+ Result = make<StructuredBindingName>(popTrailingNodeArray(BindingsBegin));
+ } else
Result = parseOperatorName(State);
if (Result != nullptr)
Result = parseAbiTags(Result);
@@ -2689,7 +2712,7 @@ Node *Db::parseNestedName(NameState *State) {
}
// Parse an <unqualified-name> thats actually a <ctor-dtor-name>.
- if (look() == 'C' || look() == 'D') {
+ if (look() == 'C' || (look() == 'D' && look(1) != 'C')) {
if (SoFar == nullptr)
return nullptr;
Node *CtorDtor = parseCtorDtorName(SoFar, State);
diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp
index ef2821cc606..8e97a7fdf3b 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -29718,6 +29718,10 @@ const char* cases[][2] =
{"_Z1fSsB1XS_", "f(std::string[abi:X], std::string[abi:X])"},
{"___Z10blocksNRVOv_block_invoke", "invocation function for block in blocksNRVO()"},
+
+ // Structured bindings:
+ {"_ZDC2a12a2E", "'structured-binding'[a1, a2]"},
+ {"_ZN2NSDC1x1yEE", "NS::'structured-binding'[x, y]"},
};
const unsigned N = sizeof(cases) / sizeof(cases[0]);
@@ -29848,7 +29852,6 @@ void test_invalid_cases()
const char *xfail_cases[] = {
"_Z1fUa9enable_ifIXLi1EEEv", // enable_if attribute
- "_ZDC2a12a2E", // decomposition decl
"_ZW6FooBarE2f3v", // C++ modules TS
// FIXME: Why does clang generate the "cp" expr?
OpenPOWER on IntegriCloud