mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
Support rvalue reference type in parser
This patch implements correct parsing of C++11 rvalue reference typenames. This is done in full similarity to the handling of regular references by adding a '&&' token handling in c-exp.y, defining an rvalue reference type piece, and implementing a follow type derivation in follow_types(). gdb/ChangeLog 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. * parser-defs.h (enum type_pieces) <tp_rvalue_reference>: New constant.
This commit is contained in:
parent
a65cfae5f8
commit
53cc15f5fe
@ -1,3 +1,12 @@
|
||||
2017-03-20 Artemiy Volkov <artemiyv@acm.org>
|
||||
|
||||
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.
|
||||
* parser-defs.h (enum type_pieces) <tp_rvalue_reference>: New
|
||||
constant.
|
||||
|
||||
2017-03-20 Artemiy Volkov <artemiyv@acm.org>
|
||||
|
||||
PR gdb/14441
|
||||
|
@ -744,7 +744,7 @@ exp : SIZEOF '(' type ')' %prec UNARY
|
||||
says of sizeof: "When applied to a reference
|
||||
or a reference type, the result is the size of
|
||||
the referenced type." */
|
||||
if (TYPE_CODE (type) == TYPE_CODE_REF)
|
||||
if (TYPE_IS_REFERENCE (type))
|
||||
type = check_typedef (TYPE_TARGET_TYPE (type));
|
||||
write_exp_elt_longcst (pstate,
|
||||
(LONGEST) TYPE_LENGTH (type));
|
||||
@ -1085,6 +1085,10 @@ ptr_operator:
|
||||
{ insert_type (tp_reference); }
|
||||
| '&' ptr_operator
|
||||
{ insert_type (tp_reference); }
|
||||
| ANDAND
|
||||
{ insert_type (tp_rvalue_reference); }
|
||||
| ANDAND ptr_operator
|
||||
{ insert_type (tp_rvalue_reference); }
|
||||
;
|
||||
|
||||
ptr_operator_ts: ptr_operator
|
||||
|
39
gdb/parse.c
39
gdb/parse.c
@ -1461,10 +1461,10 @@ insert_into_type_stack (int slot, union type_stack_elt element)
|
||||
}
|
||||
|
||||
/* Insert a new type, TP, at the bottom of the type stack. If TP is
|
||||
tp_pointer or tp_reference, it is inserted at the bottom. If TP is
|
||||
a qualifier, it is inserted at slot 1 (just above a previous
|
||||
tp_pointer) if there is anything on the stack, or simply pushed if
|
||||
the stack is empty. Other values for TP are invalid. */
|
||||
tp_pointer, tp_reference or tp_rvalue_reference, it is inserted at the
|
||||
bottom. If TP is a qualifier, it is inserted at slot 1 (just above a
|
||||
previous tp_pointer) if there is anything on the stack, or simply pushed
|
||||
if the stack is empty. Other values for TP are invalid. */
|
||||
|
||||
void
|
||||
insert_type (enum type_pieces tp)
|
||||
@ -1473,7 +1473,8 @@ insert_type (enum type_pieces tp)
|
||||
int slot;
|
||||
|
||||
gdb_assert (tp == tp_pointer || tp == tp_reference
|
||||
|| tp == tp_const || tp == tp_volatile);
|
||||
|| tp == tp_rvalue_reference || tp == tp_const
|
||||
|| tp == tp_volatile);
|
||||
|
||||
/* If there is anything on the stack (we know it will be a
|
||||
tp_pointer), insert the qualifier above it. Otherwise, simply
|
||||
@ -1686,18 +1687,22 @@ follow_types (struct type *follow_type)
|
||||
make_addr_space = 0;
|
||||
break;
|
||||
case tp_reference:
|
||||
follow_type = lookup_lvalue_reference_type (follow_type);
|
||||
if (make_const)
|
||||
follow_type = make_cv_type (make_const,
|
||||
TYPE_VOLATILE (follow_type),
|
||||
follow_type, 0);
|
||||
if (make_volatile)
|
||||
follow_type = make_cv_type (TYPE_CONST (follow_type),
|
||||
make_volatile,
|
||||
follow_type, 0);
|
||||
if (make_addr_space)
|
||||
follow_type = make_type_with_address_space (follow_type,
|
||||
make_addr_space);
|
||||
follow_type = lookup_lvalue_reference_type (follow_type);
|
||||
goto process_reference;
|
||||
case tp_rvalue_reference:
|
||||
follow_type = lookup_rvalue_reference_type (follow_type);
|
||||
process_reference:
|
||||
if (make_const)
|
||||
follow_type = make_cv_type (make_const,
|
||||
TYPE_VOLATILE (follow_type),
|
||||
follow_type, 0);
|
||||
if (make_volatile)
|
||||
follow_type = make_cv_type (TYPE_CONST (follow_type),
|
||||
make_volatile,
|
||||
follow_type, 0);
|
||||
if (make_addr_space)
|
||||
follow_type = make_type_with_address_space (follow_type,
|
||||
make_addr_space);
|
||||
make_const = make_volatile = 0;
|
||||
make_addr_space = 0;
|
||||
break;
|
||||
|
@ -127,6 +127,7 @@ enum type_pieces
|
||||
tp_end = -1,
|
||||
tp_pointer,
|
||||
tp_reference,
|
||||
tp_rvalue_reference,
|
||||
tp_array,
|
||||
tp_function,
|
||||
tp_function_with_arguments,
|
||||
|
Loading…
Reference in New Issue
Block a user