From patchwork Thu Nov 10 19:56:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Palka X-Patchwork-Id: 60369 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A621638582AC for ; Thu, 10 Nov 2022 19:58:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A621638582AC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1668110296; bh=8AMpwFgmygB11zhkhACeP+EqkinsI9X8TBrs3nOkPs8=; h=To:Cc:Subject:Date:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=AGOimUxH/mi1PjCgFlEXY/kgIudgqJZ+WMg5YodsOFjhyjSnSJhe/ZQ6DnBasK3cM 3/V4t+rZtzVTo1d7FFSU6tGf9jQJVSfpQSvE/9NIRwUXTzZFgp5hiQIlI1K77sZqB4 Zd7DmezsEFjzJM9G4ibPVaFZMd2Vi4Pt7WYqIjm4= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id B3F223858C60 for ; Thu, 10 Nov 2022 19:56:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B3F223858C60 Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-663-fzWsp0eKMci5lp0p-dWQxw-1; Thu, 10 Nov 2022 14:56:06 -0500 X-MC-Unique: fzWsp0eKMci5lp0p-dWQxw-1 Received: by mail-qv1-f69.google.com with SMTP id ob9-20020a0562142f8900b004bba5363ad9so2243115qvb.8 for ; Thu, 10 Nov 2022 11:56:06 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=8AMpwFgmygB11zhkhACeP+EqkinsI9X8TBrs3nOkPs8=; b=z6NKZ6heDccY04SDNviVrHT+1Sht/n0aorK8NfsnuY4Da5ne5YzZj+BAPffy3cyhin WNHBocAeaj1OLSfgAIFPbceBNbdiaAd+z/QkfJxpTJsPQSE9o6F2zTpo/dbygyWdyUCu Y4C0s1GvHA/NCBmEjb1y3VnjTgzDtkhpMmd+IFzTyYNdX2mZQfM6Q43AzPpznYkoH/f6 e7ccSMu3i2x8LkqBE0oGeg1BfzWRphbnQNhQqP74n5okL+uyqHJwuWCZ1PFyV6qzmUB9 xwI0uzJGLV6z84zsn8c9xK0bkCidauPE5GR8ZhWVr9b1xfoCmKkFuUQIIErgof6+92tR /2nQ== X-Gm-Message-State: ACrzQf0V8lLBbVZzO1l3VsxigN1pcKvfb/f5cdmyep8+XryA6kg4/1mU Y9D55NdUaCL4HmjoEInGovoBO4/KQ7luPA6MlSvNu3HlwEXYvJUWP+9ipn5o3f5+GY3ggFptDNN eVLIzpoY87w8o10VzqgDFreYsfaWiTpY5vPqCaC4DOJfcoHULvAMLop7uxOhOgDvlsVM= X-Received: by 2002:ae9:ed41:0:b0:6fa:3477:d48f with SMTP id c62-20020ae9ed41000000b006fa3477d48fmr1689654qkg.275.1668110165074; Thu, 10 Nov 2022 11:56:05 -0800 (PST) X-Google-Smtp-Source: AMsMyM5cUX78yd7f657prhKIMsr3cKudC0qTlPiliomxyUcnvSnXnaYyLlRyWvAz8bnFJ7dDEempJQ== X-Received: by 2002:ae9:ed41:0:b0:6fa:3477:d48f with SMTP id c62-20020ae9ed41000000b006fa3477d48fmr1689640qkg.275.1668110164572; Thu, 10 Nov 2022 11:56:04 -0800 (PST) Received: from localhost.localdomain (ool-457670bb.dyn.optonline.net. [69.118.112.187]) by smtp.gmail.com with ESMTPSA id az17-20020a05620a171100b006f3e6933bacsm97631qkb.113.2022.11.10.11.56.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Nov 2022 11:56:04 -0800 (PST) To: gcc-patches@gcc.gnu.org Cc: jason@redhat.com, Patrick Palka Subject: [PATCH 1/2] c++: remove function_p parm from tsubst_copy_and_build Date: Thu, 10 Nov 2022 14:56:01 -0500 Message-Id: <20221110195602.2434376-1-ppalka@redhat.com> X-Mailer: git-send-email 2.38.1.420.g319605f8f0 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.8 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Patrick Palka via Gcc-patches From: Patrick Palka Reply-To: Patrick Palka Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" The function_p parameter of tsubst_copy_and_build (added in r69316) is inspected only in its IDENTIFIER_NODE case, where it controls whether we diagnose unqualified name lookup failure for the given identifier. But I think ever since r173965, we never substitute an IDENTIFIER_NODE with function_p=true for which the lookup can possibly fail, and therefore the flag is effectively unneeded. Before that commit, we would incorrectly repeat unqualified lookup for an ADL-enabled CALL_EXPR at instantiation time, which naturally could fail and thus motivated the flag. Afterwards, we no longer substitute an IDENTIFIER_NODE callee when koenig_p is true so the flag isn't needed for its original purpose. What about when koenig_p=false? Apparently we still may have an IDENTIFIER_NODE callee in this case, namely when unqualified name lookup found a dependent local function declaration, but repeating that lookup can't fail. (It also can't fail for USING_DECL callees.) So this patch removes this effectively unneeded parameter from tsubst_copy_and_build. It also updates a outdated comment in the CALL_EXPR case about when we may see an IDENTIFIER_NODE callee with koenig_p=false. Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for trunk? gcc/cp/ChangeLog: * cp-lang.cc (objcp_tsubst_copy_and_build): Remove function_p parameter. * cp-objcp-common.h (objcp_tsubst_copy_and_build): Likewise. * cp-tree.h (tsubst_copy_and_build): Likewise. * init.cc (get_nsdmi): Adjust calls to tsubst_copy_and_build. * pt.cc (expand_integer_pack): Likewise. (instantiate_non_dependent_expr_internal): Likewise. (tsubst_function_decl): Likewise. (tsubst_arg_types): Likewise. (tsubst_exception_specification): Likewise. (tsubst): Likewise. (tsubst_copy_asm_operands): Likewise. (tsubst_expr): Likewise. (tsubst_non_call_postfix_expression): Likewise. (tsubst_lambda_expr): Likewise. (tsubst_copy_and_build_call_args): Likewise. (tsubst_copy_and_build): Remove function_p parameter and adjust function comment. Adjust recursive calls. : Update outdated comment about when we can see an IDENTIFIER_NODE callee with koenig_p=false. (maybe_instantiate_noexcept): Adjust calls to tsubst_copy_and_build. gcc/objcp/ChangeLog: * objcp-lang.cc (objcp_tsubst_copy_and_build): Remove function_p parameter. --- gcc/cp/cp-lang.cc | 3 +-- gcc/cp/cp-objcp-common.h | 3 +-- gcc/cp/cp-tree.h | 2 +- gcc/cp/init.cc | 2 +- gcc/cp/pt.cc | 46 ++++++++++++---------------------------- gcc/objcp/objcp-lang.cc | 5 ++--- 6 files changed, 19 insertions(+), 42 deletions(-) diff --git a/gcc/cp/cp-lang.cc b/gcc/cp/cp-lang.cc index c3cfde56cc6..a3f29eda0d6 100644 --- a/gcc/cp/cp-lang.cc +++ b/gcc/cp/cp-lang.cc @@ -116,8 +116,7 @@ tree objcp_tsubst_copy_and_build (tree /*t*/, tree /*args*/, tsubst_flags_t /*complain*/, - tree /*in_decl*/, - bool /*function_p*/) + tree /*in_decl*/) { return NULL_TREE; } diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h index 1a67f14d9b3..f4ba0c9e012 100644 --- a/gcc/cp/cp-objcp-common.h +++ b/gcc/cp/cp-objcp-common.h @@ -24,8 +24,7 @@ along with GCC; see the file COPYING3. If not see /* In cp/objcp-common.c, cp/cp-lang.cc and objcp/objcp-lang.cc. */ extern tree cp_get_debug_type (const_tree); -extern tree objcp_tsubst_copy_and_build (tree, tree, tsubst_flags_t, - tree, bool); +extern tree objcp_tsubst_copy_and_build (tree, tree, tsubst_flags_t, tree); extern int cp_decl_dwarf_attribute (const_tree, int); extern int cp_type_dwarf_attribute (const_tree, int); diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index d13bb3d4c0e..40fd2e1ebb9 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -7383,7 +7383,7 @@ extern tree tsubst_default_argument (tree, int, tree, tree, tsubst_flags_t); extern tree tsubst (tree, tree, tsubst_flags_t, tree); extern tree tsubst_copy_and_build (tree, tree, tsubst_flags_t, - tree, bool = false, bool = false); + tree, bool = false); extern tree tsubst_expr (tree, tree, tsubst_flags_t, tree, bool); extern tree tsubst_pack_expansion (tree, tree, tsubst_flags_t, tree); diff --git a/gcc/cp/init.cc b/gcc/cp/init.cc index 3d5d3904944..fee49090de7 100644 --- a/gcc/cp/init.cc +++ b/gcc/cp/init.cc @@ -622,7 +622,7 @@ get_nsdmi (tree member, bool in_ctor, tsubst_flags_t complain) /* Do deferred instantiation of the NSDMI. */ init = (tsubst_copy_and_build (init, DECL_TI_ARGS (member), - complain, member, /*function_p=*/false, + complain, member, /*integral_constant_expression_p=*/false)); init = digest_nsdmi_init (member, init, complain); diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index c3fc56a13ff..bcc275f8b6e 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -3773,7 +3773,7 @@ expand_integer_pack (tree call, tree args, tsubst_flags_t complain, { tree ohi = CALL_EXPR_ARG (call, 0); tree hi = tsubst_copy_and_build (ohi, args, complain, in_decl, - false/*fn*/, true/*int_cst*/); + true/*int_cst*/); if (instantiation_dependent_expression_p (hi)) { @@ -6361,7 +6361,6 @@ instantiate_non_dependent_expr_internal (tree expr, tsubst_flags_t complain) /*args=*/NULL_TREE, complain, /*in_decl=*/NULL_TREE, - /*function_p=*/false, /*integral_constant_expression_p=*/true); } @@ -14210,7 +14209,6 @@ tsubst_function_decl (tree t, tree args, tsubst_flags_t complain, { tree spec = lookup_explicit_specifier (t); spec = tsubst_copy_and_build (spec, args, complain, in_decl, - /*function_p=*/false, /*i_c_e_p=*/true); spec = build_explicit_specifier (spec, complain); if (spec == error_mark_node) @@ -15276,7 +15274,7 @@ tsubst_arg_types (tree arg_types, || (in_decl && TREE_CODE (in_decl) == FUNCTION_DECL && DECL_LOCAL_DECL_P (in_decl))) default_arg = tsubst_copy_and_build (default_arg, args, complain, in_decl, - false/*fn*/, false/*constexpr*/); + false/*constexpr*/); tree remaining_arg_types = tsubst_arg_types (TREE_CHAIN (arg_types), args, end, complain, in_decl); @@ -15458,7 +15456,7 @@ tsubst_exception_specification (tree fntype, expr = DEFERRED_NOEXCEPT_PATTERN (expr); } new_specs = tsubst_copy_and_build - (expr, args, complain, in_decl, /*function_p=*/false, + (expr, args, complain, in_decl, /*integral_constant_expression_p=*/true); } new_specs = build_noexcept_spec (new_specs, complain); @@ -16383,7 +16381,6 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) type = tsubst_copy_and_build (DECLTYPE_TYPE_EXPR (t), args, complain|tf_decltype, in_decl, - /*function_p*/false, /*integral_constant_expression*/false); --cp_unevaluated_operand; @@ -18049,7 +18046,6 @@ tsubst_copy_asm_operands (tree t, tree args, tsubst_flags_t complain, if (TREE_CODE (t) != TREE_LIST) return tsubst_copy_and_build (t, args, complain, in_decl, - /*function_p=*/false, /*integral_constant_expression_p=*/false); if (t == void_list_node) @@ -19636,7 +19632,6 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, gcc_assert (!STATEMENT_CODE_P (TREE_CODE (t))); RETURN (tsubst_copy_and_build (t, args, complain, in_decl, - /*function_p=*/false, integral_constant_expression_p)); } @@ -19729,7 +19724,6 @@ tsubst_non_call_postfix_expression (tree t, tree args, /*done=*/false, /*address_p=*/false); else t = tsubst_copy_and_build (t, args, complain, in_decl, - /*function_p=*/false, /*integral_constant_expression_p=*/false); return t; @@ -19802,7 +19796,7 @@ tsubst_lambda_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl) init = tsubst_pack_expansion (init, args, complain, in_decl); else init = tsubst_copy_and_build (init, args, complain, in_decl, - /*fn*/false, /*constexpr*/false); + /*constexpr*/false); if (init == error_mark_node) return error_mark_node; @@ -20070,7 +20064,6 @@ tsubst_copy_and_build_call_args (tree t, tree args, tsubst_flags_t complain, if (!PACK_EXPANSION_P (arg)) vec_safe_push (call_args, tsubst_copy_and_build (arg, args, complain, in_decl, - /*function_p=*/false, integral_constant_expression_p)); else { @@ -20097,21 +20090,18 @@ tsubst_copy_and_build_call_args (tree t, tree args, tsubst_flags_t complain, } /* Like tsubst but deals with expressions and performs semantic - analysis. FUNCTION_P is true if T is the "F" in "F (ARGS)" or - "F (ARGS)". */ + analysis. */ tree tsubst_copy_and_build (tree t, tree args, tsubst_flags_t complain, tree in_decl, - bool function_p, bool integral_constant_expression_p) { #define RETURN(EXP) do { retval = (EXP); goto out; } while(0) #define RECUR(NODE) \ tsubst_copy_and_build (NODE, args, complain, in_decl, \ - /*function_p=*/false, \ integral_constant_expression_p) tree retval, op1; @@ -20168,7 +20158,7 @@ tsubst_copy_and_build (tree t, input_location); if (error_msg) error (error_msg); - if (!function_p && identifier_p (decl)) + if (identifier_p (decl)) { if (complain & tf_error) unqualified_name_lookup_error (decl); @@ -20182,7 +20172,6 @@ tsubst_copy_and_build (tree t, tree object; tree templ = tsubst_copy_and_build (TREE_OPERAND (t, 0), args, complain, in_decl, - function_p, integral_constant_expression_p); tree targs = TREE_OPERAND (t, 1); @@ -20565,7 +20554,6 @@ tsubst_copy_and_build (tree t, op1 = tsubst (op1, args, complain, in_decl); else op1 = tsubst_copy_and_build (op1, args, complain, in_decl, - /*function_p=*/false, /*integral_constant_expression_p=*/ false); --cp_unevaluated_operand; @@ -20605,7 +20593,6 @@ tsubst_copy_and_build (tree t, ++cp_unevaluated_operand; ++c_inhibit_evaluation_warnings; op1 = tsubst_copy_and_build (op1, args, complain, in_decl, - /*function_p=*/false, /*integral_constant_expression_p=*/false); --cp_unevaluated_operand; --c_inhibit_evaluation_warnings; @@ -20618,7 +20605,6 @@ tsubst_copy_and_build (tree t, ++c_inhibit_evaluation_warnings; ++cp_noexcept_operand; op1 = tsubst_copy_and_build (op1, args, complain, in_decl, - /*function_p=*/false, /*integral_constant_expression_p=*/false); --cp_unevaluated_operand; --c_inhibit_evaluation_warnings; @@ -20729,7 +20715,6 @@ tsubst_copy_and_build (tree t, { tree op0 = tsubst_copy_and_build (TREE_OPERAND (t, 0), args, complain & ~tf_decltype, in_decl, - /*function_p=*/false, integral_constant_expression_p); RETURN (build_x_compound_expr (EXPR_LOCATION (t), op0, @@ -20775,12 +20760,10 @@ tsubst_copy_and_build (tree t, would incorrectly perform unqualified lookup again. Note that we can also have an IDENTIFIER_NODE if the earlier - unqualified lookup found a member function; in that case - koenig_p will be false and we do want to do the lookup - again to find the instantiated member function. - - FIXME but doing that causes c++/15272, so we need to stop - using IDENTIFIER_NODE in that situation. */ + unqualified lookup found a dependent local extern declaration + (as per finish_call_expr); in that case koenig_p will be false + and we do want to do the lookup again to find the substituted + declaration. */ qualified_p = false; if (TREE_CODE (function) == TEMPLATE_ID_EXPR) @@ -20815,7 +20798,6 @@ tsubst_copy_and_build (tree t, subcomplain |= tf_conv; function = tsubst_copy_and_build (function, args, subcomplain, in_decl, - !qualified_p, integral_constant_expression_p); if (BASELINK_P (function)) @@ -20919,7 +20901,7 @@ tsubst_copy_and_build (tree t, the unqualified lookup again if we aren't in SFINAE context. */ tree unq = (tsubst_copy_and_build - (function, args, complain, in_decl, true, + (function, args, complain, in_decl, integral_constant_expression_p)); if (unq == error_mark_node) RETURN (error_mark_node); @@ -21469,7 +21451,7 @@ tsubst_copy_and_build (tree t, { tree object_ptr = tsubst_copy_and_build (TREE_OPERAND (t, 1), args, complain, - in_decl, /*function_p=*/false, + in_decl, /*integral_constant_expression_p=*/false); RETURN (finish_offsetof (object_ptr, RECUR (TREE_OPERAND (t, 0)), @@ -21571,8 +21553,7 @@ tsubst_copy_and_build (tree t, /* Handle Objective-C++ constructs, if appropriate. */ { tree subst - = objcp_tsubst_copy_and_build (t, args, complain, - in_decl, /*function_p=*/false); + = objcp_tsubst_copy_and_build (t, args, complain, in_decl); if (subst) RETURN (subst); } @@ -26389,7 +26370,6 @@ maybe_instantiate_noexcept (tree fn, tsubst_flags_t complain) noex = tsubst_copy_and_build (DEFERRED_NOEXCEPT_PATTERN (noex), DEFERRED_NOEXCEPT_ARGS (noex), tf_warning_or_error, fn, - /*function_p=*/false, /*i_c_e_p=*/true); /* Build up the noexcept-specification. */ diff --git a/gcc/objcp/objcp-lang.cc b/gcc/objcp/objcp-lang.cc index 2e8809b865d..5f0e22942b8 100644 --- a/gcc/objcp/objcp-lang.cc +++ b/gcc/objcp/objcp-lang.cc @@ -50,12 +50,11 @@ struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; there should be very few (if any) routines below. */ tree -objcp_tsubst_copy_and_build (tree t, tree args, tsubst_flags_t complain, - tree in_decl, bool function_p ATTRIBUTE_UNUSED) +objcp_tsubst_copy_and_build (tree t, tree args, tsubst_flags_t complain, + tree in_decl) { #define RECURSE(NODE) \ tsubst_copy_and_build (NODE, args, complain, in_decl, \ - /*function_p=*/false, \ /*integral_constant_expression_p=*/false) /* The following two can only occur in Objective-C++. */ From patchwork Thu Nov 10 19:56:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Palka X-Patchwork-Id: 60370 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3E1343885C20 for ; Thu, 10 Nov 2022 19:58:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3E1343885C20 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1668110300; bh=VUIc1WCRuAZ0MG14BQbY9U8HO6AQ/A+Ga/ubUrluAdo=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=hjbEKvo2fRKkaAl5wJb6U492Lmnyucm1e7fjcZG8R+kKdxvNcT3oRIzuk7y+d39g9 iatETDQpLCoUKfReFD3XNPNiN2cRqp76O24NqzValDQ5T8Dvt298PeV+uO82h3YDCA 2j/tPVmHGRyvyCn71QkASFwfqb8IaBkwR3AhqeCc= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 7A28E3858431 for ; Thu, 10 Nov 2022 19:56:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7A28E3858431 Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-183-drfkoVm0NEK--ebEbpLNRg-1; Thu, 10 Nov 2022 14:56:09 -0500 X-MC-Unique: drfkoVm0NEK--ebEbpLNRg-1 Received: by mail-qt1-f199.google.com with SMTP id f4-20020a05622a114400b003a57f828277so2166784qty.22 for ; Thu, 10 Nov 2022 11:56:09 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=VUIc1WCRuAZ0MG14BQbY9U8HO6AQ/A+Ga/ubUrluAdo=; b=vwO2PqhgJZwvuAzw+gZrlxE2NiYv2XYNjCYrtvOQlEawtzRn+jGZDYuJPELTwuujDr g5cEg4TlY5JD2UxczuVpfNy1ZBujjvo4TlhXPls5EeLnTy3RL2tquQTRciGQGt9Cd9cT lcSVjbtUv3PSdrU13R66Kq/51sRz/clrdvjaQXewc4MC3fhTQt1CyhHuRnkZkCMQeQsQ jmzQQ3glwsjRFdOFTHSt2riIT+pNA6oOJIRZYi6fQ2OIHrL2GWFBMzJaRPK9hiSvO1pn 2efd17iNLWbHcv/YK/180Uy2S64Mjkbx1jq8SkcPQhuA+zdtSEhmapp2aR57ECiROpQ2 ft2w== X-Gm-Message-State: ACrzQf2Zc4Rlprkodk5kb3pZi0AHjpGtXvxtcToU5QewthaD2wdjM1WW +BOR4UvbxXYxQCKGpq3h1TbFnt78+CthCaB1eZfdp4E0yJF+CytLdQ3Cv1u/3dWUhrOED0oYPhq 52wkBaTBzZMa1qL5Hk4xazBwdCIiqE3C3l77oufaj/eCEXvZuz6DIObuSbqgmQUhbdP0= X-Received: by 2002:a05:620a:45a4:b0:6e9:5e53:5931 with SMTP id bp36-20020a05620a45a400b006e95e535931mr1688372qkb.553.1668110167834; Thu, 10 Nov 2022 11:56:07 -0800 (PST) X-Google-Smtp-Source: AMsMyM5CtT9hu8JefN2JxdWJjisIhVjKZuhX/2NCp+vl4DY/+hr4GGDZBx1HIqxhrqgE8EikZYTWcg== X-Received: by 2002:a05:620a:45a4:b0:6e9:5e53:5931 with SMTP id bp36-20020a05620a45a400b006e95e535931mr1688358qkb.553.1668110166885; Thu, 10 Nov 2022 11:56:06 -0800 (PST) Received: from localhost.localdomain (ool-457670bb.dyn.optonline.net. [69.118.112.187]) by smtp.gmail.com with ESMTPSA id az17-20020a05620a171100b006f3e6933bacsm97631qkb.113.2022.11.10.11.56.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Nov 2022 11:56:05 -0800 (PST) To: gcc-patches@gcc.gnu.org Cc: jason@redhat.com, Patrick Palka Subject: [PATCH 2/2] c++: remove i_c_e_p parm from tsubst_copy_and_build Date: Thu, 10 Nov 2022 14:56:02 -0500 Message-Id: <20221110195602.2434376-2-ppalka@redhat.com> X-Mailer: git-send-email 2.38.1.420.g319605f8f0 In-Reply-To: <20221110195602.2434376-1-ppalka@redhat.com> References: <20221110195602.2434376-1-ppalka@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.7 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GAPPY_SUBJECT, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Patrick Palka via Gcc-patches From: Patrick Palka Reply-To: Patrick Palka Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" AFAICT the only purpose of tsubst_copy_and_build's integral_constant_expression_p boolean parameter is to diagnose certain constructs that aren't allowed to appear in a C++98 integral constant expression context, specifically casts to a non-integral type (diagnosed from the *_CAST_EXPR case of tsubst_copy_and_build) or dependent names that resolve to a non-constant decl (diagnosed from the IDENTIFIER_NODE case of tsubst_copy_and_build). The parameter has no effect outside of C++98 AFAICT. But diagnosing such constructs should arguably be done by is_constant_expression after substitution, and doing it during substitution by way of an additional parameter complicates the API of this workhouse function for functionality that's specific to C++98. And it seems is_constant_expression already does a good job of diagnosing the aforementioned two constructs in C++98 mode, at least as far as our testsuite is concerned. So this patch gets rid of this parameter from tsubst_copy_and_build, tsubst_expr and tsubst_copy_and_build_call_args. The only interesting changes are those to potential_constant_expression_1 and the IDENTIFIER_NODE and *_CAST_EXPR cases of tsubst_copy_and_build; the rest are mechanical adjustments to these functions and their call sites. Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for trunk? gcc/cp/ChangeLog: * constexpr.cc (potential_constant_expression_1) : Use cast_valid_in_integral_constant_expression_p instead of open coding it. * constraint.cc (tsubst_valid_expression_requirement): Adjust calls to tsubst_copy_and_build and tsubst_expr. (tsubst_constraint): Likewise. (satisfy_atom): Likewise. (diagnose_trait_expr): Likewise. * cp-tree.h (tsubst_copy_and_build): Remove i_c_e_p parameter. (tsubst_expr): Likewise. * init.cc (get_nsdmi): Adjust calls to tsubst_copy_and_build and tsubst_expr. * pt.cc (expand_integer_pack): Likewise. (instantiate_non_dependent_expr_internal): Likewise. (tsubst_friend_function): Likewise. (tsubst_attribute): Likewise. (instantiate_class_template): Likewise. (tsubst_template_arg): Likewise. (gen_elem_of_pack_expansion_instantiation): Likewise. (tsubst_fold_expr_init): Likewise. (tsubst_pack_expansion): Likewise. (tsubst_default_argument): Likewise. (tsubst_function_decl): Likewise. (tsubst_decl): Likewise. (tsubst_arg_types): Likewise. (tsubst_exception_specification): Likewise. (tsubst): Likewise. (tsubst_init): Likewise. (tsubst_copy): Likewise. (tsubst_omp_clause_decl): Likewise. (tsubst_omp_clauses): Likewise. (tsubst_copy_asm_operands): Likewise. (tsubst_omp_for_iterator): Likewise. (tsubst_expr): Likewise. Remove i_c_e_p parameter. (tsubst_omp_udr): Likewise. (tsubst_non_call_postfix_expression): Likewise. Remove i_c_e_p parameter. (tsubst_lambda_expr): Likewise. (tsubst_copy_and_build_call_args): Likewise. (tsubst_copy_and_build): Likewise. Remove i_c_e_p parameter. : Adjust call to finish_id_expression following removal of i_c_e_p. : Remove C++98-specific cast validity check guarded by i_c_e_p. (maybe_instantiate_noexcept): Adjust calls to tsubst_copy_and_build and tsubst_expr. (instantiate_body): Likewise. (instantiate_decl): Likewise. (tsubst_initializer_list): Likewise. (tsubst_enum): Likewise. gcc/objcp/ChangeLog: * objcp-lang.cc (objcp_tsubst_copy_and_build): Likewise. gcc/testsuite/ChangeLog: * g++.dg/template/crash55.C: Don't expect additional C++98-specific diagnostics. * g++.dg/template/ref3.C: Remove C++98-specific xfail. --- gcc/cp/constexpr.cc | 4 +- gcc/cp/constraint.cc | 14 +- gcc/cp/cp-tree.h | 6 +- gcc/cp/init.cc | 6 +- gcc/cp/pt.cc | 240 ++++++++---------------- gcc/objcp/objcp-lang.cc | 3 +- gcc/testsuite/g++.dg/template/crash55.C | 3 +- gcc/testsuite/g++.dg/template/ref3.C | 3 +- 8 files changed, 93 insertions(+), 186 deletions(-) diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc index 15b4f2c4a08..e665839f5b1 100644 --- a/gcc/cp/constexpr.cc +++ b/gcc/cp/constexpr.cc @@ -9460,9 +9460,7 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now, case STATIC_CAST_EXPR: case REINTERPRET_CAST_EXPR: case IMPLICIT_CONV_EXPR: - if (cxx_dialect < cxx11 - && !dependent_type_p (TREE_TYPE (t)) - && !INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (t))) + if (!cast_valid_in_integral_constant_expression_p (TREE_TYPE (t))) /* In C++98, a conversion to non-integral type can't be part of a constant expression. */ { diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index f6ef078171a..3ddbd535330 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -1921,7 +1921,7 @@ hash_placeholder_constraint (tree c) static tree tsubst_valid_expression_requirement (tree t, tree args, sat_info info) { - tree r = tsubst_expr (t, args, tf_none, info.in_decl, false); + tree r = tsubst_expr (t, args, tf_none, info.in_decl); if (convert_to_void (r, ICV_STATEMENT, tf_none) != error_mark_node) return r; @@ -1932,7 +1932,7 @@ tsubst_valid_expression_requirement (tree t, tree args, sat_info info) { inform (loc, "the required expression %qE is invalid, because", t); if (r == error_mark_node) - tsubst_expr (t, args, info.complain, info.in_decl, false); + tsubst_expr (t, args, info.complain, info.in_decl); else convert_to_void (r, ICV_STATEMENT, info.complain); } @@ -1941,7 +1941,7 @@ tsubst_valid_expression_requirement (tree t, tree args, sat_info info) } else if (info.noisy ()) { - r = tsubst_expr (t, args, info.complain, info.in_decl, false); + r = tsubst_expr (t, args, info.complain, info.in_decl); convert_to_void (r, ICV_STATEMENT, info.complain); } @@ -2706,7 +2706,7 @@ tsubst_constraint (tree t, tree args, tsubst_flags_t complain, tree in_decl) constraint-expressions of a declaration. */ processing_constraint_expression_sentinel s; cp_unevaluated u; - tree expr = tsubst_expr (t, args, complain, in_decl, false); + tree expr = tsubst_expr (t, args, complain, in_decl); return expr; } @@ -2954,13 +2954,13 @@ satisfy_atom (tree t, tree args, sat_info info) /* Apply the parameter mapping (i.e., just substitute). */ tree expr = ATOMIC_CONSTR_EXPR (t); - tree result = tsubst_expr (expr, args, quiet.complain, quiet.in_decl, false); + tree result = tsubst_expr (expr, args, quiet.complain, quiet.in_decl); if (result == error_mark_node) { /* If substitution results in an invalid type or expression, the constraint is not satisfied. Replay the substitution. */ if (info.diagnose_unsatisfaction_p ()) - tsubst_expr (expr, args, info.complain, info.in_decl, false); + tsubst_expr (expr, args, info.complain, info.in_decl); return cache.save (inst_cache.save (boolean_false_node)); } @@ -3587,7 +3587,7 @@ diagnose_trait_expr (tree expr, tree args) /* Build a "fake" version of the instantiated trait, so we can get the instantiated types from result. */ ++processing_template_decl; - expr = tsubst_expr (expr, args, tf_none, NULL_TREE, false); + expr = tsubst_expr (expr, args, tf_none, NULL_TREE); --processing_template_decl; tree t1 = TRAIT_EXPR_TYPE1 (expr); diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 40fd2e1ebb9..7ff3206e245 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -7382,10 +7382,8 @@ extern void instantiate_pending_templates (int); extern tree tsubst_default_argument (tree, int, tree, tree, tsubst_flags_t); extern tree tsubst (tree, tree, tsubst_flags_t, tree); -extern tree tsubst_copy_and_build (tree, tree, tsubst_flags_t, - tree, bool = false); -extern tree tsubst_expr (tree, tree, tsubst_flags_t, - tree, bool); +extern tree tsubst_copy_and_build (tree, tree, tsubst_flags_t, tree); +extern tree tsubst_expr (tree, tree, tsubst_flags_t, tree); extern tree tsubst_pack_expansion (tree, tree, tsubst_flags_t, tree); extern tree tsubst_argument_pack (tree, tree, tsubst_flags_t, tree); extern tree tsubst_template_args (tree, tree, tsubst_flags_t, tree); diff --git a/gcc/cp/init.cc b/gcc/cp/init.cc index fee49090de7..2fff4ad2dc7 100644 --- a/gcc/cp/init.cc +++ b/gcc/cp/init.cc @@ -620,10 +620,8 @@ get_nsdmi (tree member, bool in_ctor, tsubst_flags_t complain) start_lambda_scope (member); /* Do deferred instantiation of the NSDMI. */ - init = (tsubst_copy_and_build - (init, DECL_TI_ARGS (member), - complain, member, - /*integral_constant_expression_p=*/false)); + init = tsubst_copy_and_build (init, DECL_TI_ARGS (member), + complain, member); init = digest_nsdmi_init (member, init, complain); finish_lambda_scope (); diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index bcc275f8b6e..e3d311b0a8b 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -3772,8 +3772,7 @@ expand_integer_pack (tree call, tree args, tsubst_flags_t complain, tree in_decl) { tree ohi = CALL_EXPR_ARG (call, 0); - tree hi = tsubst_copy_and_build (ohi, args, complain, in_decl, - true/*int_cst*/); + tree hi = tsubst_copy_and_build (ohi, args, complain, in_decl); if (instantiation_dependent_expression_p (hi)) { @@ -6360,8 +6359,7 @@ instantiate_non_dependent_expr_internal (tree expr, tsubst_flags_t complain) return tsubst_copy_and_build (expr, /*args=*/NULL_TREE, complain, - /*in_decl=*/NULL_TREE, - /*integral_constant_expression_p=*/true); + /*in_decl=*/NULL_TREE); } /* Instantiate the non-dependent expression EXPR. */ @@ -11195,8 +11193,7 @@ tsubst_friend_function (tree decl, tree args) current class with same name. */ push_nested_namespace (ns); fns = tsubst_expr (DECL_TI_TEMPLATE (decl), args, - tf_warning_or_error, NULL_TREE, - /*integral_constant_expression_p=*/false); + tf_warning_or_error, NULL_TREE); pop_nested_namespace (ns); arglist = tsubst (DECL_TI_ARGS (decl), args, tf_warning_or_error, NULL_TREE); @@ -11609,9 +11606,7 @@ tsubst_attribute (tree t, tree *decl_p, tree args, get_attribute_name (t))) { ++cp_unevaluated_operand; - tree varid - = tsubst_expr (TREE_PURPOSE (val), args, complain, - in_decl, /*integral_constant_expression_p=*/false); + tree varid = tsubst_expr (TREE_PURPOSE (val), args, complain, in_decl); --cp_unevaluated_operand; tree chain = TREE_CHAIN (val); location_t match_loc = cp_expr_loc_or_input_loc (TREE_PURPOSE (chain)); @@ -11647,7 +11642,7 @@ tsubst_attribute (tree t, tree *decl_p, tree args, tree v = TREE_VALUE (t3); if (TREE_CODE (v) == STRING_CST && allow_string) continue; - v = tsubst_expr (v, args, complain, in_decl, true); + v = tsubst_expr (v, args, complain, in_decl); v = fold_non_dependent_expr (v); if (!INTEGRAL_TYPE_P (TREE_TYPE (v)) || (TREE_PURPOSE (t3) == score @@ -11693,8 +11688,7 @@ tsubst_attribute (tree t, tree *decl_p, tree args, else if (attribute_takes_identifier_p (get_attribute_name (t))) { tree chain - = tsubst_expr (TREE_CHAIN (val), args, complain, in_decl, - /*integral_constant_expression_p=*/false); + = tsubst_expr (TREE_CHAIN (val), args, complain, in_decl); if (chain != TREE_CHAIN (val)) val = tree_cons (NULL_TREE, TREE_VALUE (val), chain); } @@ -11717,8 +11711,7 @@ tsubst_attribute (tree t, tree *decl_p, tree args, return list; } else - val = tsubst_expr (val, args, complain, in_decl, - /*integral_constant_expression_p=*/false); + val = tsubst_expr (val, args, complain, in_decl); if (val == error_mark_node) return error_mark_node; @@ -12160,8 +12153,7 @@ instantiate_class_template (tree type) { /* Build new TYPE_FIELDS. */ if (TREE_CODE (t) == STATIC_ASSERT) - tsubst_expr (t, args, tf_warning_or_error, NULL_TREE, - /*integral_constant_expression_p=*/true); + tsubst_expr (t, args, tf_warning_or_error, NULL_TREE); else if (TREE_CODE (t) != CONST_DECL) { tree r; @@ -12418,8 +12410,7 @@ tsubst_template_arg (tree t, tree args, tsubst_flags_t complain, tree in_decl) { if (!(complain & tf_warning)) ++c_inhibit_evaluation_warnings; - r = tsubst_expr (t, args, complain, in_decl, - /*integral_constant_expression_p=*/true); + r = tsubst_expr (t, args, complain, in_decl); if (!(complain & tf_warning)) --c_inhibit_evaluation_warnings; } @@ -12683,8 +12674,7 @@ gen_elem_of_pack_expansion_instantiation (tree pattern, else if (pattern == error_mark_node) t = error_mark_node; else if (!TYPE_P (pattern)) - t = tsubst_expr (pattern, args, complain, in_decl, - /*integral_constant_expression_p=*/false); + t = tsubst_expr (pattern, args, complain, in_decl); else { t = tsubst (pattern, args, complain, in_decl); @@ -12778,7 +12768,7 @@ tsubst_fold_expr_pack (tree t, tree args, tsubst_flags_t complain, tree in_decl) static inline tree tsubst_fold_expr_init (tree t, tree args, tsubst_flags_t complain, tree in_decl) { - return tsubst_expr (FOLD_EXPR_INIT (t), args, complain, in_decl, false); + return tsubst_expr (FOLD_EXPR_INIT (t), args, complain, in_decl); } /* Expand a PACK of arguments into a grouped as left fold. @@ -13147,12 +13137,12 @@ tsubst_pack_expansion (tree t, tree args, tsubst_flags_t complain, if (BASES_DIRECT (parm_pack)) return calculate_direct_bases (tsubst_expr (BASES_TYPE (parm_pack), args, complain, - in_decl, false), + in_decl), complain); else return calculate_bases (tsubst_expr (BASES_TYPE (parm_pack), - args, complain, in_decl, - false), complain); + args, complain, in_decl), + complain); } else if (builtin_pack_call_p (parm_pack)) { @@ -13326,8 +13316,7 @@ tsubst_pack_expansion (tree t, tree args, tsubst_flags_t complain, pattern and return a PACK_EXPANSION_*. The caller will need to deal with that. */ if (TREE_CODE (t) == EXPR_PACK_EXPANSION) - result = tsubst_expr (pattern, args, complain, in_decl, - /*integral_constant_expression_p=*/false); + result = tsubst_expr (pattern, args, complain, in_decl); else result = tsubst (pattern, args, complain, in_decl); result = make_pack_expansion (result, complain); @@ -13901,9 +13890,7 @@ tsubst_default_argument (tree fn, int parmnum, tree type, tree arg, the body of function so as to avoid collecting live data on the stack. */ ++function_depth; - arg = tsubst_expr (arg, DECL_TI_ARGS (fn), - complain, NULL_TREE, - /*integral_constant_expression_p=*/false); + arg = tsubst_expr (arg, DECL_TI_ARGS (fn), complain, NULL_TREE); --function_depth; finish_lambda_scope (); @@ -14208,8 +14195,7 @@ tsubst_function_decl (tree t, tree args, tsubst_flags_t complain, if (DECL_HAS_DEPENDENT_EXPLICIT_SPEC_P (t)) { tree spec = lookup_explicit_specifier (t); - spec = tsubst_copy_and_build (spec, args, complain, in_decl, - /*i_c_e_p=*/true); + spec = tsubst_copy_and_build (spec, args, complain, in_decl); spec = build_explicit_specifier (spec, complain); if (spec == error_mark_node) return error_mark_node; @@ -14821,8 +14807,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) number of bits. */ DECL_BIT_FIELD_REPRESENTATIVE (r) = tsubst_expr (DECL_BIT_FIELD_REPRESENTATIVE (t), args, - complain, in_decl, - /*integral_constant_expression_p=*/true); + complain, in_decl); if (DECL_INITIAL (t)) { /* Set up DECL_TEMPLATE_INFO so that we can get at the @@ -15074,8 +15059,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) bool nop = (TREE_CODE (ve) == NOP_EXPR); if (nop) ve = TREE_OPERAND (ve, 0); - ve = tsubst_expr (ve, args, complain, in_decl, - /*constant_expression_p=*/false); + ve = tsubst_expr (ve, args, complain, in_decl); if (REFERENCE_REF_P (ve)) { gcc_assert (TYPE_REF_P (type)); @@ -15273,8 +15257,7 @@ tsubst_arg_types (tree arg_types, if (lambda_fn_in_template_p (in_decl) || (in_decl && TREE_CODE (in_decl) == FUNCTION_DECL && DECL_LOCAL_DECL_P (in_decl))) - default_arg = tsubst_copy_and_build (default_arg, args, complain, in_decl, - false/*constexpr*/); + default_arg = tsubst_copy_and_build (default_arg, args, complain, in_decl); tree remaining_arg_types = tsubst_arg_types (TREE_CHAIN (arg_types), args, end, complain, in_decl); @@ -15455,9 +15438,7 @@ tsubst_exception_specification (tree fntype, args); expr = DEFERRED_NOEXCEPT_PATTERN (expr); } - new_specs = tsubst_copy_and_build - (expr, args, complain, in_decl, - /*integral_constant_expression_p=*/true); + new_specs = tsubst_copy_and_build (expr, args, complain, in_decl); } new_specs = build_noexcept_spec (new_specs, complain); /* We've instantiated a template before a noexcept-specifier @@ -15764,8 +15745,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) { tree max, omax = TREE_OPERAND (TYPE_MAX_VALUE (t), 0); - max = tsubst_expr (omax, args, complain, in_decl, - /*integral_constant_expression_p=*/false); + max = tsubst_expr (omax, args, complain, in_decl); /* Fix up type of the magic NOP_EXPR with TREE_SIDE_EFFECTS if needed. */ @@ -16358,9 +16338,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) ++cp_unevaluated_operand; ++c_inhibit_evaluation_warnings; - type = tsubst_expr (TYPEOF_TYPE_EXPR (t), args, - complain, in_decl, - /*integral_constant_expression_p=*/false); + type = tsubst_expr (TYPEOF_TYPE_EXPR (t), args, complain, in_decl); --cp_unevaluated_operand; --c_inhibit_evaluation_warnings; @@ -16380,8 +16358,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) ++c_inhibit_evaluation_warnings; type = tsubst_copy_and_build (DECLTYPE_TYPE_EXPR (t), args, - complain|tf_decltype, in_decl, - /*integral_constant_expression*/false); + complain|tf_decltype, in_decl); --cp_unevaluated_operand; --c_inhibit_evaluation_warnings; @@ -16840,7 +16817,7 @@ tsubst_init (tree init, tree decl, tree args, if (!init) return NULL_TREE; - init = tsubst_expr (init, args, complain, in_decl, false); + init = tsubst_expr (init, args, complain, in_decl); tree type = TREE_TYPE (decl); @@ -17677,9 +17654,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) return t; case CO_AWAIT_EXPR: - return tsubst_expr (t, args, complain, in_decl, - /*integral_constant_expression_p=*/false); - break; + return tsubst_expr (t, args, complain, in_decl); default: /* We shouldn't get here, but keep going if !flag_checking. */ @@ -17719,14 +17694,11 @@ tsubst_omp_clause_decl (tree decl, tree args, tsubst_flags_t complain, DECL_CONTEXT (TREE_VEC_ELT (*tp, 0)) = current_function_decl; pushdecl (TREE_VEC_ELT (*tp, 0)); TREE_VEC_ELT (*tp, 1) - = tsubst_expr (TREE_VEC_ELT (it, 1), args, complain, in_decl, - /*integral_constant_expression_p=*/false); + = tsubst_expr (TREE_VEC_ELT (it, 1), args, complain, in_decl); TREE_VEC_ELT (*tp, 2) - = tsubst_expr (TREE_VEC_ELT (it, 2), args, complain, in_decl, - /*integral_constant_expression_p=*/false); + = tsubst_expr (TREE_VEC_ELT (it, 2), args, complain, in_decl); TREE_VEC_ELT (*tp, 3) - = tsubst_expr (TREE_VEC_ELT (it, 3), args, complain, in_decl, - /*integral_constant_expression_p=*/false); + = tsubst_expr (TREE_VEC_ELT (it, 3), args, complain, in_decl); TREE_CHAIN (*tp) = NULL_TREE; tp = &TREE_CHAIN (*tp); } @@ -17748,10 +17720,8 @@ tsubst_omp_clause_decl (tree decl, tree args, tsubst_flags_t complain, if (TREE_CODE (decl) == TREE_LIST) { tree low_bound - = tsubst_expr (TREE_PURPOSE (decl), args, complain, in_decl, - /*integral_constant_expression_p=*/false); - tree length = tsubst_expr (TREE_VALUE (decl), args, complain, in_decl, - /*integral_constant_expression_p=*/false); + = tsubst_expr (TREE_PURPOSE (decl), args, complain, in_decl); + tree length = tsubst_expr (TREE_VALUE (decl), args, complain, in_decl); tree chain = tsubst_omp_clause_decl (TREE_CHAIN (decl), args, complain, in_decl, NULL); if (TREE_PURPOSE (decl) == low_bound @@ -17763,8 +17733,7 @@ tsubst_omp_clause_decl (tree decl, tree args, tsubst_flags_t complain, = OMP_CLAUSE_DOACROSS_SINK_NEGATIVE (decl); return ret; } - tree ret = tsubst_expr (decl, args, complain, in_decl, - /*integral_constant_expression_p=*/false); + tree ret = tsubst_expr (decl, args, complain, in_decl); /* Undo convert_from_reference tsubst_expr could have called. */ if (decl && REFERENCE_REF_P (ret) @@ -17795,8 +17764,8 @@ tsubst_omp_clauses (tree clauses, enum c_omp_region_type ort, if (OMP_CLAUSE_LASTPRIVATE_STMT (oc)) { OMP_CLAUSE_LASTPRIVATE_STMT (nc) = push_stmt_list (); - tsubst_expr (OMP_CLAUSE_LASTPRIVATE_STMT (oc), args, complain, - in_decl, /*integral_constant_expression_p=*/false); + tsubst_expr (OMP_CLAUSE_LASTPRIVATE_STMT (oc), args, + complain, in_decl); OMP_CLAUSE_LASTPRIVATE_STMT (nc) = pop_stmt_list (OMP_CLAUSE_LASTPRIVATE_STMT (nc)); } @@ -17829,8 +17798,7 @@ tsubst_omp_clauses (tree clauses, enum c_omp_region_type ort, if (OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (oc)) OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (nc) = tsubst_expr (OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (oc), args, - complain, in_decl, - /*integral_constant_expression_p=*/false); + complain, in_decl); /* FALLTHRU */ case OMP_CLAUSE_TILE: case OMP_CLAUSE_IF: @@ -17858,8 +17826,7 @@ tsubst_omp_clauses (tree clauses, enum c_omp_region_type ort, case OMP_CLAUSE_WAIT: case OMP_CLAUSE_DETACH: OMP_CLAUSE_OPERAND (nc, 0) - = tsubst_expr (OMP_CLAUSE_OPERAND (oc, 0), args, complain, - in_decl, /*integral_constant_expression_p=*/false); + = tsubst_expr (OMP_CLAUSE_OPERAND (oc, 0), args, complain, in_decl); break; case OMP_CLAUSE_REDUCTION: case OMP_CLAUSE_IN_REDUCTION: @@ -17889,19 +17856,16 @@ tsubst_omp_clauses (tree clauses, enum c_omp_region_type ort, = tsubst_omp_clause_decl (OMP_CLAUSE_DECL (oc), args, complain, in_decl, NULL); OMP_CLAUSE_OPERAND (nc, 1) - = tsubst_expr (OMP_CLAUSE_OPERAND (oc, 1), args, complain, - in_decl, /*integral_constant_expression_p=*/false); + = tsubst_expr (OMP_CLAUSE_OPERAND (oc, 1), args, complain, in_decl); break; case OMP_CLAUSE_ALLOCATE: OMP_CLAUSE_DECL (nc) = tsubst_omp_clause_decl (OMP_CLAUSE_DECL (oc), args, complain, in_decl, NULL); OMP_CLAUSE_OPERAND (nc, 1) - = tsubst_expr (OMP_CLAUSE_OPERAND (oc, 1), args, complain, - in_decl, /*integral_constant_expression_p=*/false); + = tsubst_expr (OMP_CLAUSE_OPERAND (oc, 1), args, complain, in_decl); OMP_CLAUSE_OPERAND (nc, 2) - = tsubst_expr (OMP_CLAUSE_OPERAND (oc, 2), args, complain, - in_decl, /*integral_constant_expression_p=*/false); + = tsubst_expr (OMP_CLAUSE_OPERAND (oc, 2), args, complain, in_decl); break; case OMP_CLAUSE_LINEAR: OMP_CLAUSE_DECL (nc) @@ -17918,9 +17882,8 @@ tsubst_omp_clauses (tree clauses, enum c_omp_region_type ort, complain, in_decl, NULL); else OMP_CLAUSE_LINEAR_STEP (nc) - = tsubst_expr (OMP_CLAUSE_LINEAR_STEP (oc), args, complain, - in_decl, - /*integral_constant_expression_p=*/false); + = tsubst_expr (OMP_CLAUSE_LINEAR_STEP (oc), args, + complain, in_decl); break; case OMP_CLAUSE_NOWAIT: case OMP_CLAUSE_DEFAULT: @@ -18045,8 +18008,7 @@ tsubst_copy_asm_operands (tree t, tree args, tsubst_flags_t complain, return t; if (TREE_CODE (t) != TREE_LIST) - return tsubst_copy_and_build (t, args, complain, in_decl, - /*integral_constant_expression_p=*/false); + return tsubst_copy_and_build (t, args, complain, in_decl); if (t == void_list_node) return t; @@ -18087,12 +18049,10 @@ static tree tsubst_decomp_names (tree, tree, tree, tsubst_flags_t, tree, static bool tsubst_omp_for_iterator (tree t, int i, tree declv, tree &orig_declv, tree initv, tree condv, tree incrv, tree *clauses, - tree args, tsubst_flags_t complain, tree in_decl, - bool integral_constant_expression_p) + tree args, tsubst_flags_t complain, tree in_decl) { #define RECUR(NODE) \ - tsubst_expr ((NODE), args, complain, in_decl, \ - integral_constant_expression_p) + tsubst_expr ((NODE), args, complain, in_decl) tree decl, init, cond = NULL_TREE, incr = NULL_TREE; bool ret = false; @@ -18580,13 +18540,11 @@ dependent_operand_p (tree t) processing. */ tree -tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, - bool integral_constant_expression_p) +tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl) { #define RETURN(EXP) do { r = (EXP); goto out; } while(0) #define RECUR(NODE) \ - tsubst_expr ((NODE), args, complain, in_decl, \ - integral_constant_expression_p) + tsubst_expr ((NODE), args, complain, in_decl) tree stmt, tmp; tree r; @@ -19132,11 +19090,8 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, tree condition; ++c_inhibit_evaluation_warnings; - condition = - tsubst_expr (STATIC_ASSERT_CONDITION (t), - args, - complain, in_decl, - /*integral_constant_expression_p=*/true); + condition = tsubst_expr (STATIC_ASSERT_CONDITION (t), args, + complain, in_decl); --c_inhibit_evaluation_warnings; finish_static_assert (condition, @@ -19232,8 +19187,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, any_range_for |= tsubst_omp_for_iterator (t, i, declv, orig_declv, initv, condv, incrv, &clauses, args, - complain, in_decl, - integral_constant_expression_p); + complain, in_decl); omp_parallel_combined_clauses = NULL; if (any_range_for) @@ -19631,8 +19585,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, default: gcc_assert (!STATEMENT_CODE_P (TREE_CODE (t))); - RETURN (tsubst_copy_and_build (t, args, complain, in_decl, - integral_constant_expression_p)); + RETURN (tsubst_copy_and_build (t, args, complain, in_decl)); } RETURN (NULL_TREE); @@ -19679,7 +19632,7 @@ tsubst_omp_udr (tree t, tree args, tsubst_flags_t complain, tree in_decl) DECL_CONTEXT (omp_in) = current_function_decl; keep_next_level (true); tree block = begin_omp_structured_block (); - tsubst_expr (stmts[2], args, complain, in_decl, false); + tsubst_expr (stmts[2], args, complain, in_decl); block = finish_omp_structured_block (block); block = maybe_cleanup_point_expr_void (block); add_decl_expr (omp_out); @@ -19699,7 +19652,7 @@ tsubst_omp_udr (tree t, tree args, tsubst_flags_t complain, tree in_decl) DECL_CONTEXT (omp_orig) = current_function_decl; keep_next_level (true); tree block = begin_omp_structured_block (); - tsubst_expr (stmts[5], args, complain, in_decl, false); + tsubst_expr (stmts[5], args, complain, in_decl); block = finish_omp_structured_block (block); block = maybe_cleanup_point_expr_void (block); cp_walk_tree (&block, cp_remove_omp_priv_cleanup_stmt, omp_priv, NULL); @@ -19723,8 +19676,7 @@ tsubst_non_call_postfix_expression (tree t, tree args, t = tsubst_qualified_id (t, args, complain, in_decl, /*done=*/false, /*address_p=*/false); else - t = tsubst_copy_and_build (t, args, complain, in_decl, - /*integral_constant_expression_p=*/false); + t = tsubst_copy_and_build (t, args, complain, in_decl); return t; } @@ -19795,8 +19747,7 @@ tsubst_lambda_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl) if (PACK_EXPANSION_P (init)) init = tsubst_pack_expansion (init, args, complain, in_decl); else - init = tsubst_copy_and_build (init, args, complain, in_decl, - /*constexpr*/false); + init = tsubst_copy_and_build (init, args, complain, in_decl); if (init == error_mark_node) return error_mark_node; @@ -19962,7 +19913,7 @@ tsubst_lambda_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl) need another to confuse NRV (91217). */ saved = BIND_EXPR_BODY (saved); - tsubst_expr (saved, args, complain, r, /*constexpr*/false); + tsubst_expr (saved, args, complain, r); finish_lambda_function (body); @@ -20053,7 +20004,6 @@ maybe_fold_fn_template_args (tree fn, tsubst_flags_t complain) static void tsubst_copy_and_build_call_args (tree t, tree args, tsubst_flags_t complain, tree in_decl, - bool integral_constant_expression_p, releasing_vec &call_args) { unsigned int nargs = call_expr_nargs (t); @@ -20063,8 +20013,7 @@ tsubst_copy_and_build_call_args (tree t, tree args, tsubst_flags_t complain, if (!PACK_EXPANSION_P (arg)) vec_safe_push (call_args, - tsubst_copy_and_build (arg, args, complain, in_decl, - integral_constant_expression_p)); + tsubst_copy_and_build (arg, args, complain, in_decl)); else { /* Expand the pack expansion and push each entry onto CALL_ARGS. */ @@ -20093,16 +20042,11 @@ tsubst_copy_and_build_call_args (tree t, tree args, tsubst_flags_t complain, analysis. */ tree -tsubst_copy_and_build (tree t, - tree args, - tsubst_flags_t complain, - tree in_decl, - bool integral_constant_expression_p) +tsubst_copy_and_build (tree t, tree args, tsubst_flags_t complain, tree in_decl) { #define RETURN(EXP) do { retval = (EXP); goto out; } while(0) #define RECUR(NODE) \ - tsubst_copy_and_build (NODE, args, complain, in_decl, \ - integral_constant_expression_p) + tsubst_copy_and_build (NODE, args, complain, in_decl) tree retval, op1; location_t save_loc; @@ -20128,7 +20072,6 @@ tsubst_copy_and_build (tree t, { tree decl; cp_id_kind idk; - bool non_integral_constant_expression_p; const char *error_msg; if (IDENTIFIER_CONV_OP_P (t)) @@ -20147,9 +20090,9 @@ tsubst_copy_and_build (tree t, decl = finish_id_expression (t, decl, NULL_TREE, &idk, - integral_constant_expression_p, - /*allow_non_integral_constant_expression_p=*/(cxx_dialect >= cxx11), - &non_integral_constant_expression_p, + /*i_c_e_p=*/false, + /*allow_i_c_e_p=*/true, + /*non_i_c_e_p=*/nullptr, /*template_p=*/false, /*done=*/true, /*address_p=*/false, @@ -20171,8 +20114,7 @@ tsubst_copy_and_build (tree t, { tree object; tree templ = tsubst_copy_and_build (TREE_OPERAND (t, 0), args, - complain, in_decl, - integral_constant_expression_p); + complain, in_decl); tree targs = TREE_OPERAND (t, 1); if (targs) @@ -20312,14 +20254,6 @@ tsubst_copy_and_build (tree t, if (TREE_CODE (t) == CAST_EXPR) tcomplain |= tf_tst_ok; type = tsubst (TREE_TYPE (t), args, tcomplain, in_decl); - if (integral_constant_expression_p - && !cast_valid_in_integral_constant_expression_p (type)) - { - if (complain & tf_error) - error ("a cast to a type other than an integral or " - "enumeration type cannot appear in a constant-expression"); - RETURN (error_mark_node); - } op = RECUR (TREE_OPERAND (t, 0)); @@ -20504,7 +20438,6 @@ tsubst_copy_and_build (tree t, tree c = TREE_OPERAND (t, 1); releasing_vec index_exp_list; tsubst_copy_and_build_call_args (c, args, complain, in_decl, - integral_constant_expression_p, index_exp_list); tree r; @@ -20553,9 +20486,7 @@ tsubst_copy_and_build (tree t, if (TYPE_P (op1)) op1 = tsubst (op1, args, complain, in_decl); else - op1 = tsubst_copy_and_build (op1, args, complain, in_decl, - /*integral_constant_expression_p=*/ - false); + op1 = tsubst_copy_and_build (op1, args, complain, in_decl); --cp_unevaluated_operand; --c_inhibit_evaluation_warnings; } @@ -20592,8 +20523,7 @@ tsubst_copy_and_build (tree t, op1 = TREE_OPERAND (t, 0); ++cp_unevaluated_operand; ++c_inhibit_evaluation_warnings; - op1 = tsubst_copy_and_build (op1, args, complain, in_decl, - /*integral_constant_expression_p=*/false); + op1 = tsubst_copy_and_build (op1, args, complain, in_decl); --cp_unevaluated_operand; --c_inhibit_evaluation_warnings; RETURN (objc_build_encode_expr (op1)); @@ -20604,8 +20534,7 @@ tsubst_copy_and_build (tree t, ++cp_unevaluated_operand; ++c_inhibit_evaluation_warnings; ++cp_noexcept_operand; - op1 = tsubst_copy_and_build (op1, args, complain, in_decl, - /*integral_constant_expression_p=*/false); + op1 = tsubst_copy_and_build (op1, args, complain, in_decl); --cp_unevaluated_operand; --c_inhibit_evaluation_warnings; --cp_noexcept_operand; @@ -20714,8 +20643,7 @@ tsubst_copy_and_build (tree t, case COMPOUND_EXPR: { tree op0 = tsubst_copy_and_build (TREE_OPERAND (t, 0), args, - complain & ~tf_decltype, in_decl, - integral_constant_expression_p); + complain & ~tf_decltype, in_decl); RETURN (build_x_compound_expr (EXPR_LOCATION (t), op0, RECUR (TREE_OPERAND (t, 1)), @@ -20796,9 +20724,7 @@ tsubst_copy_and_build (tree t, augmenting the overload set via ADL, so during this initial substitution we disable mark_used by setting tf_conv (68942). */ subcomplain |= tf_conv; - function = tsubst_copy_and_build (function, args, subcomplain, - in_decl, - integral_constant_expression_p); + function = tsubst_copy_and_build (function, args, subcomplain, in_decl); if (BASELINK_P (function)) qualified_p = true; @@ -20807,7 +20733,6 @@ tsubst_copy_and_build (tree t, nargs = call_expr_nargs (t); releasing_vec call_args; tsubst_copy_and_build_call_args (t, args, complain, in_decl, - integral_constant_expression_p, call_args); /* Stripped-down processing for a call in a thunk. Specifically, in @@ -20900,9 +20825,8 @@ tsubst_copy_and_build (tree t, /* For backwards compatibility and good diagnostics, try the unqualified lookup again if we aren't in SFINAE context. */ - tree unq = (tsubst_copy_and_build - (function, args, complain, in_decl, - integral_constant_expression_p)); + tree unq = tsubst_copy_and_build (function, args, + complain, in_decl); if (unq == error_mark_node) RETURN (error_mark_node); @@ -21450,9 +21374,8 @@ tsubst_copy_and_build (tree t, case OFFSETOF_EXPR: { tree object_ptr - = tsubst_copy_and_build (TREE_OPERAND (t, 1), args, complain, - in_decl, - /*integral_constant_expression_p=*/false); + = tsubst_copy_and_build (TREE_OPERAND (t, 1), args, + complain, in_decl); RETURN (finish_offsetof (object_ptr, RECUR (TREE_OPERAND (t, 0)), EXPR_LOCATION (t))); @@ -21478,8 +21401,7 @@ tsubst_copy_and_build (tree t, tree stmt_expr = begin_stmt_expr (); cur_stmt_expr = stmt_expr; - tsubst_expr (STMT_EXPR_STMT (t), args, complain, in_decl, - integral_constant_expression_p); + tsubst_expr (STMT_EXPR_STMT (t), args, complain, in_decl); stmt_expr = finish_stmt_expr (stmt_expr, false); cur_stmt_expr = old_stmt_expr; @@ -21506,8 +21428,7 @@ tsubst_copy_and_build (tree t, } case TRANSACTION_EXPR: - RETURN (tsubst_expr(t, args, complain, in_decl, - integral_constant_expression_p)); + RETURN (tsubst_expr (t, args, complain, in_decl)); case PAREN_EXPR: if (REF_PARENTHESIZED_P (t)) @@ -26369,8 +26290,7 @@ maybe_instantiate_noexcept (tree fn, tsubst_flags_t complain) /* Do deferred instantiation of the noexcept-specifier. */ noex = tsubst_copy_and_build (DEFERRED_NOEXCEPT_PATTERN (noex), DEFERRED_NOEXCEPT_ARGS (noex), - tf_warning_or_error, fn, - /*i_c_e_p=*/true); + tf_warning_or_error, fn); /* Build up the noexcept-specification. */ spec = build_noexcept_spec (noex, tf_warning_or_error); @@ -26556,8 +26476,7 @@ instantiate_body (tree pattern, tree args, tree d, bool nested_p) else { tsubst_expr (DECL_SAVED_TREE (code_pattern), args, - tf_warning_or_error, DECL_TI_TEMPLATE (d), - /*integral_constant_expression_p=*/false); + tf_warning_or_error, DECL_TI_TEMPLATE (d)); /* Set the current input_location to the end of the function so that finish_function knows where we are. */ @@ -26798,8 +26717,7 @@ instantiate_decl (tree d, bool defer_ok, bool expl_inst_class_mem_p) push_nested_class (DECL_CONTEXT (d)); init = tsubst_expr (DECL_INITIAL (code_pattern), args, - tf_warning_or_error, NULL_TREE, - /*integral_constant_expression_p=*/false); + tf_warning_or_error, NULL_TREE); /* If instantiating the initializer involved instantiating this again, don't call cp_finish_decl twice. */ if (!DECL_INITIAL (d)) @@ -27087,8 +27005,7 @@ tsubst_initializer_list (tree t, tree argvec) tmp = init; if (init != void_type_node) init = tsubst_expr (init, argvec, - tf_warning_or_error, NULL_TREE, - /*integral_constant_expression_p=*/false); + tf_warning_or_error, NULL_TREE); if (init == NULL_TREE && tmp != NULL_TREE) /* If we had an initializer but it instantiated to nothing, value-initialize the object. This will only occur when @@ -27154,8 +27071,7 @@ tsubst_enum (tree tag, tree newtag, tree args) /* Note that in a template enum, the TREE_VALUE is the CONST_DECL, not the corresponding INTEGER_CST. */ value = tsubst_expr (DECL_INITIAL (decl), - args, tf_warning_or_error, NULL_TREE, - /*integral_constant_expression_p=*/true); + args, tf_warning_or_error, NULL_TREE); /* Give this enumeration constant the correct access. */ set_current_access_from_decl (decl); diff --git a/gcc/objcp/objcp-lang.cc b/gcc/objcp/objcp-lang.cc index 5f0e22942b8..fa754028773 100644 --- a/gcc/objcp/objcp-lang.cc +++ b/gcc/objcp/objcp-lang.cc @@ -54,8 +54,7 @@ objcp_tsubst_copy_and_build (tree t, tree args, tsubst_flags_t complain, tree in_decl) { #define RECURSE(NODE) \ - tsubst_copy_and_build (NODE, args, complain, in_decl, \ - /*integral_constant_expression_p=*/false) + tsubst_copy_and_build (NODE, args, complain, in_decl) /* The following two can only occur in Objective-C++. */ diff --git a/gcc/testsuite/g++.dg/template/crash55.C b/gcc/testsuite/g++.dg/template/crash55.C index 5416e32cacb..8a7fc112c19 100644 --- a/gcc/testsuite/g++.dg/template/crash55.C +++ b/gcc/testsuite/g++.dg/template/crash55.C @@ -1,7 +1,6 @@ //PR c++/27668 template // { dg-error "nested-name-specifier|two or more|class type|incomplete" } -// { dg-error "cast" "" { target c++98_only } .-1 } struct A {}; -template void foo(A); // { dg-error "template argument 2" "" { target c++98_only } } +template void foo(A); diff --git a/gcc/testsuite/g++.dg/template/ref3.C b/gcc/testsuite/g++.dg/template/ref3.C index 91e3c93a35d..976c093a15b 100644 --- a/gcc/testsuite/g++.dg/template/ref3.C +++ b/gcc/testsuite/g++.dg/template/ref3.C @@ -5,8 +5,7 @@ template struct A {}; template struct B { A<(T)0> b; // { dg-error "constant|not a valid" } - A a; // { dg-error "constant|not a valid" "" { xfail c++98_only } } - // PR c++/68699 + A a; // { dg-error "constant|not a valid" } }; B b;