From patchwork Mon Nov 15 07:50:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 47649 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 DD2C23858431 for ; Mon, 15 Nov 2021 07:50:49 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DD2C23858431 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1636962649; bh=p4ul0oCTkIZM91MwadVjdxbzkyEaVWRsQ9s6krMqKU8=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=OhqNOVGij3OzomEkAZJCVJ/M1Ns0EnJVy5+84+9xCbVMn2NJIkUBDgKCr6aGeMwm8 vlQpASy/QbI/cC6Ab9FHg7ZaqAufIMveU90t8WGeRQbra44FziLN8cxB77awPUa6iM wmdXPuT4F0R+YgUErenNsHmNIdQNMtX09U5hZtwM= 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 7456E3858403 for ; Mon, 15 Nov 2021 07:50:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7456E3858403 Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-5-GBgPEdkXPZeXp3voYL3cog-1; Mon, 15 Nov 2021 02:50:17 -0500 X-MC-Unique: GBgPEdkXPZeXp3voYL3cog-1 Received: by mail-qk1-f197.google.com with SMTP id bj10-20020a05620a190a00b004681da13edcso5289283qkb.1 for ; Sun, 14 Nov 2021 23:50:17 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=p4ul0oCTkIZM91MwadVjdxbzkyEaVWRsQ9s6krMqKU8=; b=v4i5XdUYEsLDJp7fmaUd6Lq1JH717ClEQceGy5DnpJNWNDh4gRP65Lky6aIYe67I0v m9/mA2mOAnXl1xMDohUcF32w23jWgKfSNx9QB1pCv1HVpToVbRqAIyAb6tiIP/hvl8x4 Sh00SVmU8WtUxBUbKlSOFSuBTO+/a9TFgx6rAZ58CHyZKdgBPPk8E8+Yi26utKmDlCBP NLyBuEnGguZUqBq52V7gCmrlw/xcsVohEQ1wXYOJ39xBXeF8IyTEG9LYZrdmzUPs2dtY e6KZ18FVkB4cThj0JaZBde7C1+2AJAe6FoWZxfX21HSjVfBUF2kEQHpzv9hoK9WT8df2 tOZQ== X-Gm-Message-State: AOAM533D+LOVkJLYqkLqFQp6MYgnv45XdV8DEDdpO19M/hF7qcHxge0X tmxdUgVxTRq6w/GlThUewCJS8VxSvPeiLAWx6qMoFvotdlTKGNDIZHNAGteS0vIndD9+LiBVCfK wmjg54KuoxW6w9lL9IAKgIkZSHCcAWrkExYDjEU/FNyl2ZGYTsrTK2rQ9EqAV/gSiBQ== X-Received: by 2002:a05:622a:15cb:: with SMTP id d11mr39637860qty.4.1636962616906; Sun, 14 Nov 2021 23:50:16 -0800 (PST) X-Google-Smtp-Source: ABdhPJxmeznHHZwixiSKYJOeqXsJIaN0mUCrB04bbrQbDJeud6WpaCYxRENuSBkL+XRRiQ6Wo2yPHw== X-Received: by 2002:a05:622a:15cb:: with SMTP id d11mr39637838qty.4.1636962616550; Sun, 14 Nov 2021 23:50:16 -0800 (PST) Received: from barrymore.redhat.com (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id h11sm6682452qkp.46.2021.11.14.23.50.15 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 14 Nov 2021 23:50:15 -0800 (PST) To: gcc-patches@gcc.gnu.org Subject: [pushed] c++: c++20 constexpr default ctor and array init Date: Mon, 15 Nov 2021 02:50:13 -0500 Message-Id: <20211115075013.3354889-1-jason@redhat.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.4 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_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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: Jason Merrill via Gcc-patches From: Jason Merrill Reply-To: Jason Merrill Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" The implicit constexpr patch revealed that marking the constructor in the PR70690 testcase as constexpr made the bug reappear, because build_vec_init assumed that a constexpr default constructor initialized the whole object, so it was equivalent to value-initialization. But this is no longer true in C++20. Tested x86_64-pc-linux-gnu, applying to trunk. PR c++/70690 gcc/cp/ChangeLog: * init.c (build_vec_init): Check default_init_uninitialized_part in C++20. gcc/testsuite/ChangeLog: * g++.dg/init/array41a.C: New test. --- gcc/cp/init.c | 7 +++++-- gcc/testsuite/g++.dg/init/array41a.C | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/init/array41a.C base-commit: 4df7f8c79835d56928f51f9e674d326300936e8e diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 771a19bc402..3ba2e3bbe04 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -4470,11 +4470,14 @@ build_vec_init (tree base, tree maxindex, tree init, We do need to keep going if we're copying an array. */ - if (try_const && !init) + if (try_const && !init + && (cxx_dialect < cxx20 + || !default_init_uninitialized_part (inner_elt_type))) /* With a constexpr default constructor, which we checked for when setting try_const above, default-initialization is equivalent to value-initialization, and build_value_init gives us something more - friendly to maybe_constant_init. */ + friendly to maybe_constant_init. Except in C++20 and up a constexpr + constructor need not initialize all the members. */ explicit_value_init_p = true; if (from_array || ((type_build_ctor_call (type) || init || explicit_value_init_p) diff --git a/gcc/testsuite/g++.dg/init/array41a.C b/gcc/testsuite/g++.dg/init/array41a.C new file mode 100644 index 00000000000..aa9fdc629f2 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array41a.C @@ -0,0 +1,27 @@ +// PR c++/70690 +// { dg-do run { target c++11 } } + +struct A { + constexpr A() {} +}; + +struct APadded : public A { + char pad[63]; +}; + +int f(); +int i = f(); +APadded cache[50]; +APadded *p = cache; + +int f() +{ + cache[0].pad[0] = 42; + return 1; +} + +int main() +{ + if (cache[0].pad[0] != 42) + __builtin_abort(); +}