On 2018-03-10 4:40 PM, Richard Smith wrote:
On 10 Mar 2018 13:33, "Erik Pilkington via cfe-commits" <cfe-commits@lists.llvm.org <mailto:cfe-commits@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
    <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
    
<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
    
<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.
I suppose not, that printing is just as informative and less verbose. Fixed this in r327228, thanks for the review!

     };

     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@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>
    http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
    <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits>



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to