Skip to content
Snippets Groups Projects
Commit 2efb237f authored by Jeff Chapman II's avatar Jeff Chapman II Committed by Jason Merrill
Browse files

c++: implement P1492 contracts


Implement the P1492 versions of contracts, along with extensions that
support the emulation of N4820 and other proposals. This implementation
assigns a concrete semantic (one of: ignore, assume, enforce, or
observe) to each contract attribute depending on its labels and
configuration options.

Co-authored-by: default avatarAndrew Sutton <asutton@lock3software.com>
Co-authored-by: default avatarAndrew Marmaduke <amarmaduke@lock3software.com>
Co-authored-by: default avatarMichael Lopez <mlopez@lock3software.com>
Co-authored-by: default avatarJason Merrill <jason@redhat.com>

gcc/ChangeLog:

	* doc/invoke.texi: Document contracts flags.

gcc/c-family/ChangeLog:

	* c.opt: Add contracts flags.
	* c-cppbuiltin.cc (c_cpp_builtins): Add contracts feature-test
	macros.

gcc/cp/ChangeLog:

	* cp-tree.h (enum cp_tree_index): Add
	CPTI_PSEUDO_CONTRACT_VIOLATION.
	(pseudo_contract_violation_type): New macro.
	(struct saved_scope): Add x_processing_contract_condition.
	(processing_contract_condition): New macro.
	(comparing_override_contracts): New variable decl.
	(find_contract): New inline.
	(set_decl_contracts): New inline.
	(get_contract_semantic): New inline.
	(set_contract_semantic): New inline.
	* constexpr.cc (cxx_eval_assert): Split out from...
	(cxx_eval_internal_function): ...here.
	(cxx_eval_constant_expression): Use it for contracts.
	(potential_constant_expression_1): Handle contracts.
	* cp-gimplify.cc (cp_genericize_r): Handle contracts.
	* cp-objcp-common.cc (cp_tree_size): Handle contracts.
	(cp_common_init_ts): Handle contracts.
	(cp_handle_option): Handle contracts.
	* decl.cc (duplicate_decls): Handle contracts.
	(check_tag_decl): Check for bogus contracts.
	(start_decl): Check flag_contracts.
	(grokfndecl): Call rebuild_postconditions.
	(grokdeclarator): Handle contract attributes.
	(start_preparsed_function): Call start_function_contracts.
	(finish_function): Call finish_function_contracts.
	* decl2.cc (cp_check_const_attributes): Skip contracts.
	(comdat_linkage): Handle outlined contracts.
	* error.cc (dump_type): Handle null TYPE_IDENTIFIER.
	* g++spec.cc (EXPERIMENTAL): New macro.
	(lang_specific_driver): Add -lstdc++exp if -fcontracts.
	* mangle.cc (write_encoding): Handle outlined contracts.
	* module.cc (trees_out::fn_parms_init): Handle outlined contracts.
	(trees_in::fn_parms_init): Likewise.
	(check_mergeable_decl): Likewise.
	(module_state_config::get_dialect): Record -fcontracts.
	* parser.h (struct cp_unparsed_functions_entry): Add contracts.
	* parser.cc (unparsed_contracts): New macro.
	(push_unparsed_function_queues): Adjust.
	(contract_attribute_p): New.
	(cp_parser_statement): Check contracts.
	(cp_parser_decl_specifier_seq): Handle contracts.
	(cp_parser_skip_to_closing_square_bracket): Split out...
	(cp_parser_skip_up_to_closing_square_bracket): ...this fn.
	(cp_parser_class_specifier): Do contract late parsing.
	(cp_parser_class_head): Check contracts.
	(cp_parser_contract_role): New.
	(cp_parser_contract_mode_opt): New.
	(find_error, contains_error_p): New.
	(cp_parser_contract_attribute_spec): New.
	(cp_parser_late_contract_condition): New.
	(cp_parser_std_attribute_spec): Handle contracts.
	(cp_parser_save_default_args): Also save contracts.
	* pt.cc (register_parameter_specializations): No longer static.
	(register_local_identity): New.
	(check_explicit_specialization): Call remove_contract_attributes.
	(tsubst_contract, tsubst_contract_attribute): New.
	(tsubst_contract_attributes): New.
	(tsubst_attribute): Add comment.
	(tsubst_copy): Also allow parm when processing_contract_condition.
	(tsubst_expr): Handle contracts.
	(regenerate_decl_from_template): Handle contracts.
	* search.cc (check_final_overrider): Compare contracts.
	* semantics.cc (set_cleanup_locs): Skip POSTCONDITION_STMT.
	(finish_non_static_data_member): Check contracts.
	(finish_this_expr): Check contracts.
	(process_outer_var_ref): Handle contracts.
	(finish_id_expression_1): Handle contracts.
	(apply_deduced_return_type): Adjust contracts.
	* tree.cc (handle_contract_attribute): New.
	(get_innermost_component, is_this_expression): New.
	(comparing_this_references): New.
	(equivalent_member_references): New.
	(cp_tree_equal): Check it.
	* typeck.cc (check_return_expr): Apply contracts.
	* Make-lang.in: Add contracts.o.
	* config-lang.in: Add contracts.cc.
	* cp-tree.def (ASSERTION_STMT, PRECONDITION_STMT)
	(POSTCONDITION_STMT): New.
	* contracts.h: New file.
	* contracts.cc: New file.

