From patchwork Mon Jun 26 16:41:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathan Sidwell X-Patchwork-Id: 780786 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3wxFFg045Fz9s81 for ; Tue, 27 Jun 2017 02:41:58 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="BnT50v/e"; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=r2rP2C+HTKYQg3bm7isvHGdlKC57QONk1s4120L7XuP/29GFWm PSL4JjfhxNBAIUnfNhCfT+7iyi565bZoNn8qJ+0ETVmBok3gO/ywZA5syniGZkF0 9L+3jJq6wr93XFtpfSeFb9ExxMzy9MunlwKxQrwej7IkoVYcN31YLA4j8= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to :from:subject:message-id:date:mime-version:content-type; s= default; bh=6KOt4oIAMVRArIHu/xkjevZP0Yo=; b=BnT50v/ejqPV60hQNpbN U3HdkSukmxyjGzS/oiSax039MFSpWWXwzyY/Nwwc25nGqwNXqFeCwNiqat07a6+s snA198/7LUuK2JbgvpGo/cUTpYFhMUFAizmx2gghruf+8iaAEd08pMQquxp1pt28 qlx5TbdNrk+rCmAEGy1dXw4= Received: (qmail 11024 invoked by alias); 26 Jun 2017 16:41:48 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 5736 invoked by uid 89); 26 Jun 2017 16:41:45 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-10.6 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy=incharge, delegates, in-charge X-HELO: mail-yw0-f178.google.com Received: from mail-yw0-f178.google.com (HELO mail-yw0-f178.google.com) (209.85.161.178) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 26 Jun 2017 16:41:43 +0000 Received: by mail-yw0-f178.google.com with SMTP id t127so2712382ywc.3 for ; Mon, 26 Jun 2017 09:41:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:to:from:subject:message-id:date :user-agent:mime-version:content-language; bh=JiO0wsRijo2nJOpKzGrhH7tF92YQlR7+XGtlB0dclQo=; b=LKSoPiqo+m2PS+H1UvtshbIN+BvBoZrGRKEb/5kjRQk2mCeaKW8tk/ZXccFBd19Gni jddhLG5rsJ6hxGhJA+Qru0hV5oHpUU0eeDCHYgbJX947bP5q22BogPxPPUkv+O+c3xeI 6vG2kSbsgWc3DyJzbbSw/nQOAFr1uGltxg2BBlgudoAUV31/Ied3xCVurVrPoxO7Wv9s LPut3HWmEk94+bnB1AkflVNrPsf5qyNP4Ayefw46tTc2j7g+cMNVbNk2IkhQFs4IlfzG YCSJY85NLixrGhK6QBvjVzratUSaCa6v6eA2GREMo48A/PwBk8YqyBx5KQsPlSZD7JmE 5xVg== X-Gm-Message-State: AKS2vOwcOot75VWaRQttAl9V4IA5EO9WbXM7QCnT+IM17Xv6YNxlBvg7 MvkSGSajRISeeA== X-Received: by 10.129.122.70 with SMTP id v67mr761282ywc.215.1498495301614; Mon, 26 Jun 2017 09:41:41 -0700 (PDT) Received: from ?IPv6:2620:10d:c0a3:20fb:7500:e7fb:4a6f:2254? ([2620:10d:c091:200::1:9018]) by smtp.googlemail.com with ESMTPSA id a128sm230267ywh.55.2017.06.26.09.41.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 26 Jun 2017 09:41:41 -0700 (PDT) To: GCC Patches From: Nathan Sidwell Subject: [C++ PATCH] identifier flags Message-ID: Date: Mon, 26 Jun 2017 12:41:39 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.0 MIME-Version: 1.0 This patch continues my changes to the identifier node flags. It makes use of the new enumeration to reimplement some of the accessors and checks. We don't have to go checking for the various special identifiers explicitly, just test various bits in the identifier node. One bit in the land_decl_fn struct goes away. nathan 2017-06-26 Nathan Sidwell gcc/cp/ * cp-tree.h (lang_decl_fn): Remove assignment_operator_p field. (DECL_COMPLETE_CONSTRUCTOR_P): Directly compare identifier. (DECL_BASE_CONSTRUCTOR_P, DECL_COMPLETE_DESTRUCTOR_P, DECL_BASE_DESTRUCTOR_P, DECL_DELETING_DESTRUCTOR_P): Likewise. (DECL_ASSIGNMENT_OPERATOR_P): Use IDENTIFIER_ASSIGN_OP_P. * decl.c (grok_op_properties): Adjust identifier checking. * init.c (expand_default_init): Adjust identifier descision. * method.c (implicitly_declare_fn): Don't use DECL_ASSIGNMENT_OPERATOR_P. * search.c (lookup_fnfields_1): Use IDENTIFIER_CTOR_P, IDENTIFIER_DTOR_P. * call.c (in_charge_arg_for_name): Reimplement. (build_special_member_call): Use IDENTIFIER_CDTOR_P, IDENTIFIER_DTOR_P. libcc1/ * libcp1plugin.cc (plugin_build_decl): Don't set DECL_ASSIGNMENT_OPERATOR_P. Index: gcc/cp/call.c =================================================================== --- gcc/cp/call.c (revision 249654) +++ gcc/cp/call.c (working copy) @@ -8677,20 +8677,22 @@ build_cxx_call (tree fn, int nargs, tree tree in_charge_arg_for_name (tree name) { - if (name == base_ctor_identifier - || name == base_dtor_identifier) - return integer_zero_node; - else if (name == complete_ctor_identifier) - return integer_one_node; - else if (name == complete_dtor_identifier) - return integer_two_node; - else if (name == deleting_dtor_identifier) - return integer_three_node; - - /* This function should only be called with one of the names listed - above. */ - gcc_unreachable (); - return NULL_TREE; + if (IDENTIFIER_CTOR_P (name)) + { + if (name == complete_ctor_identifier) + return integer_one_node; + gcc_checking_assert (name == base_ctor_identifier); + } + else + { + if (name == complete_dtor_identifier) + return integer_two_node; + else if (name == deleting_dtor_identifier) + return integer_three_node; + gcc_checking_assert (name == base_dtor_identifier); + } + + return integer_zero_node; } /* We've built up a constructor call RET. Complain if it delegates to the @@ -8729,11 +8731,7 @@ build_special_member_call (tree instance vec *allocated = NULL; tree ret; - gcc_assert (name == complete_ctor_identifier - || name == base_ctor_identifier - || name == complete_dtor_identifier - || name == base_dtor_identifier - || name == deleting_dtor_identifier + gcc_assert (IDENTIFIER_CDTOR_P (name) || name == cp_assignment_operator_id (NOP_EXPR)); if (TYPE_P (binfo)) { @@ -8753,9 +8751,7 @@ build_special_member_call (tree instance instance = build_dummy_object (class_type); else { - if (name == complete_dtor_identifier - || name == base_dtor_identifier - || name == deleting_dtor_identifier) + if (IDENTIFIER_DTOR_P (name)) gcc_assert (args == NULL || vec_safe_is_empty (*args)); /* Convert to the base class, if necessary. */ Index: gcc/cp/cp-tree.h =================================================================== --- gcc/cp/cp-tree.h (revision 249654) +++ gcc/cp/cp-tree.h (working copy) @@ -1776,6 +1776,7 @@ struct GTY(()) language_function { (operator_name_info[(int) (CODE)].identifier) #define cp_assignment_operator_id(CODE) \ (assignment_operator_name_info[(int) (CODE)].identifier) + /* In parser.c. */ extern tree cp_literal_operator_id (const char *); @@ -2495,25 +2496,27 @@ struct GTY(()) lang_decl_fn { struct lang_decl_min min; /* In an overloaded operator, this is the value of - DECL_OVERLOADED_OPERATOR_P. */ + DECL_OVERLOADED_OPERATOR_P. + FIXME: We should really do better in compressing this. */ ENUM_BITFIELD (tree_code) operator_code : 16; unsigned global_ctor_p : 1; unsigned global_dtor_p : 1; - unsigned assignment_operator_p : 1; unsigned static_function : 1; unsigned pure_virtual : 1; unsigned defaulted_p : 1; unsigned has_in_charge_parm_p : 1; unsigned has_vtt_parm_p : 1; - unsigned pending_inline_p : 1; + unsigned nonconverting : 1; unsigned thunk_p : 1; unsigned this_thunk_p : 1; unsigned hidden_friend_p : 1; unsigned omp_declare_reduction_p : 1; - /* 2 spare bits on 32-bit hosts, 34 on 64-bit hosts. */ + /* 3 spare bits. */ + + /* 32-bits padding on 64-bit host. */ /* For a non-thunk function decl, this is a tree list of friendly classes. For a thunk function decl, it is the @@ -2694,14 +2697,12 @@ struct GTY(()) lang_decl { /* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a complete object. */ #define DECL_COMPLETE_CONSTRUCTOR_P(NODE) \ - (DECL_CONSTRUCTOR_P (NODE) \ - && DECL_NAME (NODE) == complete_ctor_identifier) + (DECL_NAME (NODE) == complete_ctor_identifier) /* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a base object. */ #define DECL_BASE_CONSTRUCTOR_P(NODE) \ - (DECL_CONSTRUCTOR_P (NODE) \ - && DECL_NAME (NODE) == base_ctor_identifier) + (DECL_NAME (NODE) == base_ctor_identifier) /* Nonzero if NODE (a FUNCTION_DECL) is a constructor, but not either the specialized in-charge constructor or the specialized not-in-charge @@ -2733,20 +2734,17 @@ struct GTY(()) lang_decl { /* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete object. */ #define DECL_COMPLETE_DESTRUCTOR_P(NODE) \ - (DECL_DESTRUCTOR_P (NODE) \ - && DECL_NAME (NODE) == complete_dtor_identifier) + (DECL_NAME (NODE) == complete_dtor_identifier) /* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a base object. */ #define DECL_BASE_DESTRUCTOR_P(NODE) \ - (DECL_DESTRUCTOR_P (NODE) \ - && DECL_NAME (NODE) == base_dtor_identifier) + (DECL_NAME (NODE) == base_dtor_identifier) /* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete object that deletes the object after it has been destroyed. */ #define DECL_DELETING_DESTRUCTOR_P(NODE) \ - (DECL_DESTRUCTOR_P (NODE) \ - && DECL_NAME (NODE) == deleting_dtor_identifier) + (DECL_NAME (NODE) == deleting_dtor_identifier) /* Nonzero if NODE (a FUNCTION_DECL) is a cloned constructor or destructor. */ @@ -2836,9 +2834,7 @@ struct GTY(()) lang_decl { (LANG_DECL_FN_CHECK (NODE)->operator_code = (CODE)) /* If NODE is an overloaded operator, then this returns the TREE_CODE - associated with the overloaded operator. - DECL_ASSIGNMENT_OPERATOR_P must also be checked to determine - whether or not NODE is an assignment operator. If NODE is not an + associated with the overloaded operator. If NODE is not an overloaded operator, ERROR_MARK is returned. Since the numerical value of ERROR_MARK is zero, this macro can be used as a predicate to test whether or not NODE is an overloaded operator. */ @@ -2848,7 +2844,7 @@ struct GTY(()) lang_decl { /* Nonzero if NODE is an assignment operator (including += and such). */ #define DECL_ASSIGNMENT_OPERATOR_P(NODE) \ - (LANG_DECL_FN_CHECK (NODE)->assignment_operator_p) + IDENTIFIER_ASSIGN_OP_P (DECL_NAME (NODE)) /* For FUNCTION_DECLs: nonzero means that this function is a constructor or a destructor with an extra in-charge parameter to Index: gcc/cp/decl.c =================================================================== --- gcc/cp/decl.c (revision 249654) +++ gcc/cp/decl.c (working copy) @@ -12925,14 +12925,15 @@ grok_op_properties (tree decl, bool comp { /* It'd be nice to hang something else of the identifier to find CODE more directly. */ + bool assign_op = IDENTIFIER_ASSIGN_OP_P (name); const operator_name_info_t *oni - = (IDENTIFIER_ASSIGN_OP_P (name) - ? assignment_operator_name_info : operator_name_info); - DECL_ASSIGNMENT_OPERATOR_P (decl) = IDENTIFIER_ASSIGN_OP_P (name); + = (assign_op ? assignment_operator_name_info : operator_name_info); + if (false) ; #define DEF_OPERATOR(NAME, CODE, MANGLING, ARITY, KIND) \ - else if (oni[int (CODE)].identifier == name) \ + else if (assign_op == (KIND == cik_assign_op) \ + && oni[int (CODE)].identifier == name) \ operator_code = (CODE); #include "operators.def" #undef DEF_OPERATOR Index: gcc/cp/init.c =================================================================== --- gcc/cp/init.c (revision 249654) +++ gcc/cp/init.c (working copy) @@ -1718,7 +1718,6 @@ expand_default_init (tree binfo, tree tr tsubst_flags_t complain) { tree type = TREE_TYPE (exp); - tree ctor_name; /* It fails because there may not be a constructor which takes its own type as the first (or only parameter), but which does @@ -1846,10 +1845,9 @@ expand_default_init (tree binfo, tree tr } else { - if (true_exp == exp) - ctor_name = complete_ctor_identifier; - else - ctor_name = base_ctor_identifier; + tree ctor_name = (true_exp == exp + ? complete_ctor_identifier : base_ctor_identifier); + rval = build_special_member_call (exp, ctor_name, &parms, binfo, flags, complain); } Index: gcc/cp/method.c =================================================================== --- gcc/cp/method.c (revision 249654) +++ gcc/cp/method.c (working copy) @@ -2060,10 +2060,7 @@ implicitly_declare_fn (special_function_ else if (kind == sfk_destructor) DECL_DESTRUCTOR_P (fn) = 1; else - { - DECL_ASSIGNMENT_OPERATOR_P (fn) = 1; - SET_OVERLOADED_OPERATOR_CODE (fn, NOP_EXPR); - } + SET_OVERLOADED_OPERATOR_CODE (fn, NOP_EXPR); SET_DECL_ALIGN (fn, MINIMUM_METHOD_BOUNDARY); Index: gcc/cp/search.c =================================================================== --- gcc/cp/search.c (revision 249654) +++ gcc/cp/search.c (working copy) @@ -1653,9 +1653,7 @@ lookup_fnfields_1 (tree type, tree name) if (COMPLETE_TYPE_P (type)) { - if ((name == ctor_identifier - || name == base_ctor_identifier - || name == complete_ctor_identifier)) + if (IDENTIFIER_CTOR_P (name)) { if (CLASSTYPE_LAZY_DEFAULT_CTOR (type)) lazily_declare_fn (sfk_constructor, type); @@ -1671,12 +1669,11 @@ lookup_fnfields_1 (tree type, tree name) if (CLASSTYPE_LAZY_MOVE_ASSIGN (type)) lazily_declare_fn (sfk_move_assignment, type); } - else if ((name == dtor_identifier - || name == base_dtor_identifier - || name == complete_dtor_identifier - || name == deleting_dtor_identifier) - && CLASSTYPE_LAZY_DESTRUCTOR (type)) - lazily_declare_fn (sfk_destructor, type); + else if (IDENTIFIER_DTOR_P (name)) + { + if (CLASSTYPE_LAZY_DESTRUCTOR (type)) + lazily_declare_fn (sfk_destructor, type); + } } return lookup_fnfields_idx_nolazy (type, name); Index: libcc1/libcp1plugin.cc =================================================================== --- libcc1/libcp1plugin.cc (revision 249654) +++ libcc1/libcp1plugin.cc (working copy) @@ -1428,8 +1428,6 @@ plugin_build_decl (cc1_plugin::connectio if ((sym_flags & GCC_CP_FLAG_SPECIAL_FUNCTION) && opcode != ERROR_MARK) SET_OVERLOADED_OPERATOR_CODE (decl, opcode); - if (assop) - DECL_ASSIGNMENT_OPERATOR_P (decl) = true; } } else if (RECORD_OR_UNION_CODE_P (code))