[demangler] Support for <data-member-prefix>.

git-svn-id: https://llvm.org/svn/llvm-project/libcxxabi/trunk@329600 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/src/cxa_demangle.cpp b/src/cxa_demangle.cpp
index 05bdc18..5261363 100644
--- a/src/cxa_demangle.cpp
+++ b/src/cxa_demangle.cpp
@@ -2639,6 +2639,8 @@
 //          ::= <prefix> <data-member-prefix>
 //  extension ::= L
 //
+// <data-member-prefix> := <member source-name> [<template-args>] M
+//
 // <template-prefix> ::= <prefix> <template unqualified-name>
 //                   ::= <template-param>
 //                   ::= <substitution>
@@ -2669,6 +2671,13 @@
   while (!consumeIf('E')) {
     consumeIf('L'); // extension
 
+    // <data-member-prefix> := <member source-name> [<template-args>] M
+    if (consumeIf('M')) {
+      if (SoFar == nullptr)
+        return nullptr;
+      continue;
+    }
+
     //          ::= <template-param>
     if (look() == 'T') {
       Node *TP = parseTemplateParam();
diff --git a/test/test_demangle.pass.cpp b/test/test_demangle.pass.cpp
index 1269d12..b9736e4 100644
--- a/test/test_demangle.pass.cpp
+++ b/test/test_demangle.pass.cpp
@@ -29740,6 +29740,9 @@
     {"_ZN1Scv7MuncherIJDpPT_EEIJFivEA_iEEEv", "S::operator Muncher<int (*)(), int (*) []><int (), int []>()"},
 
     {"_Z2f8IiJ8identityIiES0_IfEEEvRAsPiDpT0_T_DpNS3_4typeEE_i", "void f8<int, identity<int>, identity<float> >(int (&) [sizeof... (int, identity<int>, identity<float>, int, identity<int>::type, identity<float>::type)])"},
+
+    {"_ZNK13StaticMembersIfE1xMUlvE_clEv", "StaticMembers<float>::x::'lambda'()::operator()() const"},
+    {"_ZNK10inline_varMUlvE_clEv", "inline_var::'lambda'()::operator()() const"},
 };
 
 const unsigned N = sizeof(cases) / sizeof(cases[0]);