diff options
| author | Erik Pilkington <erik.pilkington@gmail.com> | 2018-02-13 17:09:07 +0000 |
|---|---|---|
| committer | Erik Pilkington <erik.pilkington@gmail.com> | 2018-02-13 17:09:07 +0000 |
| commit | b39094e39eaf89d8abfe71884b2bb251e72c08f7 (patch) | |
| tree | 049f3d35e3ba0fb29f9960bf86fd80e643079304 | |
| parent | aec1e58c993617e131b5912daad7ce4bf329904c (diff) | |
| download | bcm5719-llvm-b39094e39eaf89d8abfe71884b2bb251e72c08f7.tar.gz bcm5719-llvm-b39094e39eaf89d8abfe71884b2bb251e72c08f7.zip | |
[demangler] Support for inheriting constructors.
Fixes PR33223.
llvm-svn: 325023
| -rw-r--r-- | libcxxabi/src/cxa_demangle.cpp | 5 | ||||
| -rw-r--r-- | libcxxabi/test/test_demangle.pass.cpp | 4 |
2 files changed, 9 insertions, 0 deletions
diff --git a/libcxxabi/src/cxa_demangle.cpp b/libcxxabi/src/cxa_demangle.cpp index f2e7d286363..c9622031c6c 100644 --- a/libcxxabi/src/cxa_demangle.cpp +++ b/libcxxabi/src/cxa_demangle.cpp @@ -2200,10 +2200,15 @@ Node *Db::parseCtorDtorName(Node *&SoFar) { } if (consumeIf('C')) { + bool IsInherited = consumeIf('I'); if (look() != '1' && look() != '2' && look() != '3' && look() != '5') return nullptr; ++First; ParsedCtorDtorCV = true; + if (IsInherited) { + if (legacyParse<parse_name>() == nullptr) + return nullptr; + } return make<CtorDtorName>(SoFar, false); } diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp index fa4ee41537e..37c62920061 100644 --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -29690,6 +29690,10 @@ const char* cases[][2] = // Designated init expressions {"_ZN15designated_init1fINS_1AEEEvDTtlT_di1adi1bdxLi3EdXLi1ELi4ELi9EEE", "void designated_init::f<designated_init::A>(decltype(designated_init::A{.a.b[3][1 ... 4] = 9}))"}, {"_Z1fIXtl1Xdi1adi1bdxLi3ELi1EEEE", "f<X{.a.b[3] = 1}>"}, + + // Inheriting constructors: + {"_ZN1BCI21AEi", "B::B(int)"}, + {"_ZN1DCI21CIiEET_", "D::D(int)"}, }; const unsigned N = sizeof(cases) / sizeof(cases[0]); |

