[Lldb-commits] [PATCH] D34911: Enable parsing C++ names generated by lambda functions.

Xuetian Weng via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Fri Jun 30 14:38:08 PDT 2017


wengxt created this revision.

CPlusPlusLanguage::MethodName could not parse demangled name generated
by lambda functions. Fix that and add a regression test.


https://reviews.llvm.org/D34911

Files:
  source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
  source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.h
  unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp


Index: unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
===================================================================
--- unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
+++ unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
@@ -62,6 +62,11 @@
        "XX::(anonymous namespace)::anon_class", "anon_func", "()", "const",
        "XX::(anonymous namespace)::anon_class::anon_func"},
 
+      // Lambda
+      {"main::{lambda()#1}::operator()() const::{lambda()#1}::operator()() const",
+       "main::{lambda()#1}::operator()() const::{lambda()#1}", "operator()", "()", "const",
+       "main::{lambda()#1}::operator()() const::{lambda()#1}::operator()"},
+
       // Function pointers
       {"string (*f(vector<int>&&))(float)", "", "f", "(vector<int>&&)", "",
        "f"},
Index: source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.h
===================================================================
--- source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.h
+++ source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.h
@@ -143,6 +143,9 @@
   // Consumes '(anonymous namespace)'
   bool ConsumeAnonymousNamespace();
 
+  // Consumes '{lambda ...}'
+  bool ConsumeLambda();
+
   // Consumes operator declaration like 'operator *' or 'operator delete []'
   bool ConsumeOperator();
 
Index: source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
===================================================================
--- source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
+++ source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
@@ -274,6 +274,28 @@
   return true;
 }
 
+bool CPlusPlusNameParser::ConsumeLambda() {
+  Bookmark start_position = SetBookmark();
+  if (!ConsumeToken(tok::l_brace)) {
+    return false;
+  }
+  constexpr llvm::StringLiteral g_lambda("lambda");
+  if (HasMoreTokens() && Peek().is(tok::raw_identifier) &&
+      Peek().getRawIdentifier() == g_lambda) {
+    // Put the matched brace back so we can use ConsumeBrackets
+    TakeBack();
+  } else {
+    return false;
+  }
+
+  if (!ConsumeBrackets(tok::l_brace, tok::r_brace)) {
+    return false;
+  }
+
+  start_position.Remove();
+  return true;
+}
+
 bool CPlusPlusNameParser::ConsumeBrackets(tok::TokenKind left,
                                           tok::TokenKind right) {
   Bookmark start_position = SetBookmark();
@@ -502,6 +524,15 @@
       state = State::AfterTwoColons;
       break;
     }
+    case tok::l_brace:
+      if (state == State::Beginning || state == State::AfterTwoColons) {
+        if (ConsumeLambda()) {
+          state = State::AfterIdentifier;
+          break;
+        }
+      }
+      continue_parsing = false;
+      break;
     case tok::coloncolon: // Type nesting delimiter.
       if (state != State::Beginning && state != State::AfterIdentifier &&
           state != State::AfterTemplate) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D34911.104936.patch
Type: text/x-patch
Size: 2859 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20170630/93e8e640/attachment.bin>


More information about the lldb-commits mailing list