warn-access: Prevent -Wuse-after-free on ARM [PR104213]
commit7bd1e1296cc36b558a27bbe09352c5c2aca4c5d5
authorMarek Polacek <polacek@redhat.com>
Tue, 25 Jan 2022 20:12:51 +0000 (25 15:12 -0500)
committerMarek Polacek <polacek@redhat.com>
Wed, 26 Jan 2022 17:18:32 +0000 (26 12:18 -0500)
tree6ecf06e955d8578e7caac690ea6fd02b7f6a4b39
parent00d8321124123daf41f7c51526355a5a610cdeb8
warn-access: Prevent -Wuse-after-free on ARM [PR104213]

Here, -Wuse-after-free warns about using 'this' which, on ARM, cdtors
return, as mandated by the EABI.  To be entirely correct, it only
requires it for C1 and C2 ctors and D2 and D1 dtors, but I don't feel
like changing that now and possibly running into issues later on.

This patch uses suppress_warning on 'this' for certain cdtor_returns_this
cases in the C++ FE, and then warn_invalid_pointer makes use of this
information and doesn't warn.

In my first attempt I tried suppress_warning the MODIFY_EXPR or RETURN_EXPR
we build in build_delete_destructor_body, but the complication is that
the suppress_warning bits don't always survive gimplification; see e.g.
gimplify_modify_expr where we do

 6130       if (COMPARISON_CLASS_P (*from_p))
 6131         copy_warning (assign, *from_p);

but here we're not dealing with a comparison.  Removing that check
regresses uninit-pr74762.C.  Adding copy_warning (assign, *expr_p)
regresses c-c++-common/uninit-17.c.

PR target/104213

gcc/cp/ChangeLog:

* decl.cc (finish_constructor_body): Suppress -Wuse-after-free.
(finish_destructor_body): Likewise.
* optimize.cc (build_delete_destructor_body): Likewise.

gcc/ChangeLog:

* gimple-ssa-warn-access.cc (pass_waccess::warn_invalid_pointer): Don't
warn when the SSA_NAME_VAR of REF has supressed -Wuse-after-free.

gcc/testsuite/ChangeLog:

* g++.dg/warn/Wuse-after-free2.C: New test.
* g++.dg/warn/Wuse-after-free3.C: New test.
gcc/cp/decl.cc
gcc/cp/optimize.cc
gcc/gimple-ssa-warn-access.cc
gcc/testsuite/g++.dg/warn/Wuse-after-free2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/Wuse-after-free3.C [new file with mode: 0644]