gcc/testsuite/ChangeLog:

	* g++.dg/modules/modules.exp: Pass dg-options to link command.
	* lib/g++.exp: Add -L for libstdc++exp.a.
	* g++.dg/contracts/backtrace_handler/assert_fail.cpp: New test.
	* g++.dg/contracts/backtrace_handler/handle_contract_violation.cpp: New test.
	* g++.dg/contracts/contracts-access1.C: New test.
	* g++.dg/contracts/contracts-assume1.C: New test.
	* g++.dg/contracts/contracts-assume2.C: New test.
	* g++.dg/contracts/contracts-assume3.C: New test.
	* g++.dg/contracts/contracts-assume4.C: New test.
	* g++.dg/contracts/contracts-assume5.C: New test.
	* g++.dg/contracts/contracts-assume6.C: New test.
	* g++.dg/contracts/contracts-comdat1.C: New test.
	* g++.dg/contracts/contracts-config1.C: New test.
	* g++.dg/contracts/contracts-constexpr1.C: New test.
	* g++.dg/contracts/contracts-constexpr2.C: New test.
	* g++.dg/contracts/contracts-constexpr3.C: New test.
	* g++.dg/contracts/contracts-conversion1.C: New test.
	* g++.dg/contracts/contracts-ctor-dtor1.C: New test.
	* g++.dg/contracts/contracts-ctor-dtor2.C: New test.
	* g++.dg/contracts/contracts-cv1.C: New test.
	* g++.dg/contracts/contracts-deduced1.C: New test.
	* g++.dg/contracts/contracts-deduced2.C: New test.
	* g++.dg/contracts/contracts-friend1.C: New test.
	* g++.dg/contracts/contracts-ft1.C: New test.
	* g++.dg/contracts/contracts-ignore1.C: New test.
	* g++.dg/contracts/contracts-ignore2.C: New test.
	* g++.dg/contracts/contracts-large-return.C: New test.
	* g++.dg/contracts/contracts-multiline1.C: New test.
	* g++.dg/contracts/contracts-multiple-inheritance1.C: New test.
	* g++.dg/contracts/contracts-multiple-inheritance2.C: New test.
	* g++.dg/contracts/contracts-nested-class1.C: New test.
	* g++.dg/contracts/contracts-nested-class2.C: New test.
	* g++.dg/contracts/contracts-nocopy1.C: New test.
	* g++.dg/contracts/contracts-override.C: New test.
	* g++.dg/contracts/contracts-post1.C: New test.
	* g++.dg/contracts/contracts-post2.C: New test.
	* g++.dg/contracts/contracts-post3.C: New test.
	* g++.dg/contracts/contracts-post4.C: New test.
	* g++.dg/contracts/contracts-post5.C: New test.
	* g++.dg/contracts/contracts-post6.C: New test.
	* g++.dg/contracts/contracts-pre1.C: New test.
	* g++.dg/contracts/contracts-pre10.C: New test.
	* g++.dg/contracts/contracts-pre2.C: New test.
	* g++.dg/contracts/contracts-pre2a1.C: New test.
	* g++.dg/contracts/contracts-pre2a2.C: New test.
	* g++.dg/contracts/contracts-pre3.C: New test.
	* g++.dg/contracts/contracts-pre4.C: New test.
	* g++.dg/contracts/contracts-pre5.C: New test.
	* g++.dg/contracts/contracts-pre6.C: New test.
	* g++.dg/contracts/contracts-pre7.C: New test.
	* g++.dg/contracts/contracts-pre9.C: New test.
	* g++.dg/contracts/contracts-redecl1.C: New test.
	* g++.dg/contracts/contracts-redecl2.C: New test.
	* g++.dg/contracts/contracts-redecl3.C: New test.
	* g++.dg/contracts/contracts-redecl4.C: New test.
	* g++.dg/contracts/contracts-redecl5.C: New test.
	* g++.dg/contracts/contracts-redecl6.C: New test.
	* g++.dg/contracts/contracts-redecl7.C: New test.
	* g++.dg/contracts/contracts-redecl8.C: New test.
	* g++.dg/contracts/contracts-tmpl-attr1.C: New test.
	* g++.dg/contracts/contracts-tmpl-spec1.C: New test.
	* g++.dg/contracts/contracts-tmpl-spec2.C: New test.
	* g++.dg/contracts/contracts-tmpl-spec3.C: New test.
	* g++.dg/contracts/contracts1.C: New test.
	* g++.dg/contracts/contracts10.C: New test.
	* g++.dg/contracts/contracts11.C: New test.
	* g++.dg/contracts/contracts12.C: New test.
	* g++.dg/contracts/contracts13.C: New test.
	* g++.dg/contracts/contracts14.C: New test.
	* g++.dg/contracts/contracts15.C: New test.
	* g++.dg/contracts/contracts16.C: New test.
	* g++.dg/contracts/contracts17.C: New test.
	* g++.dg/contracts/contracts18.C: New test.
	* g++.dg/contracts/contracts19.C: New test.
	* g++.dg/contracts/contracts2.C: New test.
	* g++.dg/contracts/contracts20.C: New test.
	* g++.dg/contracts/contracts22.C: New test.
	* g++.dg/contracts/contracts24.C: New test.
	* g++.dg/contracts/contracts25.C: New test.
	* g++.dg/contracts/contracts3.C: New test.
	* g++.dg/contracts/contracts35.C: New test.
	* g++.dg/contracts/contracts4.C: New test.
	* g++.dg/contracts/contracts5.C: New test.
	* g++.dg/contracts/contracts6.C: New test.
	* g++.dg/contracts/contracts7.C: New test.
	* g++.dg/contracts/contracts8.C: New test.
	* g++.dg/contracts/contracts9.C: New test.
	* g++.dg/modules/contracts-1_a.C: New test.
	* g++.dg/modules/contracts-1_b.C: New test.
	* g++.dg/modules/contracts-2_a.C: New test.
	* g++.dg/modules/contracts-2_b.C: New test.
	* g++.dg/modules/contracts-2_c.C: New test.
	* g++.dg/modules/contracts-3_a.C: New test.
	* g++.dg/modules/contracts-3_b.C: New test.
	* g++.dg/modules/contracts-4_a.C: New test.
	* g++.dg/modules/contracts-4_b.C: New test.
	* g++.dg/modules/contracts-4_c.C: New test.
	* g++.dg/modules/contracts-4_d.C: New test.
	* g++.dg/modules/contracts-tpl-friend-1_a.C: New test.
	* g++.dg/modules/contracts-tpl-friend-1_b.C: New test.
	* g++.dg/contracts/backtrace_handler/Makefile: New test.
	* g++.dg/contracts/backtrace_handler/README: New test.
	* g++.dg/contracts/backtrace_handler/example_out.txt: New test.
	* g++.dg/contracts/backtrace_handler/example_pretty.txt: New test.
	* g++.dg/contracts/backtrace_handler/prettytrace.sh: New test.
	* g++.dg/contracts/except_preload_handler/Makefile: New test.
	* g++.dg/contracts/except_preload_handler/README: New test.
	* g++.dg/contracts/except_preload_handler/assert_fail.cpp: New test.
	* g++.dg/contracts/except_preload_handler/handle_contract_violation.cpp: New test.
	* g++.dg/contracts/noexcept_preload_handler/Makefile: New test.
	* g++.dg/contracts/noexcept_preload_handler/README: New test.
	* g++.dg/contracts/noexcept_preload_handler/assert_fail.cpp: New test.
	* g++.dg/contracts/noexcept_preload_handler/handle_contract_violation.cpp: New test.
	* g++.dg/contracts/preload_handler/Makefile: New test.
	* g++.dg/contracts/preload_handler/README: New test.
	* g++.dg/contracts/preload_handler/assert_fail.cpp: New test.
	* g++.dg/contracts/preload_handler/handle_contract_violation.cpp: New test.
	* g++.dg/contracts/preload_nocontinue_handler/Makefile: New test.
	* g++.dg/contracts/preload_nocontinue_handler/README: New test.
	* g++.dg/contracts/preload_nocontinue_handler/assert_fail.cpp: New test.
	* g++.dg/contracts/preload_nocontinue_handler/handle_contract_violation.cpp: New test.
	* g++.dg/contracts/preload_nocontinue_handler/nocontinue.cpp: New test.
parent ea63396f
No related branches found
No related tags found
Loading
Showing with 3660 additions and 60 deletions
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment