mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-27 05:44:15 +08:00
80e5be0c7f
I've noticed alloc_align attribute is missing on the non-vector ::operator new with std::align_val_t and const std::nothrow_t& arguments, this patch adds it. The last hunk is just an attempt to make the line shorter. The first hunk originally added also __alloc_size__ (1) attribute, but seems that regresses FAIL: g++.dg/tm/pr46270.C -std=gnu++98 (test for excess errors) with Excess errors: .../libstdc++-v3/libsupc++/new:137:26: warning: new declaration 'void* operator new(std::size_t)' ambiguates built-in declaration 'void* operator new(long unsigned int) +transaction_safe' [-Wbuiltin-declaration-mismatch] .../libstdc++-v3/libsupc++/new:140:26: warning: new declaration 'void* operator new [](std::size_t)' ambiguates built-in declaration 'void* operator new [](long unsigned int) +transaction_safe' [-Wbuiltin-declaration-mismatch] I must say I have no clue why that happens only in C++98 (C++11 and above are quiet) and why only with -fgnu-tm, tried to debug that but am lost. It is some conflict with the predeclared ::operator new, but those clearly do have the externally_visible attribute, and alloc_size (1) attributes: extvisattr = build_tree_list (get_identifier ("externally_visible"), NULL_TREE); newattrs = tree_cons (get_identifier ("alloc_size"), build_tree_list (NULL_TREE, integer_one_node), extvisattr); newtype = cp_build_type_attribute_variant (ptr_ftype_sizetype, newattrs); newtype = build_exception_variant (newtype, new_eh_spec); ... tree opnew = push_cp_library_fn (NEW_EXPR, newtype, 0); DECL_IS_MALLOC (opnew) = 1; DECL_SET_IS_OPERATOR_NEW (opnew, true); DECL_IS_REPLACEABLE_OPERATOR (opnew) = 1; and at C++98 I think libstdc++ doesn't add transaction_safe attribute: // Conditionally enable annotations for the Transactional Memory TS on C++11. // Most of the following conditions are due to limitations in the current // implementation. #if __cplusplus >= 201103L && _GLIBCXX_USE_CXX11_ABI \ && _GLIBCXX_USE_DUAL_ABI && __cpp_transactional_memory >= 201500L \ && !_GLIBCXX_FULLY_DYNAMIC_STRING && _GLIBCXX_USE_WEAK_REF \ && _GLIBCXX_USE_ALLOCATOR_NEW #define _GLIBCXX_TXN_SAFE transaction_safe #define _GLIBCXX_TXN_SAFE_DYN transaction_safe_dynamic #else #define _GLIBCXX_TXN_SAFE #define _GLIBCXX_TXN_SAFE_DYN #endif push_cp_library_fn adds transaction_safe attribute whenever -fgnu-tm is used, regardless of the other conditionals: if (flag_tm) apply_tm_attr (fn, get_identifier ("transaction_safe")); Anyway, omitting alloc_size (1) fixes that test and given that the predeclared operator new already has alloc_size (1) attribute, I think it can be safely left out. 2024-11-08 Jakub Jelinek <jakub@redhat.com> * libsupc++/new (::operator new, ::operator new[]): Add malloc attribute where missing. Add alloc_align attribute when std::align_val_t is present and where it was missing. Formatting fix. |
||
---|---|---|
.. | ||
array_type_info.cc | ||
atexit_arm.cc | ||
atexit_thread.cc | ||
atomic_lockfree_defines.h | ||
bad_alloc.cc | ||
bad_array_length.cc | ||
bad_array_new.cc | ||
bad_cast.cc | ||
bad_typeid.cc | ||
class_type_info.cc | ||
compare | ||
cxxabi_forced.h | ||
cxxabi_init_exception.h | ||
cxxabi.h | ||
del_op.cc | ||
del_opa.cc | ||
del_opant.cc | ||
del_opnt.cc | ||
del_ops.cc | ||
del_opsa.cc | ||
del_opv.cc | ||
del_opva.cc | ||
del_opvant.cc | ||
del_opvnt.cc | ||
del_opvs.cc | ||
del_opvsa.cc | ||
dyncast.cc | ||
eh_alloc.cc | ||
eh_arm.cc | ||
eh_atomics.h | ||
eh_aux_runtime.cc | ||
eh_call.cc | ||
eh_catch.cc | ||
eh_exception.cc | ||
eh_globals.cc | ||
eh_personality.cc | ||
eh_ptr.cc | ||
eh_term_handler.cc | ||
eh_term_handler.h | ||
eh_terminate.cc | ||
eh_throw.cc | ||
eh_tm.cc | ||
eh_type.cc | ||
eh_unex_handler.cc | ||
enum_type_info.cc | ||
exception | ||
exception_defines.h | ||
exception_ptr.h | ||
exception.h | ||
function_type_info.cc | ||
fundamental_type_info.cc | ||
guard_error.cc | ||
guard.cc | ||
hash_bytes.cc | ||
hash_bytes.h | ||
initializer_list | ||
Makefile.am | ||
Makefile.in | ||
nested_exception.cc | ||
nested_exception.h | ||
new | ||
new_handler.cc | ||
new_op.cc | ||
new_opa.cc | ||
new_opant.cc | ||
new_opnt.cc | ||
new_opv.cc | ||
new_opva.cc | ||
new_opvant.cc | ||
new_opvnt.cc | ||
pbase_type_info.cc | ||
pmem_type_info.cc | ||
pointer_type_info.cc | ||
pure.cc | ||
si_class_type_info.cc | ||
tinfo2.cc | ||
tinfo.cc | ||
tinfo.h | ||
typeinfo | ||
unwind-cxx.h | ||
vec.cc | ||
vmi_class_type_info.cc | ||
vterminate.cc | ||
vtv_stubs.cc |