From patchwork Tue Sep 19 15:28:34 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 141970 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:172:b0:3f2:4152:657d with SMTP id h50csp3479475vqi; Tue, 19 Sep 2023 08:35:08 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEfnLLbhaEFDZpzTPgd9CfEeX8DDgwVnOiEbjBxR8Kde+ubMUB/vABEY+fDPjLaKDBobXSS X-Received: by 2002:a17:907:2ceb:b0:9a1:d79a:418e with SMTP id hz11-20020a1709072ceb00b009a1d79a418emr10415763ejc.40.1695137707842; Tue, 19 Sep 2023 08:35:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695137707; cv=none; d=google.com; s=arc-20160816; b=JRi/RfQiGcmGe34r/ix1Vpu3wjIDbBKbPYccxhJZ3jLBLcyZ6xsuGf58HS0DQF73KL EuLNDlMHpaE/40d4cSvHXMRoP54qUUpyRzVEfMo4bbUl0Poe4uFwcfwzrtEG8C6zmTXb SeNxwK8sfklb+MP+1MTn2qqLKYMqfjP51E9OiRv5H/FlINWjptFBCM3oxDYzrCBcIh8h bW5LJYR/mw8HQDiGuMueh9TgXAr21tGj/Rw2dgSvj10N40KnxcEMPLbjBuQ552WKgZvm FqjBUsNrIVoFk52PDdlaaTyVrkPaqyYlQVzAZz9R1CyecYcoTJeqoKFiu1AxOdQ01ng2 E8kA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:message-id:date:subject:to:from:dkim-signature :dmarc-filter:delivered-to; bh=GV8wuTdZZ+iq4aOr6QHPEZ2e/TDo7db/tEa2uI7B41A=; fh=hPrbWPhweUx4V0GV9uXJqbyAzg2ABmTz7kczrAQqMmM=; b=paB77PTXP6ESKWoipqCrekWHVOfKBcu9+KM5xQDwl7ArZute0asrEnmbhKassNeAF+ Wbu6R3vkaOVStfYP7356vSi1eOg7H6clRX+pjUF6o+PqhvplYt7J3Imz6HGVYMlzoAwI SMaaYaTlBUd0eYHWU4UnLpYn8+gYqH1vole16gNElJ4ZVSSqaKC53QuGkKNu5jzD6Yob ETdMk4h4zCrkJ7HpEZ86AlhnAOgV96r88B67YUB+VPMnSiNFl7zgg0KYrKJ4stXhn5GH I3+2Mhk6uA5GNVA2+M4FYnNJCuLMBohDPHI2bk3RcZp7GvnhVIm+/GH0bqPxMNa2Bt+e lE4A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=EoNOfuXu; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from server2.sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id ks18-20020a170906f85200b0099bcae257e3si10048298ejb.832.2023.09.19.08.35.07 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Sep 2023 08:35:07 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=EoNOfuXu; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 927C5383741E for ; Tue, 19 Sep 2023 15:31:30 +0000 (GMT) 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 EE6EA383F5D7 for ; Tue, 19 Sep 2023 15:28:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org EE6EA383F5D7 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1695137321; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=GV8wuTdZZ+iq4aOr6QHPEZ2e/TDo7db/tEa2uI7B41A=; b=EoNOfuXuxGfwJ6/Jl8489jzLQJbP6kfECvE33ZTKKr1vBiMHfHzJy8MTFZcB7hgqQNygkq KKpHxmIIcL9Rh9oTDXLjfiHRnjUPrgfZnC3E1V6BnwDE0MaHu56ZCpVIOlQJ3vzAG48NCM +Q3iQBraxF/sxUqCqkt2PKZAv3yUsUs= 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.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-626-WdXH8xxkOaCPyeAY_RffCQ-1; Tue, 19 Sep 2023 11:28:39 -0400 X-MC-Unique: WdXH8xxkOaCPyeAY_RffCQ-1 Received: by mail-qk1-f199.google.com with SMTP id af79cd13be357-76efd8bf515so518489785a.1 for ; Tue, 19 Sep 2023 08:28:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695137318; x=1695742118; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=GV8wuTdZZ+iq4aOr6QHPEZ2e/TDo7db/tEa2uI7B41A=; b=as5lUYV28WJZekzY919Sa3bP+nIfyLwPiIVgFwhxOBVR/COw9DNCuy42ZDeAv4oK7Q R6LiQ8qZQVZVN4/sQTiagUm7A95NcJgpwS0O+i+kcC0PsbxzwH3qf/iGk8mTaUkL5h+/ M/dSt6OhZc33yj8cdQ0JVLlPAakmPvC5kW7OYIOVa8S7UigCc1f29fUOLoGKSstXw0Ax VNFrNGuxHjdoP8qrBG8l30O+nBSKeLvSAt+xgY6pqe7BrGf34gzz2fgtXL45t/lR8B9N vqwaW1tb0/1D5XuUa6x1R2Tpir3Ic1HG4VIhR2Qx5WXi8eUXJXvpjVrjAhIZg9/Wfg4y /NHg== X-Gm-Message-State: AOJu0YwZVLOjMuoAFF1tEwA1VvLLgHv9hLqIIelQmjac9JDkgLwZZyOH /5RDI5LN/0SQ+Y/8vznTBgjDAvS2EFKw1dPhEj1WfTvdUUiNzmg2IK1RL6hhUWVnJuxpfJQUjh6 nd0VAdriIg5fi87+1Co43RrM8fDm703WCnwEC5T27CIy2sQLue+DAT9bboXybPF8NEHd0aI612g == X-Received: by 2002:a05:620a:3954:b0:765:6524:8441 with SMTP id qs20-20020a05620a395400b0076565248441mr21281qkn.22.1695137318676; Tue, 19 Sep 2023 08:28:38 -0700 (PDT) X-Received: by 2002:a05:620a:3954:b0:765:6524:8441 with SMTP id qs20-20020a05620a395400b0076565248441mr21241qkn.22.1695137318242; Tue, 19 Sep 2023 08:28:38 -0700 (PDT) Received: from jason.com (130-44-146-16.s12558.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.146.16]) by smtp.gmail.com with ESMTPSA id d21-20020a05620a159500b007710052789dsm4052546qkk.94.2023.09.19.08.28.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Sep 2023 08:28:37 -0700 (PDT) From: Jason Merrill To: gcc-patches@gcc.gnu.org Subject: [pushed] c++: inherited default constructor [CWG2799] Date: Tue, 19 Sep 2023 11:28:34 -0400 Message-Id: <20230919152834.3988714-1-jason@redhat.com> X-Mailer: git-send-email 2.39.3 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-11.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_H3, RCVD_IN_MSPIKE_WL, RCVD_IN_SORBS_WEB, 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.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1777480716831607963 X-GMAIL-MSGID: 1777480716831607963 Tested x86_64-pc-linux-gnu, applying to trunk. -- 8< -- In this testcase, it seems clear that B should be trivially default-constructible, since the inherited default constructor is trivial and there are no other subobjects to initialize. But we were saying no because we don't define triviality of inherited constructors. CWG discussion suggested that the solution is to implicitly declare a default constructor when inheriting a default constructor; that makes sense to me. DR 2799 gcc/cp/ChangeLog: * class.cc (add_implicit_default_ctor): Split out... (add_implicitly_declared_members): ...from here. Also call it when inheriting a default ctor. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/inh-ctor38.C: New test. --- gcc/cp/class.cc | 36 ++++++++++++++++--------- gcc/testsuite/g++.dg/cpp0x/inh-ctor38.C | 19 +++++++++++++ 2 files changed, 43 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/inh-ctor38.C base-commit: 5c5851bd93b8078bdd9665bc9bfe91fbf0028dc1 diff --git a/gcc/cp/class.cc b/gcc/cp/class.cc index d270dcbb14c..469e98ed8b7 100644 --- a/gcc/cp/class.cc +++ b/gcc/cp/class.cc @@ -3292,6 +3292,22 @@ one_inherited_ctor (tree ctor, tree t, tree using_decl) } } +/* Implicitly declare T(). */ + +static void +add_implicit_default_ctor (tree t) +{ + TYPE_HAS_DEFAULT_CONSTRUCTOR (t) = 1; + CLASSTYPE_LAZY_DEFAULT_CTOR (t) = 1; + if (cxx_dialect >= cxx11) + TYPE_HAS_CONSTEXPR_CTOR (t) + /* Don't force the declaration to get a hard answer; if the + definition would have made the class non-literal, it will still be + non-literal because of the base or member in question, and that + gives a better diagnostic. */ + = type_maybe_constexpr_default_constructor (t); +} + /* Create default constructors, assignment operators, and so forth for the type indicated by T, if they are needed. CANT_HAVE_CONST_CTOR, and CANT_HAVE_CONST_ASSIGNMENT are nonzero if, for whatever reason, @@ -3320,17 +3336,7 @@ add_implicitly_declared_members (tree t, tree* access_decls, If there is no user-declared constructor for a class, a default constructor is implicitly declared. */ if (! TYPE_HAS_USER_CONSTRUCTOR (t)) - { - TYPE_HAS_DEFAULT_CONSTRUCTOR (t) = 1; - CLASSTYPE_LAZY_DEFAULT_CTOR (t) = 1; - if (cxx_dialect >= cxx11) - TYPE_HAS_CONSTEXPR_CTOR (t) - /* Don't force the declaration to get a hard answer; if the - definition would have made the class non-literal, it will still be - non-literal because of the base or member in question, and that - gives a better diagnostic. */ - = type_maybe_constexpr_default_constructor (t); - } + add_implicit_default_ctor (t); /* [class.ctor] @@ -3394,7 +3400,13 @@ add_implicitly_declared_members (tree t, tree* access_decls, location_t loc = input_location; input_location = DECL_SOURCE_LOCATION (using_decl); for (tree fn : ovl_range (ctor_list)) - one_inherited_ctor (fn, t, using_decl); + { + if (!TYPE_HAS_DEFAULT_CONSTRUCTOR (t) && default_ctor_p (fn)) + /* CWG2799: Inheriting a default constructor gives us a default + constructor, not just an inherited constructor. */ + add_implicit_default_ctor (t); + one_inherited_ctor (fn, t, using_decl); + } *access_decls = TREE_CHAIN (*access_decls); input_location = loc; } diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor38.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor38.C new file mode 100644 index 00000000000..56217be1aae --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor38.C @@ -0,0 +1,19 @@ +// CWG 2799 +// Test that inheriting a trivial default constructor produces a trivial +// default constructor. + +// { dg-do compile { target c++11 } } + +#include + +struct A { + A() = default; +}; + +struct B : A +{ + using A::A; + B(int); +}; + +static_assert (std::is_trivially_constructible::value, "");