Avoid duplicate diagnostic in g++.dg/warn/Wuse-after-free3.C

Message ID 20230315135358.3DE153858017@sourceware.org
State Accepted
Headers
Series Avoid duplicate diagnostic in g++.dg/warn/Wuse-after-free3.C |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Richard Biener March 15, 2023, 1:53 p.m. UTC
  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.

Bootstrap and regtest running on x86_64-unknown-linux-gnu, I'm
going to push this if it succeeds.

Richard.

	* 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.
---
 gcc/gimple-ssa-warn-access.cc                | 4 ++++
 gcc/testsuite/g++.dg/warn/Wuse-after-free3.C | 3 +--
 2 files changed, 5 insertions(+), 2 deletions(-)
  

Patch

diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc
index ed5499ca7fb..88d44690ade 100644
--- a/gcc/gimple-ssa-warn-access.cc
+++ b/gcc/gimple-ssa-warn-access.cc
@@ -4189,6 +4189,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 1862ac8b09d..e5b157865bf 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" }
+}