From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id 67EE5385E447 for ; Mon, 24 May 2021 17:48:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 67EE5385E447 Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-182-KyEWwWmSOMO8Z5kYEnYOBQ-1; Mon, 24 May 2021 13:48:50 -0400 X-MC-Unique: KyEWwWmSOMO8Z5kYEnYOBQ-1 Received: by mail-qv1-f69.google.com with SMTP id l19-20020a0ce0930000b02901efdf1c21ecso25370816qvk.10 for ; Mon, 24 May 2021 10:48:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=kS3sUvvZhJlbVoe9D5glHPp/3V5ZkhDMFsCDHqlNcjU=; b=HI+1YkPPGVHDBXUeUcWJETr1ftFSs8VyKF+K2lBgrVXXjryz2ZSHOKzBWOdhYm+H4u s4MMxoXfRcBPMbqWxFRqWgwXbvmWVVDB3EqQKcBeUjufwsTHQlZKtoidN/pmRCgG9On4 HseEVeA+zC6CpNHvXeK4ReuCR2+cgvykKJ9eCbUtNuhh9RJJhh/oW1aVTlq4yBBcf1Uw f465Z85J/Y6oVrpOFc5z6xlI5CZiBnhNP70f/0l1JLUKvENis2hjDNljBgYBkznIBK0l 8aOo4JqjveI34UIyzvSq0ya08jvK8uT3snqkjRkL6V3YDz+RrAs/Nm32SI3TpfTflVMe 5k1g== X-Gm-Message-State: AOAM5335i1d0uYiYOTLrakAPZpua5i2PBCtEsxrIEhxyWL+OZcEaujWz vAVTuEq1Jbfk2vjNq66skexcU12aa2MBKqeobTG/vRfX23lqFuGHg3t2XJ3lS1+PT7VFjDXAnlI 4T3QnniqO7GU+XofUt0AFeA4ClDI2vulvCy38tTVCeAlxKONclc6dATIZA2DH56sRLmU= X-Received: by 2002:a05:620a:1201:: with SMTP id u1mr30049518qkj.80.1621878529728; Mon, 24 May 2021 10:48:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw8yK46OPwqcHBHPmfWhrwX/sAzlRx10sdQdvb7fu6f6AYiGGO0cONhEi5Sl4Fd9nCVLDAE5Q== X-Received: by 2002:a05:620a:1201:: with SMTP id u1mr30049489qkj.80.1621878529401; Mon, 24 May 2021 10:48:49 -0700 (PDT) Received: from localhost.localdomain (ool-457d493a.dyn.optonline.net. [69.125.73.58]) by smtp.gmail.com with ESMTPSA id c23sm11143409qtq.87.2021.05.24.10.48.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 May 2021 10:48:48 -0700 (PDT) From: Patrick Palka To: gcc-patches@gcc.gnu.org Subject: [PATCH] c++: constexpr and copy elision within mem init [PR100368] Date: Mon, 24 May 2021 13:48:46 -0400 Message-Id: <20210524174846.619411-1-ppalka@redhat.com> X-Mailer: git-send-email 2.32.0.rc0 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII" X-Spam-Status: No, score=-16.2 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_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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-List-Received-Date: Mon, 24 May 2021 17:48:54 -0000 In the testcase below, the initializer for C::b inside C's default constructor is encoded as a TARGET_EXPR wrapping the CALL_EXPR f() in C++17 mode. During massaging of this constexpr constructor, build_target_expr_with_type called from bot_manip ends up trying to use B's implicitly deleted copy constructor rather than preserving the copy elision. This patch makes bot_manip use force_target_expr instead of build_target_expr_with_type so that it copies TARGET_EXPRs in a more oblivious manner. Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for trunk? PR c++/100368 gcc/cp/ChangeLog: * tree.c (build_target_expr_with_type): Simplify now that bot_manip is no longer a caller. (bot_manip): Use force_target_expr instead of build_target_expr_with_type. gcc/testsuite/ChangeLog: * g++.dg/cpp1z/elide6.C: New test. --- gcc/cp/tree.c | 8 +++----- gcc/testsuite/g++.dg/cpp1z/elide6.C | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/elide6.C diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 72f498f4b3b..84b84621d35 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -848,12 +848,10 @@ build_target_expr_with_type (tree init, tree type, tsubst_flags_t complain) || init == error_mark_node) return init; else if (CLASS_TYPE_P (type) && type_has_nontrivial_copy_init (type) - && !VOID_TYPE_P (TREE_TYPE (init)) && TREE_CODE (init) != COND_EXPR && TREE_CODE (init) != CONSTRUCTOR && TREE_CODE (init) != VA_ARG_EXPR) - /* We need to build up a copy constructor call. A void initializer - means we're being called from bot_manip. COND_EXPR is a special + /* We need to build up a copy constructor call. COND_EXPR is a special case because we already have copies on the arms and we don't want another one here. A CONSTRUCTOR is aggregate initialization, which is handled separately. A VA_ARG_EXPR is magic creation of an @@ -3112,8 +3110,8 @@ bot_manip (tree* tp, int* walk_subtrees, void* data_) AGGR_INIT_ZERO_FIRST (TREE_OPERAND (u, 1)) = true; } else - u = build_target_expr_with_type (TREE_OPERAND (t, 1), TREE_TYPE (t), - tf_warning_or_error); + u = force_target_expr (TREE_TYPE (t), TREE_OPERAND (t, 1), + tf_warning_or_error); TARGET_EXPR_IMPLICIT_P (u) = TARGET_EXPR_IMPLICIT_P (t); TARGET_EXPR_LIST_INIT_P (u) = TARGET_EXPR_LIST_INIT_P (t); diff --git a/gcc/testsuite/g++.dg/cpp1z/elide6.C b/gcc/testsuite/g++.dg/cpp1z/elide6.C new file mode 100644 index 00000000000..399e1a9a1ef --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/elide6.C @@ -0,0 +1,16 @@ +// PR c++/100368 +// { dg-do compile { target c++11 } } + +struct A { + A() = default; + A(const A&) = delete; +}; + +struct B { A a; }; // { dg-error "deleted" "" { target c++14_down } } + +constexpr B f() { return {}; } + +struct C { + constexpr C() : b(f()) {} // { dg-error "deleted" "" { target c++14_down } } + B b; +}; -- 2.32.0.rc0