From patchwork Thu Jul 21 21:20:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Li, Pan2 via Gcc-patches" X-Patchwork-Id: 110 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:e252:0:0:0:0:0 with SMTP id bl18csp1646291wrb; Thu, 21 Jul 2022 14:21:53 -0700 (PDT) X-Google-Smtp-Source: AGRyM1ucPOVeX2/N7FgT5CRzhZjahB5gCWc3ygS67rP9USFKjHp3rTxsOB5jsA0gqeqNHcX5g+fy X-Received: by 2002:a05:6402:3586:b0:43b:c804:92c2 with SMTP id y6-20020a056402358600b0043bc80492c2mr311513edc.117.1658438513599; Thu, 21 Jul 2022 14:21:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658438513; cv=none; d=google.com; s=arc-20160816; b=hQoYLyTYFJ5NsQJLITqT5w3KWUCEg3K3kFPnRXbBrRGXMtO1X0Yw5CSBm9xgZNuT55 VvqXaRmYqnv/UQFRr1KVYIRrS+c0x8+akhRgd/lzmRgCZGUn+PZ0allCL8zM/woCrpkE 50DTIiEjwsNfdlEle2sRV0DnOYJwrRjk0143i9qqxvcVnNHuMnXYflUMquVbLtA+dwaK wFEJsIkHfwpbl1kvO59ddsC9bgYTh0ANYS8RJBvniOaqJtSz3Yk/mCuZZy0sMUXWvRym EZ2+JspbMJtuP+B6s8QSI0KtKm78ePuWKvNSuIkrzfILifMOcNodW2crC4FABuzXmx+h caEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-transfer-encoding:mime-version:message-id:date:subject:to :dmarc-filter:delivered-to:dkim-signature:dkim-filter; bh=GiIVaqidxTzdb25zqf2LmnLsgiXFvGHqG6Tb5A2PsbI=; b=nBGTG5eIdVozQXWMkQrFyXEFPEJTEEjxwxFSNiyNzZEt1M9W2BfVfjCsEEbBL/3H45 EUb9qFgCDdy3OQfrbuh7B+7RBpiVgopiaU9OC3r6Z+TIXwa/WfNUtw7t+wkR85P4YIv7 nZfT5NeeB3EvW1sVNTwXNM8e/RrbS/MAmawMFmG5qwpF+tir5wS+zspcAdGWOBv29S5h k8IaspyEo55qVrTxOi/93FN+F3GpPTP6pH8QQGT4Lx306fwQA14Q5RV3106yIrdt/KRi tm0j65QrZD3T/NbWnL0J6dbztG2MVG88u7e+a9DfXnralabNT6YPl9uetEIxmMzNlHrc F/BQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=SUU1Fvwy; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id nb10-20020a1709071c8a00b006fe9db42071si4154177ejc.720.2022.07.21.14.21.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Jul 2022 14:21:53 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=SUU1Fvwy; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 36AA03834E50 for ; Thu, 21 Jul 2022 21:21:41 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 36AA03834E50 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1658438501; bh=GiIVaqidxTzdb25zqf2LmnLsgiXFvGHqG6Tb5A2PsbI=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=SUU1FvwyMoleHhW6d03u/iGGNk0qroK0zk2HWmQz+cYlvZIABLoaRs3bDht2J7pQs rI5R51ezo1utlhnPiHFdNZsIIbhdfoXAdzsMmTxGrinU4b6L72VVceBzA6jI9hlioo nMwnD/6RRK1fPTx34CWp93VrL7OiU0tDIBAMUX+E= 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.133.124]) by sourceware.org (Postfix) with ESMTPS id 543703835839 for ; Thu, 21 Jul 2022 21:20:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 543703835839 Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-570-ZaxO86bGPRaAGHwxfg9Zlw-1; Thu, 21 Jul 2022 17:20:55 -0400 X-MC-Unique: ZaxO86bGPRaAGHwxfg9Zlw-1 Received: by mail-qk1-f199.google.com with SMTP id t203-20020a3746d4000000b006af1d3e8068so2270848qka.0 for ; Thu, 21 Jul 2022 14:20:55 -0700 (PDT) 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=GiIVaqidxTzdb25zqf2LmnLsgiXFvGHqG6Tb5A2PsbI=; b=A3g74BnvemNL3XmOzZTboTzaGeFrZ+fHz7j3wKV7to7T042lXyiYwMhBXzCzejkRzt ONo7ueRYbJ9U3A7M2vpptcb8EUvtUK9iyEmPHUf7YgDCUGr22VQQcDnVlYcl1cGWXHKp 7aVcLVHw2WFGz1TO/edRf7yf27UW6GCdqfx5Lm/KH3BG/01AJ4Jeck0qVnwvccxkYTWi h9QMio7LqmAc4PviYHg9SnMdcfBQsg6yxuBJ1qx8TAxIAjqrRc0j0b94lHBAQ9Uh1dcx gmzXkFmL+FVL6fC1laOt6GHUDppC7wbGdjmlD72kbiDCLWXTPWYWa3XB7U/tZcn8QbEb CMhA== X-Gm-Message-State: AJIora8sB1oTFxjiJV+e9cjXZGnDs01FV+Y7JbdmZS3VzVSVnkAM/qkI ScTXUXw+GolsbHC1b3QW/Occb75f8rqREWz+ReTFhXtWwONxf/PkqnZslAOXB+SM0SlygiYi58D xJBDgAAzmokij44Fuwr4FtorICEajlEDJIxMpoxz2iLNQqTcMflsku7op2oxsc8TTnA== X-Received: by 2002:a37:9284:0:b0:6b5:ccf5:b016 with SMTP id u126-20020a379284000000b006b5ccf5b016mr325073qkd.241.1658438455144; Thu, 21 Jul 2022 14:20:55 -0700 (PDT) X-Received: by 2002:a37:9284:0:b0:6b5:ccf5:b016 with SMTP id u126-20020a379284000000b006b5ccf5b016mr325048qkd.241.1658438454674; Thu, 21 Jul 2022 14:20:54 -0700 (PDT) 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 x27-20020a05620a0b5b00b006b5e43466ebsm1973476qkg.59.2022.07.21.14.20.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Jul 2022 14:20:54 -0700 (PDT) To: gcc-patches@gcc.gnu.org Subject: [pushed] c++: defaulted ctor with DMI in union [PR94823] Date: Thu, 21 Jul 2022 17:20:52 -0400 Message-Id: <20220721212052.467298-1-jason@redhat.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.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_NONE, 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: Jason Merrill via Gcc-patches From: "Li, Pan2 via Gcc-patches" Reply-To: Jason Merrill Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1738998822857240580?= X-GMAIL-MSGID: =?utf-8?q?1738998822857240580?= CWG2084 clarifies that a variant member with a non-trivial constructor does not make the union's defaulted default constructor deleted if another variant member has a default member initializer. Tested x86_64-pc-linux-gnu, applying to trunk. DR 2084 PR c++/94823 gcc/cp/ChangeLog: * method.cc (walk_field_subobs): Fix DMI in union case. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/nsdmi-union7.C: New test. --- gcc/cp/method.cc | 35 ++++++++++++++++++++--- gcc/testsuite/g++.dg/cpp0x/nsdmi-union7.C | 13 +++++++++ 2 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/nsdmi-union7.C base-commit: f4ed610d02aaf8cfcdcb5cf03e0cde65f1f5f890 diff --git a/gcc/cp/method.cc b/gcc/cp/method.cc index f2050f6e970..573ef016f82 100644 --- a/gcc/cp/method.cc +++ b/gcc/cp/method.cc @@ -2315,8 +2315,19 @@ walk_field_subobs (tree fields, special_function_kind sfk, tree fnname, bool diag, int flags, tsubst_flags_t complain, bool dtor_from_ctor) { - tree field; - for (field = fields; field; field = DECL_CHAIN (field)) + if (!fields) + return; + + tree ctx = DECL_CONTEXT (fields); + + /* CWG2084: A defaulted default ctor for a union with a DMI only initializes + that member, so don't check other members. */ + enum { unknown, no, yes } + only_dmi_mem = (sfk == sfk_constructor && TREE_CODE (ctx) == UNION_TYPE + ? unknown : no); + + again: + for (tree field = fields; field; field = DECL_CHAIN (field)) { tree mem_type, argtype, rval; @@ -2331,9 +2342,18 @@ walk_field_subobs (tree fields, special_function_kind sfk, tree fnname, asking if this is deleted, don't even look up the function; we don't want an error about a deleted function we aren't actually calling. */ if (sfk == sfk_destructor && deleted_p == NULL - && TREE_CODE (DECL_CONTEXT (field)) == UNION_TYPE) + && TREE_CODE (ctx) == UNION_TYPE) break; + if (only_dmi_mem != no) + { + if (DECL_INITIAL (field)) + only_dmi_mem = yes; + else + /* Don't check this until we know there's no DMI. */ + continue; + } + mem_type = strip_array_types (TREE_TYPE (field)); if (SFK_ASSIGN_P (sfk)) { @@ -2416,7 +2436,7 @@ walk_field_subobs (tree fields, special_function_kind sfk, tree fnname, if (constexpr_p && cxx_dialect < cxx20 && !CLASS_TYPE_P (mem_type) - && TREE_CODE (DECL_CONTEXT (field)) != UNION_TYPE) + && TREE_CODE (ctx) != UNION_TYPE) { *constexpr_p = false; if (diag) @@ -2465,6 +2485,13 @@ walk_field_subobs (tree fields, special_function_kind sfk, tree fnname, process_subob_fn (rval, sfk, spec_p, trivial_p, deleted_p, constexpr_p, diag, field, dtor_from_ctor); } + + /* We didn't find a DMI in this union, now check all the members. */ + if (only_dmi_mem == unknown) + { + only_dmi_mem = no; + goto again; + } } /* Base walker helper for synthesized_method_walk. Inspect a direct diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-union7.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-union7.C new file mode 100644 index 00000000000..c840ddf5fbc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-union7.C @@ -0,0 +1,13 @@ +// PR c++/94823 +// { dg-do compile { target c++11 } } + +struct A{ + A(){} +}; +union C{ + A a; + int b = 0; +}; +int main(){ + C c; +}