diff options
author | Erik Pilkington <erik.pilkington@gmail.com> | 2018-03-10 21:31:22 +0000 |
---|---|---|
committer | Erik Pilkington <erik.pilkington@gmail.com> | 2018-03-10 21:31:22 +0000 |
commit | d145e1f94ec1a7be9501c595234ea32bced8a1b5 (patch) | |
tree | 68b4dd4cd4c310a8baa585d11b0f3892a6c72d96 | |
parent | dee4d0b1531d9aecf14f14a4223fb2d725beb8b3 (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.cpp | 8 | ||||
-rw-r--r-- | test/test_demangle.pass.cpp | 3 |
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]); |