aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-dce.c
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2020-12-14 13:30:00 -0700
committerMartin Sebor <msebor@redhat.com>2020-12-14 13:30:00 -0700
commitfe7f75cf16783589eedbab597e6d0b8d35d7e470 (patch)
tree7fec98daa8cd2d99d08d302f753fb7416f3e901c /gcc/tree-ssa-dce.c
parente63ae8c083a3218400206b80d4eedd9950fc5d3f (diff)
downloadgcc-fe7f75cf16783589eedbab597e6d0b8d35d7e470.zip
gcc-fe7f75cf16783589eedbab597e6d0b8d35d7e470.tar.gz
gcc-fe7f75cf16783589eedbab597e6d0b8d35d7e470.tar.bz2
Correct/improve maybe_emit_free_warning (PR middle-end/98166, PR c++/57111, PR middle-end/98160).
Resolves: PR middle-end/98166 - bogus -Wmismatched-dealloc on user-defined allocator and inlining PR c++/57111 - 57111 - Generalize -Wfree-nonheap-object to delete PR middle-end/98160 - ICE in default_tree_printer at gcc/tree-diagnostic.c:270 gcc/ChangeLog: PR middle-end/98166 PR c++/57111 PR middle-end/98160 * builtins.c (check_access): Call tree_inlined_location fndecl_alloc_p): Handle BUILT_IN_ALIGNED_ALLOC and BUILT_IN_GOMP_ALLOC. call_dealloc_p): Remove unused function. (new_delete_mismatch_p): Call valid_new_delete_pair_p and rework. (matching_alloc_calls_p): Handle built-in deallocation functions. (warn_dealloc_offset): Corrct the handling of user-defined operators delete. (maybe_emit_free_warning): Avoid assuming expression is a decl. Simplify. * doc/extend.texi (attribute malloc): Update. * tree-ssa-dce.c (valid_new_delete_pair_p): Factor code out into valid_new_delete_pair_p in tree.c. * tree.c (tree_inlined_location): Define new function. (valid_new_delete_pair_p): Define. * tree.h (tree_inlined_location): Declare. (valid_new_delete_pair_p): Declare. gcc/c-family/ChangeLog: PR middle-end/98166 PR c++/57111 PR middle-end/98160 * c-attribs.c (maybe_add_noinline): New function. (handle_malloc_attribute): Call it. Use ATTR_FLAG_INTERNAL. Implicitly add attribute noinline to functions not declared inline and warn on those. libstdc++-v3/ChangeLog: * testsuite/ext/vstring/requirements/exception/basic.cc: Suppress a false positive warning. * testsuite/ext/vstring/requirements/exception/propagation_consistent.cc: Same. gcc/testsuite/ChangeLog: PR middle-end/98166 PR c++/57111 PR middle-end/98160 * g++.dg/warn/Wmismatched-dealloc-2.C: Adjust test of expected warning. * g++.dg/warn/Wmismatched-new-delete.C: Same. * gcc.dg/Wmismatched-dealloc.c: Same. * c-c++-common/Wfree-nonheap-object-2.c: New test. * c-c++-common/Wfree-nonheap-object-3.c: New test. * c-c++-common/Wfree-nonheap-object.c: New test. * c-c++-common/Wmismatched-dealloc.c: New test. * g++.dg/warn/Wfree-nonheap-object-3.C: New test. * g++.dg/warn/Wfree-nonheap-object-4.C: New test. * g++.dg/warn/Wmismatched-dealloc-2.C: New test. * g++.dg/warn/Wmismatched-new-delete-2.C: New test. * g++.dg/warn/Wmismatched-new-delete.C: New test. * gcc.dg/Wmismatched-dealloc-2.c: New test. * gcc.dg/Wmismatched-dealloc-3.c: New test. * gcc.dg/Wmismatched-dealloc.c: New test.
Diffstat (limited to 'gcc/tree-ssa-dce.c')
-rw-r--r--gcc/tree-ssa-dce.c62
1 files changed, 1 insertions, 61 deletions
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index 9fb156c..5ec8729 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -656,67 +656,7 @@ valid_new_delete_pair_p (gimple *new_call, gimple *delete_call)
{
tree new_asm = DECL_ASSEMBLER_NAME (gimple_call_fndecl (new_call));
tree delete_asm = DECL_ASSEMBLER_NAME (gimple_call_fndecl (delete_call));
- const char *new_name = IDENTIFIER_POINTER (new_asm);
- const char *delete_name = IDENTIFIER_POINTER (delete_asm);
- unsigned int new_len = IDENTIFIER_LENGTH (new_asm);
- unsigned int delete_len = IDENTIFIER_LENGTH (delete_asm);
-
- if (new_len < 5 || delete_len < 6)
- return false;
- if (new_name[0] == '_')
- ++new_name, --new_len;
- if (new_name[0] == '_')
- ++new_name, --new_len;
- if (delete_name[0] == '_')
- ++delete_name, --delete_len;
- if (delete_name[0] == '_')
- ++delete_name, --delete_len;
- if (new_len < 4 || delete_len < 5)
- return false;
- /* *_len is now just the length after initial underscores. */
- if (new_name[0] != 'Z' || new_name[1] != 'n')
- return false;
- if (delete_name[0] != 'Z' || delete_name[1] != 'd')
- return false;
- /* _Znw must match _Zdl, _Zna must match _Zda. */
- if ((new_name[2] != 'w' || delete_name[2] != 'l')
- && (new_name[2] != 'a' || delete_name[2] != 'a'))
- return false;
- /* 'j', 'm' and 'y' correspond to size_t. */
- if (new_name[3] != 'j' && new_name[3] != 'm' && new_name[3] != 'y')
- return false;
- if (delete_name[3] != 'P' || delete_name[4] != 'v')
- return false;
- if (new_len == 4
- || (new_len == 18 && !memcmp (new_name + 4, "RKSt9nothrow_t", 14)))
- {
- /* _ZnXY or _ZnXYRKSt9nothrow_t matches
- _ZdXPv, _ZdXPvY and _ZdXPvRKSt9nothrow_t. */
- if (delete_len == 5)
- return true;
- if (delete_len == 6 && delete_name[5] == new_name[3])
- return true;
- if (delete_len == 19 && !memcmp (delete_name + 5, "RKSt9nothrow_t", 14))
- return true;
- }
- else if ((new_len == 19 && !memcmp (new_name + 4, "St11align_val_t", 15))
- || (new_len == 33
- && !memcmp (new_name + 4, "St11align_val_tRKSt9nothrow_t", 29)))
- {
- /* _ZnXYSt11align_val_t or _ZnXYSt11align_val_tRKSt9nothrow_t matches
- _ZdXPvSt11align_val_t or _ZdXPvYSt11align_val_t or or
- _ZdXPvSt11align_val_tRKSt9nothrow_t. */
- if (delete_len == 20 && !memcmp (delete_name + 5, "St11align_val_t", 15))
- return true;
- if (delete_len == 21
- && delete_name[5] == new_name[3]
- && !memcmp (delete_name + 6, "St11align_val_t", 15))
- return true;
- if (delete_len == 34
- && !memcmp (delete_name + 5, "St11align_val_tRKSt9nothrow_t", 29))
- return true;
- }
- return false;
+ return valid_new_delete_pair_p (new_asm, delete_asm);
}
/* Propagate necessity using the operands of necessary statements.