From patchwork Tue Jan 19 18:53:22 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Artemiy Volkov X-Patchwork-Id: 10464 Received: (qmail 7177 invoked by alias); 19 Jan 2016 18:54:17 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 7105 invoked by uid 89); 19 Jan 2016 18:54:17 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-lb0-f196.google.com Received: from mail-lb0-f196.google.com (HELO mail-lb0-f196.google.com) (209.85.217.196) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 19 Jan 2016 18:54:10 +0000 Received: by mail-lb0-f196.google.com with SMTP id ti8so34380927lbb.3 for ; Tue, 19 Jan 2016 10:54:09 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=oAdEqukxWgvKvlzMzvE1SVcKx6orv/RsrsQpp03kFbU=; b=E1tNS2KcqQhmMWcNooUEvQQlLa1slXofMXwqOSCXa3M2B/HdhBZPp2R380z1eQfISZ lOdIJ5/K3eMTZSOSzKOaozx0lFIrSq02LCpMtJqitCbbqRENPQ5FEOaWw2+CNy1XSxBq oPjbkVaXKqDMS5t6BFxBpOzB/dUpJWi7fouS9US5MCqTL58rnGURl//XEVLF7TNQ4W0U DlSsX1xGSZIlpMI9vq6vOAnixLti3ZLtC47c72B4mqoIhpSNKbQVZ5YNtjC5bdp9ICxS DPsc8yTjOoAS5KVXITjzvNJD+KR5/jJoxcliW1lnqeUxu2Vl/s/kLF209ZatCffrquDG 8Cug== X-Gm-Message-State: AG10YOS/9/Y9bOyl+zMG9BYsKMt4kvR4YYXxiMntdSAMCU6hZpYKfRopwoWYqVgCqA7UXw== X-Received: by 10.112.140.71 with SMTP id re7mr1275307lbb.73.1453229647240; Tue, 19 Jan 2016 10:54:07 -0800 (PST) Received: from arch.smware.local ([37.204.1.155]) by smtp.gmail.com with ESMTPSA id p66sm4247278lfe.42.2016.01.19.10.54.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 19 Jan 2016 10:54:06 -0800 (PST) From: Artemiy Volkov To: gdb-patches@sourceware.org Cc: palves@redhat.com, Artemiy Volkov Subject: [PATCH v2 04/11] [PR gdb/14441] gdb: parse: support rvalue reference type Date: Tue, 19 Jan 2016 21:53:22 +0300 Message-Id: <1453229609-20159-5-git-send-email-artemiyv@acm.org> In-Reply-To: <1453229609-20159-1-git-send-email-artemiyv@acm.org> References: <1450661481-31178-1-git-send-email-artemiyv@acm.org> <1453229609-20159-1-git-send-email-artemiyv@acm.org> X-IsSubscribed: yes This patch implements correct parsing of C++0x 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(). ./ChangeLog: 2016-01-19 Artemiy Volkov * gdb/c-exp.y: Handle the '&&' token in the typename. * gdb/parse.c (insert_type): Change assert statement. (follow_types): Handle rvalue reference types. * gdb/parser-defs.h (enum type_pieces): Add tp_rvalue_reference constant. --- gdb/c-exp.y | 6 +++++- gdb/parse.c | 41 +++++++++++++++++++++++------------------ gdb/parser-defs.h | 1 + 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/gdb/c-exp.y b/gdb/c-exp.y index 9f2a229..d585bce 100644 --- a/gdb/c-exp.y +++ b/gdb/c-exp.y @@ -799,7 +799,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_REFERENCE (type)) type = check_typedef (TYPE_TARGET_TYPE (type)); write_exp_elt_longcst (pstate, (LONGEST) TYPE_LENGTH (type)); @@ -1140,6 +1140,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 06f7bcd..75627c5 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -1470,10 +1470,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) @@ -1481,8 +1481,8 @@ insert_type (enum type_pieces tp) union type_stack_elt element; int slot; - gdb_assert (tp == tp_pointer || tp == tp_reference - || tp == tp_const || tp == tp_volatile); + gdb_assert (tp == tp_pointer || tp == tp_reference || + 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 @@ -1695,21 +1695,26 @@ 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; + case tp_array: array_size = pop_type_int (); /* FIXME-type-allocation: need a way to free this type when we are diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h index 1b1d3c3..c474150 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,