summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Ingham <jingham@apple.com>2017-07-13 19:48:43 +0000
committerJim Ingham <jingham@apple.com>2017-07-13 19:48:43 +0000
commit055e65f0d4879dc7f33b797daee89d49b619b950 (patch)
tree5669b8bd5b4dd6ed5da56619fe173c0de104909e
parent61949c9f6f82416f5d6599d02a834a944eb3168b (diff)
downloadbcm5719-llvm-055e65f0d4879dc7f33b797daee89d49b619b950.tar.gz
bcm5719-llvm-055e65f0d4879dc7f33b797daee89d49b619b950.zip
Enable parsing C++ names generated by lambda functions.
https://reviews.llvm.org/D34911 from Weng Xuetian. llvm-svn: 307944
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp31
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.h3
-rw-r--r--lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp5
3 files changed, 39 insertions, 0 deletions
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
index 5f0596cc9ad..88bdd68ff30 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
@@ -274,6 +274,28 @@ bool CPlusPlusNameParser::ConsumeAnonymousNamespace() {
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 @@ CPlusPlusNameParser::ParseFullNameImpl() {
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) {
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.h b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.h
index f936fb787c9..fe1d46f32c1 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.h
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.h
@@ -143,6 +143,9 @@ private:
// Consumes '(anonymous namespace)'
bool ConsumeAnonymousNamespace();
+ // Consumes '{lambda ...}'
+ bool ConsumeLambda();
+
// Consumes operator declaration like 'operator *' or 'operator delete []'
bool ConsumeOperator();
diff --git a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
index 8c7fade8375..1e7dd77c4de 100644
--- a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
+++ b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
@@ -62,6 +62,11 @@ TEST(CPlusPlusLanguage, MethodNameParsing) {
"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"},
OpenPOWER on IntegriCloud