https://gcc.gnu.org/g:c5627f93a8259131da2cdebee6d9b0e1f2de1a60
commit r17-2365-gc5627f93a8259131da2cdebee6d9b0e1f2de1a60 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]> 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 ecebc186af77..1c6ad3aa4e5b 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -561,8 +561,7 @@ Common Var(warn_auto_profile) Warning Warn about problems with auto-profile data. 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 472f81ea9e1f..6c5bb77e6031 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -20307,7 +20307,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 2e21053dae96..78052b229a58 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -8492,6 +8492,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 dd128802f9d9..2906ee7320fa 100644 --- a/gcc/gimple-ssa-warn-access.cc +++ b/gcc/gimple-ssa-warn-access.cc @@ -3992,7 +3992,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; @@ -4014,18 +4014,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")), @@ -4033,7 +4033,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); +}
