diff options
author | Marek Polacek <polacek@redhat.com> | 2021-03-09 19:23:48 -0500 |
---|---|---|
committer | Marek Polacek <polacek@redhat.com> | 2021-03-23 10:54:27 -0400 |
commit | 831f9f768eb1fbf9a31d9a89591188b1487b6376 (patch) | |
tree | f669472b52c00bfee13bbfde872162e30f0a9e94 /gcc/cp/decl2.c | |
parent | 212f4988f37ccf788c8c72b1dc952980bc9be3b7 (diff) | |
download | gcc-831f9f768eb1fbf9a31d9a89591188b1487b6376.zip gcc-831f9f768eb1fbf9a31d9a89591188b1487b6376.tar.gz gcc-831f9f768eb1fbf9a31d9a89591188b1487b6376.tar.bz2 |
c++: Fix bogus warning in deprecated namespace [PR99318]
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.
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.
Diffstat (limited to 'gcc/cp/decl2.c')
-rw-r--r-- | gcc/cp/decl2.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index c46100d..ef79f6c 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); |