diff options
author | Tamas Berghammer <tberghammer@google.com> | 2017-05-24 11:21:34 +0000 |
---|---|---|
committer | Tamas Berghammer <tberghammer@google.com> | 2017-05-24 11:21:34 +0000 |
commit | 8bc9b88a241c617ad25f3d8d728d9b5581bd86a9 (patch) | |
tree | 95bc9f52ccfdcdedc878aeb27d4526877e91de31 /libcxxabi | |
parent | 9f46d1d479462585c2a6d6928e0e26525512796f (diff) | |
download | llvm-8bc9b88a241c617ad25f3d8d728d9b5581bd86a9.zip llvm-8bc9b88a241c617ad25f3d8d728d9b5581bd86a9.tar.gz llvm-8bc9b88a241c617ad25f3d8d728d9b5581bd86a9.tar.bz2 |
__cxa_demangle: Fix constructor cv qualifier handling
Summary:
Previously if we parsed a constructor then we set parsed_ctor_dtor_cv
to true and never reseted it. This causes issue when a template argument
references a constructor (e.g. type of lambda defined inside a
constructor) as we will have the parsed_ctor_dtor_cv flag set what will
cause issues when parsing later arguments.
Reviewers: EricWF, compnerd
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D33385
llvm-svn: 303737
Diffstat (limited to 'libcxxabi')
-rw-r--r-- | libcxxabi/src/cxa_demangle.cpp | 2 | ||||
-rw-r--r-- | libcxxabi/test/test_demangle.pass.cpp | 1 |
2 files changed, 3 insertions, 0 deletions
diff --git a/libcxxabi/src/cxa_demangle.cpp b/libcxxabi/src/cxa_demangle.cpp index 25e6b9a..fd484a4 100644 --- a/libcxxabi/src/cxa_demangle.cpp +++ b/libcxxabi/src/cxa_demangle.cpp @@ -4571,6 +4571,8 @@ parse_encoding(const char* first, const char* last, C& db) save_value<decltype(db.tag_templates)> sb(db.tag_templates); if (db.encoding_depth > 1) db.tag_templates = true; + save_value<decltype(db.parsed_ctor_dtor_cv)> sp(db.parsed_ctor_dtor_cv); + db.parsed_ctor_dtor_cv = false; switch (*first) { case 'G': diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp index cd50988..9e4a008 100644 --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -29500,6 +29500,7 @@ const char* cases[][2] = {"_ZZ2f6vE1b", "f6()::b"}, {"_ZNV3$_35test9Ev", "$_3::test9() volatile"}, {"_ZN5Test8I3$_2EC1ES0_", "Test8<$_2>::Test8($_2)"}, + {"_Z3fooIZN3BarC1EvE3$_0EvT_", "void foo<Bar::Bar()::$_0>(Bar::Bar()::$_0)"}, {"_ZGVZN1N1gEvE1a", "guard variable for N::g()::a"}, {"_ZplRK1YRA100_P1X", "operator+(Y const&, X* (&) [100])"}, {"_Z1fno", "f(__int128, unsigned __int128)"}, |