From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18942 invoked by alias); 10 Mar 2017 20:10:45 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 18825 invoked by uid 89); 10 Mar 2017 20:10:43 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=prec X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 10 Mar 2017 20:10:42 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3C16785376 for ; Fri, 10 Mar 2017 20:04:49 +0000 (UTC) Received: from valrhona.uglyboxes.com (ovpn04.gateway.prod.ext.phx2.redhat.com [10.5.9.4]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2AK4lWx029240 for ; Fri, 10 Mar 2017 15:04:49 -0500 From: Keith Seitz To: gdb-patches@sourceware.org Subject: [PATCH v6 04/11] Support rvalue reference type in parser Date: Fri, 10 Mar 2017 20:10:00 -0000 Message-Id: <1489176286-27973-5-git-send-email-keiths@redhat.com> In-Reply-To: <1489176286-27973-1-git-send-email-keiths@redhat.com> References: <1489176286-27973-1-git-send-email-keiths@redhat.com> X-IsSubscribed: yes X-SW-Source: 2017-03/txt/msg00158.txt.bz2 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(). There are no changes to this patch from v5. gdb/ChangeLog PR gdb/14441 From Artemiy Volkov * 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) : New constant. --- gdb/ChangeLog | 10 ++++++++++ gdb/c-exp.y | 6 +++++- gdb/parse.c | 39 ++++++++++++++++++++++----------------- gdb/parser-defs.h | 1 + 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4768848..f7685ad 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -2,6 +2,16 @@ PR gdb/14441 From Artemiy Volkov + * 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) : New + constant. + +2017-MM-DD Keith Seitz + + PR gdb/14441 + From Artemiy Volkov * ada-lang.c (ada_evaluate_subexp): Adhere to the new value_ref() interface. * c-valprint.c (c_value_print): Likewise. diff --git a/gdb/c-exp.y b/gdb/c-exp.y index 2753c6e..7c25641 100644 --- a/gdb/c-exp.y +++ b/gdb/c-exp.y @@ -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 diff --git a/gdb/parse.c b/gdb/parse.c index d864970..bf27598 100644 --- a/gdb/parse.c +++ b/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; diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h index 85da6a4..a291aed 100644 --- a/gdb/parser-defs.h +++ b/gdb/parser-defs.h @@ -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, -- 2.1.0