summaryrefslogtreecommitdiff
path: root/libcxxabi
diff options
context:
space:
mode:
authorErik Pilkington <erik.pilkington@gmail.com>2018-04-09 18:32:25 +0000
committerErik Pilkington <erik.pilkington@gmail.com>2018-04-09 18:32:25 +0000
commitf109bba97d4c344675078803cfa432889d899a5e (patch)
tree74c77fd8ba5dfe125780c95da0cb788346dd9b47 /libcxxabi
parentabd2440de06f1ef3d5378718bc3b30ecee52a2a3 (diff)
[demangler] Support for <data-member-prefix>.
Diffstat (limited to 'libcxxabi')
-rw-r--r--libcxxabi/src/cxa_demangle.cpp9
-rw-r--r--libcxxabi/test/test_demangle.pass.cpp3
2 files changed, 12 insertions, 0 deletions
diff --git a/libcxxabi/src/cxa_demangle.cpp b/libcxxabi/src/cxa_demangle.cpp
index 05bdc18e3a3..5261363c360 100644
--- a/libcxxabi/src/cxa_demangle.cpp
+++ b/libcxxabi/src/cxa_demangle.cpp
@@ -2639,6 +2639,8 @@ Node *Db::parseCtorDtorName(Node *&SoFar, NameState *State) {
// ::= <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 @@ Node *Db::parseNestedName(NameState *State) {
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/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp
index 1269d128b5b..b9736e4962a 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -29740,6 +29740,9 @@ const char* cases[][2] =
{"_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]);