Implement N4514, C++ Extensions for Transactional Memory.
authorJason Merrill <jason@redhat.com>
Sun, 4 Oct 2015 19:17:19 +0000 (15:17 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 4 Oct 2015 19:17:19 +0000 (15:17 -0400)
commitb8fd7909c04a29e82fb3ebace161801f949ad4f5
treeb68c53c0fcfa672f4c0e3577083662356ee4953d
parentbd841941ec9b1864216573f4426e694f806dd4bf
Implement N4514, C++ Extensions for Transactional Memory.

gcc/
* builtins.def (BUILT_IN_ABORT): Add transaction_pure attribute.
gcc/c-family/
* c-common.c (c_common_reswords): Add C++ TM TS keywords.
(c_common_attribute_table): Add transaction_safe_dynamic.
transaction_safe now affects type identity.
(handle_tm_attribute): Handle transaction_safe_dynamic.
* c-common.h (enum rid): Add RID_ATOMIC_NOEXCEPT,
RID_ATOMIC_CANCEL, RID_SYNCHRONIZED.
(OBJC_IS_CXX_KEYWORD): Add RID_SYNCHRONIZED.
(D_TRANSMEM): New.
* c-cppbuiltin.c (c_cpp_builtins): Define __cpp_transactional_memory.
* c-pretty-print.c (pp_c_attributes_display): Don't print
transaction_safe in C++.
gcc/c/
* c-parser.c (c_lex_one_token): Handle @synchronized.
* c-decl.c (match_builtin_function_types): A declaration of a built-in
can change whether the function is transaction_safe.
gcc/cp/
* cp-tree.h (struct cp_declarator): Add tx_qualifier field.
(BCS_NORMAL, BCS_TRANSACTION): New enumerators.
* lex.c (init_reswords): Limit TM kewords to -fgnu-tm.
* parser.c (cp_lexer_get_preprocessor_token): Fix @synchronized.
(make_call_declarator): Take tx_qualifier.
(cp_parser_tx_qualifier_opt): New.
(cp_parser_lambda_declarator_opt): Use it.
(cp_parser_direct_declarator): Likewise.
(cp_parser_statement): Handle atomic_noexcept, atomic_cancel.
(cp_parser_compound_statement): Change in_try parameter to bcs_flags.
(cp_parser_std_attribute): Map optimize_for_synchronized to
transaction_callable.
(cp_parser_transaction): Take the token.  Handle atomic_noexcept.
* lambda.c (maybe_add_lambda_conv_op): Handle transaction-safety.
* call.c (enum conversion_kind): Add ck_tsafe.
(standard_conversion): Handle transaction-safety conversion.
(convert_like_real, resolve_address_of_overloaded_function): Likewise.
(check_methods): Diagnose transaction_safe_dynamic on non-virtual
function.
(look_for_tm_attr_overrides): Don't inherit transaction_safe_dynamic.
* cvt.c (tx_safe_fn_type_p, tx_unsafe_fn_variant)
(can_convert_tx_safety): New.
* typeck.c (composite_pointer_type): Handle transaction-safety.
* name-lookup.h (enum scope_kind): Add sk_transaction.
* name-lookup.c (begin_scope): Handle it.
* semantics.c (begin_compound_stmt): Pass it.
* decl.c (check_previous_goto_1): Check it.
(struct named_label_entry): Add in_transaction_scope.
(poplevel_named_label_1): Set it.
(check_goto): Check it.
(duplicate_decls): A specialization can be transaction_safe
independently of its template.
(grokdeclarator): Handle tx-qualifier.
* rtti.c (ptr_initializer): Handle transaction-safe.
* search.c (check_final_overrider): Check transaction_safe_dynamic.
Don't check transaction_safe.
* mangle.c (write_function_type): Mangle transaction_safe here.
(write_CV_qualifiers_for_type): Not here.
(write_type): Preserve transaction_safe when stripping attributes.
* error.c (dump_type_suffix): Print transaction_safe.
libiberty/
* cp-demangle.c (d_cv_qualifiers): Dx means transaction_safe.
(cplus_demangle_type): Let d_cv_qualifiers handle it.
(d_dump, d_make_comp, has_return_type, d_encoding)
(d_count_templates_scopes, d_print_comp_inner)
(d_print_mod_list, d_print_mod, d_print_function_type)
(is_ctor_or_dtor): Handle DEMANGLE_COMPONENT_TRANSACTION_SAFE.

From-SVN: r228462
62 files changed:
gcc/ChangeLog
gcc/builtins.def
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/c-family/c-common.h
gcc/c-family/c-cppbuiltin.c
gcc/c-family/c-pretty-print.c
gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/c/c-parser.c
gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/cvt.c
gcc/cp/decl.c
gcc/cp/error.c
gcc/cp/lambda.c
gcc/cp/lex.c
gcc/cp/mangle.c
gcc/cp/name-lookup.c
gcc/cp/name-lookup.h
gcc/cp/parser.c
gcc/cp/rtti.c
gcc/cp/search.c
gcc/cp/semantics.c
gcc/cp/typeck.c
gcc/testsuite/g++.dg/tm/composite1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/dynamic1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/dynamic2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/eh1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/eh2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/eh4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/inherit1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/inherit2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/jump1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/keyword1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/lambda1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/lambda2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/macro1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/mangle1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/noexcept-7.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/overload1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/overload2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/pretty-print1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/static_cast1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/sync1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/sync2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/template-3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/template-4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/template-5.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/unsafe1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tm/unsafe2.C [new file with mode: 0644]
gcc/testsuite/lib/g++.exp
gcc/tree.c
gcc/tree.h
include/demangle.h
libiberty/ChangeLog
libiberty/cp-demangle.c
libiberty/testsuite/demangle-expected
libstdc++-v3/libsupc++/cxxabi.h
libstdc++-v3/libsupc++/pbase_type_info.cc