diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc index d015c73dfc67a4c0a070731c888b93800084ace3..b7cdad517b307d24c0b53cca14377bbd1af67aa3 100644 --- a/gcc/gimple-ssa-warn-access.cc +++ b/gcc/gimple-ssa-warn-access.cc @@ -4169,8 +4169,7 @@ pass_waccess::check_pointer_uses (gimple *stmt, tree ptr, for (unsigned i = 0; i != pointers.length (); ++i) { tree ptr = pointers[i]; - if (TREE_CODE (ptr) == SSA_NAME - && !bitmap_set_bit (visited, SSA_NAME_VERSION (ptr))) + if (!bitmap_set_bit (visited, SSA_NAME_VERSION (ptr))) /* Avoid revisiting the same pointer. */ continue; @@ -4267,7 +4266,7 @@ pass_waccess::check_pointer_uses (gimple *stmt, tree ptr, if (gcall *call = dyn_cast <gcall *>(use_stmt)) { - if (gimple_call_return_arg (call)) + if (gimple_call_return_arg (call) == ptr) if (tree lhs = gimple_call_lhs (call)) if (TREE_CODE (lhs) == SSA_NAME) pointers.safe_push (lhs); diff --git a/gcc/testsuite/c-c++-common/Wdangling-pointer-7.c b/gcc/testsuite/c-c++-common/Wdangling-pointer-7.c new file mode 100644 index 0000000000000000000000000000000000000000..8423d3b01adf1bebac28a8e3259a564f1ae2ac96 --- /dev/null +++ b/gcc/testsuite/c-c++-common/Wdangling-pointer-7.c @@ -0,0 +1,36 @@ +/* PR tree-optimization/104715 */ +/* { dg-do compile } */ +/* { dg-options "-Wdangling-pointer" } */ + +char * +foo (char *p) +{ + { + char q[61] = "012345678901234567890123456789012345678901234567890123456789"; + char *r = q; + p = __builtin_strcat (p, r); + } + return p; /* { dg-bogus "using dangling pointer" } */ +} + +char * +bar (char *p) +{ + { + char q[] = "0123456789"; + char *r = q; + p = __builtin_strstr (p, r); + } + return p; /* { dg-bogus "using dangling pointer" } */ +} + +char * +baz (char *p) +{ + { + char q[] = "0123456789"; + char *r = q; + p = __builtin_strpbrk (p, r); + } + return p; /* { dg-bogus "using dangling pointer" } */ +}