[gcc r15-11389] Make -Wuse-after-free alias for -Wuse-after-free=1 [PR124058]

Torbjorn Svensson via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:0a93e3b70f1f69aff67ec7e40f987f3cfaac458e

commit r15-11389-g0a93e3b70f1f69aff67ec7e40f987f3cfaac458e
Author: Torbjörn SVENSSON <[email protected]>
Date:   Sun Jul 12 20:42:55 2026 +0200

    Make -Wuse-after-free alias for -Wuse-after-free=1 [PR124058]
    
    GCC currently treats -Wuse-after-free and -Wuse-after-free= as separate
    options internally, with OPT_Wuse_after_free for no argument and
    OPT_Wuse_after_free_ with argument.  Make -Wuse-after-free an alias for
    -Wuse-after-free=1 so both forms go through the same option code.
    
    Switch the warning and suppression sites to OPT_Wuse_after_free_ so
    pragmas, diagnostic classification, and suppression all refer to the same
    option.
    
    Document that -Wuse-after-free is equivalent to -Wuse-after-free=1.
    
    On Arm AAPCS targets, constructors and destructors return this.  In
    maybe_prepare_return_this, suppressing OPT_Wuse_after_free for this records
    the suppression under NW_OTHER, since OPT_Wuse_after_free is not explicitly
    mapped to a diagnostic group.  That can suppress unrelated NW_OTHER
    warnings, such as -Wdeprecated-declarations.  OPT_Wuse_after_free_ is
    mapped to NW_DANGLING, so using it keeps the suppression scoped to the
    use-after-free warning.
    
            PR driver/124058
    
    gcc/ChangeLog:
    
            * common.opt (Wuse-after-free): Make an alias for
            -Wuse-after-free=1.
            * doc/invoke.texi: Document alias.
            * gimple-ssa-warn-access.cc (pass_waccess::warn_invalid_pointer):
            Use OPT_Wuse_after_free_.
    
    gcc/cp/ChangeLog:
    
            * decl.cc (maybe_prepare_return_this): Use OPT_Wuse_after_free_.
    
    gcc/testsuite/ChangeLog:
    
            * c-c++-common/Wuse-after-free-8.c: New test.
    
    Signed-off-by: Torbjörn SVENSSON <[email protected]>
    (cherry picked from commit c5627f93a8259131da2cdebee6d9b0e1f2de1a60)

Diff:
---
 gcc/common.opt                                 |  3 +--
 gcc/cp/decl.cc                                 |  2 +-
 gcc/doc/invoke.texi                            |  1 +
 gcc/gimple-ssa-warn-access.cc                  | 10 +++++-----
 gcc/testsuite/c-c++-common/Wuse-after-free-8.c | 26 ++++++++++++++++++++++++++
 5 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/gcc/common.opt b/gcc/common.opt
index e3fa0dacec4c..98f066194550 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -552,8 +552,7 @@ Common Joined RejectNegative UInteger Var(warn_array_bounds) Warning IntegerRang
 Warn if an array is accessed out of bounds.
 
 Wuse-after-free
-Common Var(warn_use_after_free) Warning
-Warn for uses of pointers to deallocated storage.
+Common Alias(Wuse-after-free=, 1, 0) Warning
 
 Wuse-after-free=
 Common Joined RejectNegative UInteger Var(warn_use_after_free) Warning IntegerRange(0, 3)
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index 81027e1840c2..0c0d17e89ca4 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -18948,7 +18948,7 @@ maybe_prepare_return_this (tree cdtor)
   if (targetm.cxx.cdtor_returns_this ())
     if (tree val = DECL_ARGUMENTS (cdtor))
       {
-	suppress_warning (val, OPT_Wuse_after_free);
+	suppress_warning (val, OPT_Wuse_after_free_);
 	return val;
       }
 
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 61cf8184ce26..1d5fc48cabc9 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -7918,6 +7918,7 @@ Warn about uses of pointers to dynamically allocated objects that have
 been rendered indeterminate by a call to a deallocation function.
 The warning is enabled at all optimization levels but may yield different
 results with optimization than without.
+@option{-Wuse-after-free} is equivalent to @option{-Wuse-after-free=1}.
 
 @table @gcctabopt
 @item -Wuse-after-free=1
diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc
index 305b63567fea..d5d30770e25d 100644
--- a/gcc/gimple-ssa-warn-access.cc
+++ b/gcc/gimple-ssa-warn-access.cc
@@ -3911,7 +3911,7 @@ pass_waccess::warn_invalid_pointer (tree ref, gimple *use_stmt,
       if (!var)
 	ref = NULL_TREE;
       /* Don't warn for cases like when a cdtor returns 'this' on ARM.  */
-      else if (warning_suppressed_p (var, OPT_Wuse_after_free))
+      else if (warning_suppressed_p (var, OPT_Wuse_after_free_))
 	return;
       else if (DECL_ARTIFICIAL (var))
 	ref = NULL_TREE;
@@ -3933,18 +3933,18 @@ pass_waccess::warn_invalid_pointer (tree ref, gimple *use_stmt,
       if (!m_early_checks_p
 	  || (equality && warn_use_after_free < 3)
 	  || (maybe && warn_use_after_free < 2)
-	  || warning_suppressed_p (use_stmt, OPT_Wuse_after_free))
+	  || warning_suppressed_p (use_stmt, OPT_Wuse_after_free_))
 	return;
 
       const tree inval_decl = gimple_call_fndecl (inval_stmt);
 
       auto_diagnostic_group d;
-      if ((ref && warning_at (use_loc, OPT_Wuse_after_free,
+      if ((ref && warning_at (use_loc, OPT_Wuse_after_free_,
 			      (maybe
 			       ? G_("pointer %qE may be used after %qD")
 			       : G_("pointer %qE used after %qD")),
 			      ref, inval_decl))
-	  || (!ref && warning_at (use_loc, OPT_Wuse_after_free,
+	  || (!ref && warning_at (use_loc, OPT_Wuse_after_free_,
 			      (maybe
 			       ? G_("pointer may be used after %qD")
 			       : G_("pointer used after %qD")),
@@ -3952,7 +3952,7 @@ pass_waccess::warn_invalid_pointer (tree ref, gimple *use_stmt,
 	{
 	  location_t loc = gimple_location (inval_stmt);
 	  inform (loc, "call to %qD here", inval_decl);
-	  suppress_warning (use_stmt, OPT_Wuse_after_free);
+	  suppress_warning (use_stmt, OPT_Wuse_after_free_);
 	}
       return;
     }
diff --git a/gcc/testsuite/c-c++-common/Wuse-after-free-8.c b/gcc/testsuite/c-c++-common/Wuse-after-free-8.c
new file mode 100644
index 000000000000..07e7348e801f
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/Wuse-after-free-8.c
@@ -0,0 +1,26 @@
+/* Verify -Wuse-after-free is an alias for -Wuse-after-free=1. */
+/* { dg-do compile } */
+/* { dg-options "-O0 -Wuse-after-free" } */
+
+#if __cplusplus
+#  define EXTERN_C extern "C"
+#else
+#  define EXTERN_C extern
+#endif
+
+EXTERN_C void free (void *);
+
+void sink (void *);
+
+void warn_call_after_free (void *p)
+{
+  free (p);
+  sink (p);         // { dg-warning "pointer 'p' used" }
+}
+
+void warn_cond_call_after_free (void *p, int c)
+{
+  free (p);
+  if (c)
+    sink (p);
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.