aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2023-03-15 14:48:57 +0100
committerRichard Biener <rguenther@suse.de>2023-03-15 15:30:49 +0100
commitdc35778a4be9dc4b936b8f0943ce04fb5f5ce810 (patch)
tree9102444cb84bc91bfadeba0563b17a1bf44b509f
parent40c1352c5a4530350012d6a922435cf491663daa (diff)
downloadgcc-dc35778a4be9dc4b936b8f0943ce04fb5f5ce810.zip
gcc-dc35778a4be9dc4b936b8f0943ce04fb5f5ce810.tar.gz
gcc-dc35778a4be9dc4b936b8f0943ce04fb5f5ce810.tar.bz2
Avoid duplicate diagnostic in g++.dg/warn/Wuse-after-free3.C
We are diagnosing operator delete (this_3(D)); A::f (this_3(D)); *this_3(D) ={v} CLOBBER; where the CLOBBER appears at the end of the DTOR for C++11 and later. The following avoids this by simply never diagnosing clobbers as use-after-free. * gimple-ssa-warn-access.cc (pass_waccess::check_pointer_uses): Do not diagnose clobbers. * g++.dg/warn/Wuse-after-free3.C: Remove expected duplicate diagnostic.
-rw-r--r--gcc/gimple-ssa-warn-access.cc4
-rw-r--r--gcc/testsuite/g++.dg/warn/Wuse-after-free3.C3
2 files changed, 5 insertions, 2 deletions
diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc
index 8b1c1cc..019c110 100644
--- a/gcc/gimple-ssa-warn-access.cc
+++ b/gcc/gimple-ssa-warn-access.cc
@@ -4194,6 +4194,10 @@ pass_waccess::check_pointer_uses (gimple *stmt, tree ptr,
if (use_stmt == stmt || is_gimple_debug (use_stmt))
continue;
+ /* A clobber isn't a use. */
+ if (gimple_clobber_p (use_stmt))
+ continue;
+
if (realloc_lhs)
{
/* Check to see if USE_STMT is a mismatched deallocation
diff --git a/gcc/testsuite/g++.dg/warn/Wuse-after-free3.C b/gcc/testsuite/g++.dg/warn/Wuse-after-free3.C
index 1862ac8..e5b1578 100644
--- a/gcc/testsuite/g++.dg/warn/Wuse-after-free3.C
+++ b/gcc/testsuite/g++.dg/warn/Wuse-after-free3.C
@@ -1,7 +1,6 @@
// PR target/104213
// { dg-do compile }
// { dg-options "-Wuse-after-free" }
-// FIXME: We should not output the warning twice.
struct A
{
@@ -13,4 +12,4 @@ A::~A ()
{
operator delete (this);
f (); // { dg-warning "used after" }
-} // { dg-warning "used after" }
+}