r277865 - in /trunk: gcc/c-family/c-cppbuiltin....

jason@gcc.gnu.org jason@gcc.gnu.org
Tue Nov 5 23:56:00 GMT 2019


Author: jason
Date: Tue Nov  5 23:56:18 2019
New Revision: 277865

URL: https://gcc.gnu.org/viewcvs?rev=277865&root=gcc&view=rev
Log:
	Implement C++20 operator<=>.

There are three major pieces to this support: scalar operator<=>,
synthesis of comparison operators, and rewritten/reversed overload
resolution (e.g. a < b becomes 0 > b <=> a).

Unlike other defaulted functions, where we use synthesized_method_walk to
semi-simulate what the definition of the function will be like, this patch
determines the characteristics of a comparison operator by trying to define
it.

My handling of non-dependent rewritten operators in templates can still use
some work: build_min_non_dep_op_overload can't understand the rewrites and
crashes, so I'm avoiding it for now by clearing *overload.  This means we'll
do name lookup again at instantiation time, which can incorrectly mean a
different result.  I'll poke at this more in stage 3.

I'm leaving out a fourth section ("strong structural equality") even though
I've implemented it, because it seems likely to change radically tomorrow.

Thanks to Tim van Deurzen and Jakub for implementing lexing of the <=>
operator, and Jonathan for the initial <compare> header.

gcc/cp/
	* cp-tree.h (struct lang_decl_fn): Add maybe_deleted bitfield.
	(DECL_MAYBE_DELETED): New.
	(enum special_function_kind): Add sfk_comparison.
	(LOOKUP_REWRITTEN, LOOKUP_REVERSED): New.
	* call.c (struct z_candidate): Add rewritten and reversed methods.
	(add_builtin_candidate): Handle SPACESHIP_EXPR.
	(add_builtin_candidates): Likewise.
	(add_candidates): Don't add a reversed candidate if the parms are
	the same.
	(add_operator_candidates): Split out from build_new_op_1.  Handle
	rewritten and reversed candidates.
	(add_candidate): Swap conversions of reversed candidate.
	(build_new_op_1): Swap them back.  Build a second operation for
	rewritten candidates.
	(extract_call_expr): Handle rewritten calls.
	(same_fn_or_template): New.
	(joust): Handle rewritten and reversed candidates.
	* class.c (add_implicitly_declared_members): Add implicit op==.
	(classtype_has_op, classtype_has_defaulted_op): New.
	* constexpr.c (cxx_eval_binary_expression): Handle SPACESHIP_EXPR.
	(cxx_eval_constant_expression, potential_constant_expression_1):
	Likewise.
	* cp-gimplify.c (genericize_spaceship): New.
	(cp_genericize_r): Use it.
	* cp-objcp-common.c (cp_common_init_ts): Handle SPACESHIP_EXPR.
	* decl.c (finish_function): Handle deleted function.
	* decl2.c (grokfield): SET_DECL_FRIEND_CONTEXT on defaulted friend.
	(mark_used): Check DECL_MAYBE_DELETED.  Remove assumption that
	defaulted functions are non-static members.
	* error.c (dump_expr): Handle SPACESHIP_EXPR.
	* method.c (type_has_trivial_fn): False for sfk_comparison.
	(enum comp_cat_tag, struct comp_cat_info_t): New types.
	(comp_cat_cache): New array variable.
	(lookup_comparison_result, lookup_comparison_category)
	(is_cat, cat_tag_for, spaceship_comp_cat)
	(spaceship_type, genericize_spaceship)
	(common_comparison_type, early_check_defaulted_comparison)
	(comp_info, build_comparison_op): New.
	(synthesize_method): Handle sfk_comparison.  Handle deleted.
	(get_defaulted_eh_spec, maybe_explain_implicit_delete)
	(explain_implicit_non_constexpr, implicitly_declare_fn)
	(defaulted_late_check, defaultable_fn_check): Handle sfk_comparison.
	* name-lookup.c (get_std_name_hint): Add comparison categories.
	* tree.c (special_function_p): Add sfk_comparison.
	* typeck.c (cp_build_binary_op): Handle SPACESHIP_EXPR.

2019-11-05  Tim van Deurzen  <tim@kompiler.org>

	Add new tree code for the spaceship operator.
gcc/cp/
	* cp-tree.def: Add new tree code.
	* operators.def: New binary operator.
	* parser.c: Add new token and tree code.
libcpp/
	* cpplib.h: Add spaceship operator for C++.
	* lex.c: Implement conditional lexing of spaceship operator for C++20.

2019-11-05  Jonathan Wakely  <jwakely@redhat.com>

libstdc++-v3/
	* libsupc++/compare: New header.
	* libsupc++/Makefile.am (std_HEADERS): Add compare.
	* include/std/version: Define __cpp_lib_three_way_comparison.
	* include/std/functional: #include <compare>.

Added:
    trunk/libstdc++-v3/libsupc++/compare
Modified:
    trunk/libstdc++-v3/ChangeLog
    trunk/libstdc++-v3/include/Makefile.am
    trunk/libstdc++-v3/include/std/functional
    trunk/libstdc++-v3/include/std/version
    trunk/libstdc++-v3/libsupc++/Makefile.am
    trunk/libstdc++-v3/testsuite/std/concepts/concepts.object/regular.cc

Changes in other areas also in this revision:
Added:
    trunk/gcc/testsuite/c-c++-common/cpp/spaceship-1.c
    trunk/gcc/testsuite/g++.dg/cpp/spaceship-1.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-constexpr1.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-eq1.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-eq1a.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-eq2.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-eq3.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-eq4.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-eq5.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-eq6.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-eq7.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-err1.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-err2.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-rewrite1.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-scalar1.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-scalar1a.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-scalar2.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-scalar3.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-sfinae1.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-synth1.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-synth1a.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-synth2.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-synth3.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-synth3a.C
    trunk/gcc/testsuite/g++.dg/cpp2a/spaceship-weak1.C
Modified:
    trunk/gcc/c-family/c-cppbuiltin.c
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/call.c
    trunk/gcc/cp/class.c
    trunk/gcc/cp/constexpr.c
    trunk/gcc/cp/cp-gimplify.c
    trunk/gcc/cp/cp-objcp-common.c
    trunk/gcc/cp/cp-tree.def
    trunk/gcc/cp/cp-tree.h
    trunk/gcc/cp/decl.c
    trunk/gcc/cp/decl2.c
    trunk/gcc/cp/error.c
    trunk/gcc/cp/method.c
    trunk/gcc/cp/name-lookup.c
    trunk/gcc/cp/operators.def
    trunk/gcc/cp/parser.c
    trunk/gcc/cp/pt.c
    trunk/gcc/cp/tree.c
    trunk/gcc/cp/typeck.c
    trunk/gcc/testsuite/g++.dg/lookup/pr21802.C
    trunk/gcc/testsuite/g++.old-deja/g++.robertl/eb22.C
    trunk/libcpp/ChangeLog
    trunk/libcpp/include/cpplib.h
    trunk/libcpp/lex.c



More information about the Libstdc++-cvs mailing list