From patchwork Thu Feb 23 23:51:33 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Polacek X-Patchwork-Id: 61091 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp601013wrd; Thu, 23 Feb 2023 15:52:27 -0800 (PST) X-Google-Smtp-Source: AK7set9kPL71gKaxG4SLC06iDwn3Glp1Zi+1n5Iu+YKATIhDytlYmSsE7z5yQIhX2SK7LnyEIdJd X-Received: by 2002:a17:906:6885:b0:878:545b:e540 with SMTP id n5-20020a170906688500b00878545be540mr22156958ejr.51.1677196347783; Thu, 23 Feb 2023 15:52:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677196347; cv=none; d=google.com; s=arc-20160816; b=mb2Z2Gcjm1VkkQnC45EI9izsQNWKnviSsAqaqmxUasyc2DTfX6DtfI++QUVXw/WOiZ mhefmhW73eqlOXXJq12ub7BF7Lbdx2upRB3X2ycKaiPDbOn4MgX4wDpRlf4ZJwUJnSa3 MKu1oYiuLUDIgRXDAmC53EljhGzQXHdOFhrqrlTj765z3+qTDnAdg1vnYlkYETEe0+1t TwKeg7ch/8C8LarB9MhDrMhukV2hWsHl/97gApviBpBYgXQFABp7wnEz7xZLSeYDh2ta W4XeWyyqno66T/RMk+7YIyK5f6Skh6/gRNF2oBJCk81eft1vcHvXMBTn51J47mlDStOy La0g== 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=qkXwmEc2iBhsHbnQmA1y4fZaD3yVi6TpjgAajCketA0=; b=lsVyqwPYjXemi5fDTYNGdWgKRGu15ukTq4bTjq2cOtuCSnIyeZnM9n4t+MVAdj5X6j epntimkPH0P1tbAwzDUz2q+B7lU6zX7EYrxh0To9Pgg+cUNl0QmoGDAUMJWNp9d+WsNz HHbO5lLijl7E/a4uDXjvrc+wzHo4GDKpZOZxVdsUuFVqeXf6hRH9XqSuUAB0PGzZlXi7 jcDX4WDOiA55HDNRBNKmG81D7iJoU8o2X1MtqyYu2VHgNj+vx8A3XyKv+zFtyv2luIpQ MH9uoB3CvxfXLLFAugQw2yw6x/piI1Au+Yit0Bx39fswy2wj/Z8BY/V77jnKE9eVwUVB kCcg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=fGYXArDL; 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=gnu.org Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id wj18-20020a170907051200b008bedefb0986si19208625ejb.599.2023.02.23.15.52.27 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Feb 2023 15:52:27 -0800 (PST) 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=@gcc.gnu.org header.s=default header.b=fGYXArDL; 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=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C8932385B50C for ; Thu, 23 Feb 2023 23:52:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C8932385B50C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1677196346; bh=qkXwmEc2iBhsHbnQmA1y4fZaD3yVi6TpjgAajCketA0=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=fGYXArDL0HGtWTRMgzimhJ84b1Qu04y4bGMtV8lIX9dgKJwtDjHwniv4eQBUleN4a qpr7617TRA8WrJ1ILCriPqGHyRn1OMwwWy1TFnLyWZpBEbqhFnXmj9clEYaOZT2MNB 86M6NN004jESi8Zg1Wa1mAGmB+Dmsh3DGjR7SLp0= 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 EE3493858C00 for ; Thu, 23 Feb 2023 23:51:38 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org EE3493858C00 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-657-cE4FmtbmM4a4V6YYY4vHlQ-1; Thu, 23 Feb 2023 18:51:37 -0500 X-MC-Unique: cE4FmtbmM4a4V6YYY4vHlQ-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 1BBB8811E9C for ; Thu, 23 Feb 2023 23:51:37 +0000 (UTC) Received: from pdp-11.redhat.com (unknown [10.22.34.4]) by smtp.corp.redhat.com (Postfix) with ESMTP id F31BE2166B29; Thu, 23 Feb 2023 23:51:36 +0000 (UTC) To: Jason Merrill , GCC Patches Subject: [PATCH] c++: ICE with constexpr variable template [PR107938] Date: Thu, 23 Feb 2023 18:51:33 -0500 Message-Id: <20230223235133.140864-1-polacek@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.1 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_H2, 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: Marek Polacek via Gcc-patches From: Marek Polacek Reply-To: Marek Polacek 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?1758667837617451392?= X-GMAIL-MSGID: =?utf-8?q?1758667837617451392?= Since r11-557, cp_finish_decl can call check_initializer even in a template for a constexpr initializer. That ultimately leads to convert_for_assignment and check_address_or_pointer_of_packed_member, where we crash, because it doesn't expect that the CALL_EXPR is a function object. Q has a constexpr operator(), but since we're in a template, q(0) is a CALL_EXPR whose CALL_EXPR_FN is just a VAR_DECL; it hasn't been converted to Q::operator(&q, 0) yet. I propose to robustify check_address_or_pointer_of_packed_member. var-templ74.C has an XFAIL, subject to 107939. I noticed that our -Waddress-of-packed-member tests weren't testing member functions, added thus. (I was tempted to check FUNCTION_POINTER_TYPE_P but that doesn't include METHOD_TYPE.) Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/12? PR c++/107938 gcc/c-family/ChangeLog: * c-warn.cc (check_address_or_pointer_of_packed_member): Check POINTER_TYPE_P. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/var-templ73.C: New test. * g++.dg/cpp1y/var-templ74.C: New test. * g++.dg/warn/Waddress-of-packed-member3.C: New test. --- gcc/c-family/c-warn.cc | 4 ++++ gcc/testsuite/g++.dg/cpp1y/var-templ73.C | 12 ++++++++++ gcc/testsuite/g++.dg/cpp1y/var-templ74.C | 19 +++++++++++++++ .../g++.dg/warn/Waddress-of-packed-member3.C | 23 +++++++++++++++++++ 4 files changed, 58 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp1y/var-templ73.C create mode 100644 gcc/testsuite/g++.dg/cpp1y/var-templ74.C create mode 100644 gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C base-commit: f33d7a88d069d169bbe76da8e5c52de17f68ca05 diff --git a/gcc/c-family/c-warn.cc b/gcc/c-family/c-warn.cc index a6fb95b1e80..29ae1ea1dc8 100644 --- a/gcc/c-family/c-warn.cc +++ b/gcc/c-family/c-warn.cc @@ -3000,6 +3000,10 @@ check_address_or_pointer_of_packed_member (tree type, tree rhs) if (rhs == NULL_TREE) return NULL_TREE; rhs = TREE_TYPE (rhs); /* Pointer type. */ + /* We could be called while processing a template and RHS could be + a functor. In that case it's a class, not a pointer. */ + if (!POINTER_TYPE_P (rhs)) + return NULL_TREE; rhs = TREE_TYPE (rhs); /* Function type. */ rhstype = TREE_TYPE (rhs); if (!rhstype || !POINTER_TYPE_P (rhstype)) diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ73.C b/gcc/testsuite/g++.dg/cpp1y/var-templ73.C new file mode 100644 index 00000000000..b76babcfa81 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/var-templ73.C @@ -0,0 +1,12 @@ +// PR c++/107938 +// { dg-do compile { target c++14 } } + +struct Q { + int n; + constexpr const Q* operator()(int) const { return this; } +}; + +constexpr Q q{}; + +template +constexpr const Q* p = q(0); diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ74.C b/gcc/testsuite/g++.dg/cpp1y/var-templ74.C new file mode 100644 index 00000000000..4e2e800a6eb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/var-templ74.C @@ -0,0 +1,19 @@ +// PR c++/107938 +// { dg-do compile { target c++14 } } + +struct Q { + int n; + constexpr const Q* operator()(int) const { return this; } +}; + +extern const Q q; + +template +constexpr const Q* p = q(0); // { dg-bogus "not usable" "PR107939" { xfail *-*-* } } + +void +g () +{ + constexpr const Q* p2 = q(0); + constexpr auto x = p<0>; +} diff --git a/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C b/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C new file mode 100644 index 00000000000..aeffb969c01 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C @@ -0,0 +1,23 @@ +// { dg-do compile { target { ! default_packed } } } +// Test that -Waddress-of-packed-member works with member functions. + +struct S { + char c; +} __attribute__((packed)); + +struct X { + S* memfn (); + static S* smemfn (); +} x; + +S *foo (); + +S** +f () +{ + S **s; + s = reinterpret_cast(foo ()); // { dg-warning "converting a packed" } + s = reinterpret_cast(x.memfn ()); // { dg-warning "converting a packed" } + s = reinterpret_cast(X::smemfn ()); // { dg-warning "converting a packed" } + return s; +}