From e4347c89f3a14b480fc88581d1363835f7b99b68 Mon Sep 17 00:00:00 2001 From: Artemiy Volkov Date: Mon, 20 Mar 2017 13:47:46 -0700 Subject: [PATCH] Implement demangling for rvalue reference type names This patch fixes demangling of names containing rvalue reference typenames by handling DEMANGLE_COMPONENT_RVALUE_REFERENCE demangle component. gdb/ChangeLog PR gdb/14441 * cp-name-parser.y (ptr_operator): Handle the '&&' token in typename. * cp-support.c (replace_typedefs): Handle DEMANGLE_COMPONENT_RVALUE_REFERENCE. * python/py-type.c (typy_lookup_type): Likewise. --- gdb/ChangeLog | 9 +++++++++ gdb/cp-name-parser.y | 4 ++++ gdb/cp-support.c | 1 + gdb/python/py-type.c | 4 ++++ 4 files changed, 18 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5df48e5..39f1e68 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,6 +1,15 @@ 2017-03-20 Artemiy Volkov PR gdb/14441 + * cp-name-parser.y (ptr_operator): Handle the '&&' token in + typename. + * cp-support.c (replace_typedefs): Handle + DEMANGLE_COMPONENT_RVALUE_REFERENCE. + * python/py-type.c (typy_lookup_type): Likewise. + +2017-03-20 Artemiy Volkov + + PR gdb/14441 * c-exp.y (ptr_operator): Handle the '&&' token in the typename. * parse.c (insert_type): Change assert statement. (follow_types): Handle rvalue reference types. diff --git a/gdb/cp-name-parser.y b/gdb/cp-name-parser.y index 70790fc..b51c5e2 100644 --- a/gdb/cp-name-parser.y +++ b/gdb/cp-name-parser.y @@ -770,6 +770,10 @@ ptr_operator : '*' qualifiers_opt { $$.comp = make_empty (DEMANGLE_COMPONENT_REFERENCE); $$.comp->u.s_binary.left = $$.comp->u.s_binary.right = NULL; $$.last = &d_left ($$.comp); } + | ANDAND + { $$.comp = make_empty (DEMANGLE_COMPONENT_RVALUE_REFERENCE); + $$.comp->u.s_binary.left = $$.comp->u.s_binary.right = NULL; + $$.last = &d_left ($$.comp); } | nested_name '*' qualifiers_opt { $$.comp = make_empty (DEMANGLE_COMPONENT_PTRMEM_TYPE); $$.comp->u.s_binary.left = $1.comp; diff --git a/gdb/cp-support.c b/gdb/cp-support.c index 1b0900e..b1b96c8 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c @@ -494,6 +494,7 @@ replace_typedefs (struct demangle_parse_info *info, case DEMANGLE_COMPONENT_RESTRICT_THIS: case DEMANGLE_COMPONENT_POINTER: case DEMANGLE_COMPONENT_REFERENCE: + case DEMANGLE_COMPONENT_RVALUE_REFERENCE: replace_typedefs (info, d_left (ret_comp), finder, data); break; diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index c4d5917..0249cbb 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -770,6 +770,7 @@ typy_lookup_type (struct demangle_component *demangled, if (demangled_type == DEMANGLE_COMPONENT_POINTER || demangled_type == DEMANGLE_COMPONENT_REFERENCE + || demangled_type == DEMANGLE_COMPONENT_RVALUE_REFERENCE || demangled_type == DEMANGLE_COMPONENT_CONST || demangled_type == DEMANGLE_COMPONENT_VOLATILE) { @@ -788,6 +789,9 @@ typy_lookup_type (struct demangle_component *demangled, case DEMANGLE_COMPONENT_REFERENCE: rtype = lookup_lvalue_reference_type (type); break; + case DEMANGLE_COMPONENT_RVALUE_REFERENCE: + rtype = lookup_rvalue_reference_type (type); + break; case DEMANGLE_COMPONENT_POINTER: rtype = lookup_pointer_type (type); break; -- 2.7.4