summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Pilkington <erik.pilkington@gmail.com>2018-03-10 21:31:22 +0000
committerErik Pilkington <erik.pilkington@gmail.com>2018-03-10 21:31:22 +0000
commitd145e1f94ec1a7be9501c595234ea32bced8a1b5 (patch)
tree68b4dd4cd4c310a8baa585d11b0f3892a6c72d96
parentdee4d0b1531d9aecf14f14a4223fb2d725beb8b3 (diff)
[demangler] Support for sequence numbers on lifetime extended temporaries.
git-svn-id: https://llvm.org/svn/llvm-project/libcxxabi/trunk@327227 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--src/cxa_demangle.cpp8
-rw-r--r--test/test_demangle.pass.cpp3
2 files changed, 11 insertions, 0 deletions
diff --git a/src/cxa_demangle.cpp b/src/cxa_demangle.cpp
index 5c313cb..bc6bbc1 100644
--- a/src/cxa_demangle.cpp
+++ b/src/cxa_demangle.cpp
@@ -4324,6 +4324,8 @@ bool Db::parseCallOffset() {
// # No <type>
// ::= TW <object name> # Thread-local wrapper
// ::= TH <object name> # Thread-local initialization
+// ::= GR <object name> _ # First temporary
+// ::= GR <object name> <seq-id> _ # Subsequent temporaries
// extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
// extension ::= GR <object name> # reference temporary for object
Node *Db::parseSpecialName() {
@@ -4428,11 +4430,17 @@ Node *Db::parseSpecialName() {
return make<SpecialName>("guard variable for ", Name);
}
// GR <object name> # reference temporary for object
+ // GR <object name> _ # First temporary
+ // GR <object name> <seq-id> _ # Subsequent temporaries
case 'R': {
First += 2;
Node *Name = parseName();
if (Name == nullptr)
return nullptr;
+ size_t Count;
+ bool ParsedSeqId = !parseSeqId(&Count);
+ if (!consumeIf('_') && ParsedSeqId)
+ return nullptr;
return make<SpecialName>("reference temporary for ", Name);
}
}
diff --git a/test/test_demangle.pass.cpp b/test/test_demangle.pass.cpp
index 8e97a7f..2b84c9d 100644
--- a/test/test_demangle.pass.cpp
+++ b/test/test_demangle.pass.cpp
@@ -29722,6 +29722,9 @@ const char* cases[][2] =
// Structured bindings:
{"_ZDC2a12a2E", "'structured-binding'[a1, a2]"},
{"_ZN2NSDC1x1yEE", "NS::'structured-binding'[x, y]"},
+
+ {"_ZGRDC1x1yE_", "reference temporary for 'structured-binding'[x, y]"},
+ {"_ZGR1bIvE2_", "reference temporary for b<void>"},
};
const unsigned N = sizeof(cases) / sizeof(cases[0]);