Call mark_dfs_back_edges before testing EDGE_DFS_BACK [PR104761].

Resolves:
PR middle-end/104761 - bogus -Wdangling-pointer with cleanup and infinite loop

gcc/ChangeLog:

	PR middle-end/104761
	* gimple-ssa-warn-access.cc (pass_waccess::execute): Call
	mark_dfs_back_edges.

gcc/testsuite/ChangeLog:

	PR middle-end/104761
	* g++.dg/warn/Wdangling-pointer-4.C: New test.
	* gcc.dg/Wdangling-pointer-4.c: New test.
This commit is contained in:
Martin Sebor 2022-03-03 13:58:00 -07:00
parent c083e654bd
commit 51149a05b8
3 changed files with 48 additions and 1 deletions

View File

@ -47,7 +47,7 @@
#include "tree-object-size.h"
#include "tree-ssa-strlen.h"
#include "calls.h"
#include "cfgloop.h"
#include "cfganal.h"
#include "intl.h"
#include "gimple-range.h"
#include "stringpool.h"
@ -4710,6 +4710,9 @@ pass_waccess::execute (function *fun)
calculate_dominance_info (CDI_DOMINATORS);
calculate_dominance_info (CDI_POST_DOMINATORS);
/* Set or clear EDGE_DFS_BACK bits on back edges. */
mark_dfs_back_edges (fun);
/* Create a new ranger instance and associate it with FUN. */
m_ptr_qry.rvals = enable_ranger (fun);
m_func = fun;

View File

@ -0,0 +1,22 @@
/* PR middle-end/104761 - bogus -Wdangling-pointer with cleanup and infinite loop
{ dg-do compile }
{ dg-options "-O -Wall -fno-exceptions" } */
struct S { int i; };
struct X { ~X (); };
void g (int);
void test (int i)
{
S s = { 0 };
X x;
if (i)
{
g (s.i); // { dg-bogus "-Wdangling-pointer" }
for ( ; ; );
}
}

View File

@ -0,0 +1,22 @@
/* PR middle-end/104761 - bogus -Wdangling-pointer with cleanup and infinite loop
{ dg-do compile }
{ dg-options "-O -Wall" } */
typedef struct { int i; } S;
void f (S **);
int g (int);
void nowarn (int x)
{
S s = { 0 };
__attribute__((__cleanup__ (f))) S *p = 0;
if (x)
{
g (s.i); // { dg-bogus "-Wdangling-pointer" }
for ( ; ; );
}
}