[libcxxabi] r327226 - [demangler] Support for structured bindings.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Sat Mar 10 13:40:17 PST 2018


On 10 Mar 2018 13:33, "Erik Pilkington via cfe-commits" <
cfe-commits at lists.llvm.org> wrote:

Author: epilk
Date: Sat Mar 10 13:31:15 2018
New Revision: 327226

URL: http://llvm.org/viewvc/llvm-project?rev=327226&view=rev
Log:
[demangler] Support for structured bindings.

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=327226&r1=327225&r2=327226&view=diff
============================================================
==================
--- libcxxabi/trunk/src/cxa_demangle.cpp (original)
+++ libcxxabi/trunk/src/cxa_demangle.cpp Sat Mar 10 13:31:15 2018
@@ -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 *S
 //                    ::= <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
    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 *Sta
     }

     // 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);

Modified: libcxxabi/trunk/test/test_demangle.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/
test_demangle.pass.cpp?rev=327226&r1=327225&r2=327226&view=diff
============================================================
==================
--- libcxxabi/trunk/test/test_demangle.pass.cpp (original)
+++ libcxxabi/trunk/test/test_demangle.pass.cpp Sat Mar 10 13:31:15 2018
@@ -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]"},


Do we really need the prefix here? In the front-end we just use "NS::[x,y]"
for this.

 };

 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?


_______________________________________________
cfe-commits mailing list
cfe-commits at lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180310/2b8a03d5/attachment.html>


More information about the cfe-commits mailing list