c++: Diagnose constexpr delete [] new int; and delete new int[N]; [PR95808]
authorJakub Jelinek <jakub@redhat.com>
Thu, 29 Oct 2020 15:27:01 +0000 (16:27 +0100)
committerJakub Jelinek <jakub@redhat.com>
Thu, 29 Oct 2020 15:27:01 +0000 (16:27 +0100)
commit815baade9a07d361b1daa1dcfbbda2a79f3ebb52
treed009f7c200116f53e11dd3b94f040f55efe1b358
parent40749db75caff2fed7b7053e0d1868feaa21bcb4
c++: Diagnose constexpr delete [] new int; and delete new int[N]; [PR95808]

This patch diagnoses delete [] new int; and delete new int[1]; in constexpr
contexts by remembering
IDENTIFIER_OVL_OP_FLAGS (DECL_NAME (fun)) & OVL_OP_FLAG_VEC
from the operator new and checking it at operator delete time.

2020-10-29  Jakub Jelinek  <jakub@redhat.com>

PR c++/95808
* cp-tree.h (enum cp_tree_index): Add CPTI_HEAP_VEC_UNINIT_IDENTIFIER
and CPTI_HEAP_VEC_IDENTIFIER.
(heap_vec_uninit_identifier, heap_vec_identifier): Define.
* decl.c (initialize_predefined_identifiers): Initialize those
identifiers.
* constexpr.c (cxx_eval_call_expression): Reject array allocations
deallocated with non-array deallocation or non-array allocations
deallocated with array deallocation.
(non_const_var_error): Handle heap_vec_uninit_identifier and
heap_vec_identifier too.
(cxx_eval_constant_expression): Handle also heap_vec_uninit_identifier
and in that case during initialization replace it with
heap_vec_identifier.
(find_heap_var_refs): Handle heap_vec_uninit_identifier and
heap_vec_identifier too.

* g++.dg/cpp2a/constexpr-new15.C: New test.
gcc/cp/constexpr.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/testsuite/g++.dg/cpp2a/constexpr-new15.C [new file with mode: 0644]