From patchwork Thu Jan 20 20:24:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 50288 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 7FE71385843E for ; Thu, 20 Jan 2022 20:25:08 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7FE71385843E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1642710308; bh=wGoFt5T32FR6MKGrgW3KNzploI4twmtjix6USXjwUFI=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=DsnotGMavVvJQ5eNPwbVVHUnI9LT93xpjLeYZUzehszfP7Vdv/wpCy2F+SX92+n8L M2mxZlJFynWGNd9QFz2oVaP+pKWsBAh/SK3kUMuBMjZoqRTJEQ971owxGOLx3o7C1Z jRhoyaCQ1mp++fatDFhpfInlw1AalSsTjVmrHwv8= 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 C78673857810 for ; Thu, 20 Jan 2022 20:24:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C78673857810 Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-296-LwNpQMHsM4y4rT6aXkfFuA-1; Thu, 20 Jan 2022 15:24:32 -0500 X-MC-Unique: LwNpQMHsM4y4rT6aXkfFuA-1 Received: by mail-qv1-f71.google.com with SMTP id jq14-20020ad45fce000000b0041f389903aaso6842799qvb.18 for ; Thu, 20 Jan 2022 12:24:32 -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=wGoFt5T32FR6MKGrgW3KNzploI4twmtjix6USXjwUFI=; b=K/WJJDEE8jcfFqmwjKI8iDz3itn0WerkJ3jaHLrcWswB/K3vs0U6oYNx4ciO23VFpr t835r4IeBEou/3DcQoNEtNZMqDDGSFL7ZuFaBUePAwHxpW+gKXs8Pe7/NKvP52rOD2Al wCxIz5C+OOcXNWaThGHG4aZf2Oe9m3yDf2KGBWy18/MO/4yM5YnicDORkyvcULYPo4oa B2vC2Z3ioHyXzC6TkrUz37QPtMDEVG8gn265tK84BQPoft4aT0Iv0c+z6TLT29qI7Bn8 gjLTzH0VwtIvhDhx0gR4OetiBFlJ9BZme7qzo01YxdOn43DRG9NoyEvYn9W99vf18vSv QCtw== X-Gm-Message-State: AOAM533xgeIgxm7v4Tsd3ZsJl+wNTppl2pE1coO6y1B6koSUJtLaO/BG k6OPlvDqp/baG+dSVYjrRBA2tNZNosnZRJz+o/vn2djzEUWH/fw7s4go8H6YwTLqvSSG+AN5EiP C+xWMDKgvrNjVFMi7gNkVTPxEvXZ/rkQQWCzblJBs+KS6k7qJA9Oo5GuWfiS1ZIjZMA== X-Received: by 2002:a05:620a:15ce:: with SMTP id o14mr492609qkm.144.1642710271716; Thu, 20 Jan 2022 12:24:31 -0800 (PST) X-Google-Smtp-Source: ABdhPJz1oYUXmWUQM0t3/6VIMqXx1IF/0xEi7PiRYR3hzlZ6mqRLGTPJI8fnSVa8p/jk3j6q7Kx6Yw== X-Received: by 2002:a05:620a:15ce:: with SMTP id o14mr492547qkm.144.1642710270286; Thu, 20 Jan 2022 12:24:30 -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 k190sm1954708qkf.59.2022.01.20.12.24.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Jan 2022 12:24:29 -0800 (PST) To: gcc-patches@gcc.gnu.org Subject: [pushed] c++: designator for base class member [PR101405] Date: Thu, 20 Jan 2022 15:24:27 -0500 Message-Id: <20220120202427.420806-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_H3, 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" A C++20 designator must name a direct non-static member of the class; in this case it names a member of a base class, and we should give an error instead of crashing. Tested x86_64-pc-linux-gnu, applying to trunk. PR c++/101405 gcc/cp/ChangeLog: * decl.cc (reshape_init_class): Reject designator for a member of another class. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/desig20.C: New test. --- gcc/cp/decl.cc | 14 ++++++++++---- gcc/testsuite/g++.dg/cpp2a/desig20.C | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp2a/desig20.C base-commit: 30b38394b482ce894d9bc81731a0eea8711f4587 diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index 1cbe9a34be0..8e5421848d1 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -6569,16 +6569,22 @@ reshape_init_class (tree type, reshape_iter *d, bool first_initializer_p, tree ictx = DECL_CONTEXT (field); if (!same_type_ignoring_top_level_qualifiers_p (ictx, type)) { - gcc_assert (ANON_AGGR_TYPE_P (ictx)); /* Find the anon aggr that is a direct member of TYPE. */ - while (true) + while (ANON_AGGR_TYPE_P (ictx)) { tree cctx = TYPE_CONTEXT (ictx); if (same_type_ignoring_top_level_qualifiers_p (cctx, type)) - break; + goto found; ictx = cctx; } - /* And then the TYPE member with that anon aggr type. */ + + /* Not found, e.g. FIELD is a member of a base class. */ + if (complain & tf_error) + error ("%qD is not a direct member of %qT", field, type); + return error_mark_node; + + found: + /* Now find the TYPE member with that anon aggr type. */ tree aafield = TYPE_FIELDS (type); for (; aafield; aafield = TREE_CHAIN (aafield)) if (TREE_TYPE (aafield) == ictx) diff --git a/gcc/testsuite/g++.dg/cpp2a/desig20.C b/gcc/testsuite/g++.dg/cpp2a/desig20.C new file mode 100644 index 00000000000..0ceda7ccabd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/desig20.C @@ -0,0 +1,20 @@ +// PR c++/101405 +// { dg-do compile { target c++20 } } + +struct A { + int const a = 1; + int const b = 2; +}; + +struct B : A { + using A::a; + using A::b; + int const c = 3; + int const d = 4; +}; + +int main() +{ + [[maybe_unused]] B b = + { .a = 10, .d = 42 }; // { dg-error "not a direct member" } +}