From patchwork Wed Mar 10 03:22:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Polacek X-Patchwork-Id: 1450283 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=o6+/ywW/; dkim-atps=neutral Received: from sourceware.org (unknown [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DwHSp1mB9z9sSC for ; Wed, 10 Mar 2021 14:22:32 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D95C73858012; Wed, 10 Mar 2021 03:22:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D95C73858012 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1615346548; bh=i9ZGIXlr4rexJi7mSbCeIz5dpL8iH5R9YYGFU7w9Xc0=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=o6+/ywW/K52WZ/XSkeGUAaVsh8mSX/Z5uh6/mTyS7FWe6dOJ4b/EBXf5ypTwVKTa3 iv4wOzpt2+Dbdxq1DvBg4PfXd0Ku8ZzVhsrUba8vAXa1l4YkNT0VCgGlgher4uRRpZ shvUYG10wSJ44XdRLYZt5LDJAs1a4YNNEe7U+qCQ= 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 [63.128.21.124]) by sourceware.org (Postfix) with ESMTP id 44739385800D for ; Wed, 10 Mar 2021 03:22:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 44739385800D Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-406-HQ3wX-ZQNuahCY7Zr3bLiQ-1; Tue, 09 Mar 2021 22:22:23 -0500 X-MC-Unique: HQ3wX-ZQNuahCY7Zr3bLiQ-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 217BE801817 for ; Wed, 10 Mar 2021 03:22:22 +0000 (UTC) Received: from pdp-11.hsd1.ma.comcast.net (ovpn-117-161.rdu2.redhat.com [10.10.117.161]) by smtp.corp.redhat.com (Postfix) with ESMTP id CA705690F9; Wed, 10 Mar 2021 03:22:21 +0000 (UTC) To: GCC Patches , Jason Merrill Subject: [PATCH] c++: Fix bogus warning in deprecated namespace [PR99318] Date: Tue, 9 Mar 2021 22:22:11 -0500 Message-Id: <20210310032211.1265956-1-polacek@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-14.6 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_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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@gcc.gnu.org Sender: "Gcc-patches" In GCC 10, I introduced cp_warn_deprecated_use_scopes so that we can handle attribute deprecated on a namespace declaration. This function walks the decl's contexts so that we warn for code like namespace [[deprecated]] N { struct S { }; } N::S s; We call cp_warn_deprecated_use_scopes when we encounter a TYPE_DECL. But in the following testcase we have a TYPE_DECL whose context is a deprecated function; that itself is not a reason to warn. This patch limits for which entities we call cp_warn_deprecated_use; essentially it's what can follow ::. I noticed that we didn't test that struct [[deprecated]] S { static void fn(); }; S::fn(); produces the expected warning, so I've added gen-attrs-73.C. Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/10? gcc/cp/ChangeLog: PR c++/99318 * decl2.c (cp_warn_deprecated_use_scopes): Only call cp_warn_deprecated_use when decl is a namespace, class, or enum. gcc/testsuite/ChangeLog: PR c++/99318 * g++.dg/cpp0x/attributes-namespace6.C: New test. * g++.dg/cpp0x/gen-attrs-73.C: New test. --- gcc/cp/decl2.c | 3 ++- .../g++.dg/cpp0x/attributes-namespace6.C | 21 +++++++++++++++++++ gcc/testsuite/g++.dg/cpp0x/gen-attrs-73.C | 20 ++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/attributes-namespace6.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/gen-attrs-73.C base-commit: 63d74fed4566f1de583c368ecb9e2fc423fb1c87 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index c46100de89a..ef79f6cc6d1 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -5529,7 +5529,8 @@ cp_warn_deprecated_use_scopes (tree scope) && scope != error_mark_node && scope != global_namespace) { - if (cp_warn_deprecated_use (scope)) + if ((TREE_CODE (scope) == NAMESPACE_DECL || OVERLOAD_TYPE_P (scope)) + && cp_warn_deprecated_use (scope)) return; if (TYPE_P (scope)) scope = CP_TYPE_CONTEXT (scope); diff --git a/gcc/testsuite/g++.dg/cpp0x/attributes-namespace6.C b/gcc/testsuite/g++.dg/cpp0x/attributes-namespace6.C new file mode 100644 index 00000000000..2fbc8e1158f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/attributes-namespace6.C @@ -0,0 +1,21 @@ +// PR c++/99318 +// { dg-do compile { target c++11 } } + +template +struct S { + [[deprecated("foo")]] unsigned m_fn (char const chr) + { + using index_t = unsigned; + return T::arr[static_cast(chr)]; // { dg-bogus "deprecated" } + } +}; + +extern unsigned int arr[]; + +struct R { + [[deprecated("foo")]] unsigned m_fn (char const chr) + { + using index_t = unsigned; + return arr[static_cast(chr)]; // { dg-bogus "deprecated" } + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-73.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-73.C new file mode 100644 index 00000000000..75f4077af7b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-73.C @@ -0,0 +1,20 @@ +// { dg-do compile { target c++11 } } +// Test attribute deprecated on :: with class, enum, and namespace. + +struct [[deprecated]] S { static void fn(); static const int s = 0; }; +union [[deprecated]] U { static void fn(); static const int u = 0; }; +enum [[deprecated]] E { X }; +enum class [[deprecated]] SE { Y }; +namespace [[deprecated]] N { struct S { }; } + +void +g () +{ + S::fn(); // { dg-warning "deprecated" } + (void) S::s; // { dg-warning "deprecated" } + U::fn(); // { dg-warning "deprecated" } + (void) U::u; // { dg-warning "deprecated" } + (void) E::X; // { dg-warning "deprecated" } + (void) SE::Y; // { dg-warning "deprecated" } + N::S s; // { dg-warning "deprecated" } +}