Jeff Chapman II 2efb237ffc 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: Andrew Sutton  <asutton@lock3software.com>
Co-authored-by: Andrew Marmaduke <amarmaduke@lock3software.com>
Co-authored-by: Michael Lopez <mlopez@lock3software.com>
Co-authored-by: Jason 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.
2022-11-18 21:41:14 -05:00
2022-03-19 00:16:22 +00:00
2022-11-15 08:32:29 +00:00
2022-11-18 18:09:19 +00:00
2022-10-08 00:17:29 +00:00
2022-11-18 21:41:14 -05:00
2022-09-01 00:17:39 +00:00
2022-08-31 00:16:45 +00:00
2022-11-16 00:17:09 +00:00
2022-08-26 00:16:21 +00:00
2022-11-17 00:16:52 +00:00
2022-10-13 00:17:37 +00:00
2022-11-02 00:17:38 +00:00
2022-06-04 00:16:27 +00:00
2022-10-08 00:17:29 +00:00
2022-10-13 00:17:37 +00:00
2022-11-06 11:05:22 +00:00
2022-10-13 00:17:37 +00:00
2022-11-17 00:16:52 +00:00
2022-11-16 00:17:09 +00:00
2022-11-15 08:32:29 +00:00
2022-10-21 00:17:52 +00:00
2022-11-06 11:05:22 +00:00
2022-11-15 08:32:29 +00:00
2022-11-16 00:17:09 +00:00
2022-10-13 00:17:37 +00:00
2022-11-01 00:19:02 +00:00
2022-10-13 00:17:37 +00:00
2022-11-15 08:32:29 +00:00
2022-10-13 00:17:37 +00:00
2022-07-19 17:07:04 +03:00
2022-11-15 08:32:29 +00:00
2021-12-21 09:10:57 +01:00
2022-10-31 11:15:45 +00:00

This directory contains the GNU Compiler Collection (GCC).

The GNU Compiler Collection is free software.  See the files whose
names start with COPYING for copying permission.  The manuals, and
some of the runtime libraries, are under different terms; see the
individual source files for details.

The directory INSTALL contains copies of the installation information
as HTML and plain text.  The source of this information is
gcc/doc/install.texi.  The installation information includes details
of what is included in the GCC sources and what files GCC installs.

See the file gcc/doc/gcc.texi (together with other files that it
includes) for usage and porting information.  An online readable
version of the manual is in the files gcc/doc/gcc.info*.

See http://gcc.gnu.org/bugs/ for how to report bugs usefully.

Copyright years on GCC source files may be listed using range
notation, e.g., 1987-2012, indicating that every year in the range,
inclusive, is a copyrightable year that could otherwise be listed
individually.
S
Description
Yggdrasil port of the GNU Compiler Collection
Readme 978 MiB
Languages
C++ 33%
C 27.4%
Ada 13%
Go 7.1%
D 7%
Other 12.1%