From a517066db893616e94fcca5010dd6e80c7c80854 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 4 Jul 2011 17:44:11 -0400 Subject: [PATCH] cp-demangle.c (d_expression): Handle 'this'. * cp-demangle.c (d_expression): Handle 'this'. (d_print_comp) [DEMANGLE_COMPONENT_FUNCTION_PARAM]: Likewise. From-SVN: r175836 --- libiberty/ChangeLog | 5 +++++ libiberty/cp-demangle.c | 30 ++++++++++++++++++++------- libiberty/testsuite/demangle-expected | 4 ++++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 2f8e73497d9..cd71565e582 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,8 @@ +2011-07-04 Jason Merrill + + * cp-demangle.c (d_expression): Handle 'this'. + (d_print_comp) [DEMANGLE_COMPONENT_FUNCTION_PARAM]: Likewise. + 2011-07-01 Joel Brobecker * filename_cmp.c (filename_cmp, filename_ncmp): Add handling of diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c index f1363226c56..29badbba187 100644 --- a/libiberty/cp-demangle.c +++ b/libiberty/cp-demangle.c @@ -2738,10 +2738,18 @@ d_expression (struct d_info *di) /* Function parameter used in a late-specified return type. */ int index; d_advance (di, 2); - index = d_compact_number (di); - if (index < 0) - return NULL; - + if (d_peek_char (di) == 'T') + { + /* 'this' parameter. */ + d_advance (di, 1); + index = 0; + } + else + { + index = d_compact_number (di) + 1; + if (index == 0) + return NULL; + } return d_make_function_param (di, index); } else if (IS_DIGIT (peek) @@ -4400,9 +4408,17 @@ d_print_comp (struct d_print_info *dpi, int options, return; case DEMANGLE_COMPONENT_FUNCTION_PARAM: - d_append_string (dpi, "{parm#"); - d_append_num (dpi, dc->u.s_number.number + 1); - d_append_char (dpi, '}'); + { + long num = dc->u.s_number.number; + if (num == 0) + d_append_string (dpi, "this"); + else + { + d_append_string (dpi, "{parm#"); + d_append_num (dpi, num); + d_append_char (dpi, '}'); + } + } return; case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS: diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected index 4980cf1728d..2dc74beb9e2 100644 --- a/libiberty/testsuite/demangle-expected +++ b/libiberty/testsuite/demangle-expected @@ -3905,6 +3905,10 @@ decltype ({parm#1}+{parm#2}) add(int, double) --format=gnu-v3 _Z4add3IidEDTclL_Z1gEfp_fp0_EET_T0_ decltype (g({parm#1}, {parm#2})) add3(int, double) +# 'this' test +--format=gnu-v3 +_ZN1A1fIiEEDTcldtdtdefpT1b1fIT_EEEv +decltype ((((*this).b).(f))()) A::f() # new (2008) built in types test --format=gnu-v3 _Z1fDfDdDeDhDsDi -- 2.30.2