aboutsummaryrefslogtreecommitdiff
path: root/libcxxabi
diff options
context:
space:
mode:
authorTamas Berghammer <tberghammer@google.com>2017-05-24 11:21:34 +0000
committerTamas Berghammer <tberghammer@google.com>2017-05-24 11:21:34 +0000
commit8bc9b88a241c617ad25f3d8d728d9b5581bd86a9 (patch)
tree95bc9f52ccfdcdedc878aeb27d4526877e91de31 /libcxxabi
parent9f46d1d479462585c2a6d6928e0e26525512796f (diff)
downloadllvm-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.cpp2
-rw-r--r--libcxxabi/test/test_demangle.pass.cpp1
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)"},