From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1888) id C6FA63858C2C; Thu, 30 Sep 2021 21:51:47 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C6FA63858C2C MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Patrick Palka To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-3995] c++: defaulted comparisons and vptr fields [PR95567] X-Act-Checkin: gcc X-Git-Author: Patrick Palka X-Git-Refname: refs/heads/master X-Git-Oldrev: bffb580d6f0e8b6f9623128d38ea653a99a58d49 X-Git-Newrev: b6bca2e631b54f992c058ca8e445b45e9816690b Message-Id: <20210930215147.C6FA63858C2C@sourceware.org> Date: Thu, 30 Sep 2021 21:51:47 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Sep 2021 21:51:47 -0000 https://gcc.gnu.org/g:b6bca2e631b54f992c058ca8e445b45e9816690b commit r12-3995-gb6bca2e631b54f992c058ca8e445b45e9816690b Author: Patrick Palka Date: Thu Sep 30 17:29:05 2021 -0400 c++: defaulted comparisons and vptr fields [PR95567] We need to explicitly skip over vptr fields when synthesizing a defaulted comparison operator, because next_initializable_field doesn't do so for us. PR c++/95567 gcc/cp/ChangeLog: * method.c (build_comparison_op): Skip DECL_VIRTUAL_P fields. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/spaceship-virtual1.C: New test. Diff: --- gcc/cp/method.c | 4 ++++ gcc/testsuite/g++.dg/cpp2a/spaceship-virtual1.C | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 32f7186a774..3c3495227ce 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -1426,6 +1426,10 @@ build_comparison_op (tree fndecl, tsubst_flags_t complain) field; field = next_initializable_field (DECL_CHAIN (field))) { + if (DECL_VIRTUAL_P (field)) + /* Don't compare vptr fields. */ + continue; + tree expr_type = TREE_TYPE (field); location_t field_loc = DECL_SOURCE_LOCATION (field); diff --git a/gcc/testsuite/g++.dg/cpp2a/spaceship-virtual1.C b/gcc/testsuite/g++.dg/cpp2a/spaceship-virtual1.C new file mode 100644 index 00000000000..8067d3cd9d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/spaceship-virtual1.C @@ -0,0 +1,20 @@ +// PR c++/95567 +// { dg-do run { target c++20 } } + +struct B { + B(int i) : i(i) {} + virtual ~B() = default; + + bool operator==(B const&) const = default; + int i; +}; + +struct D : B { + D(int i, int j) : B(i), j(j) {} + int j; +}; + +int main() { + if (B(2) != D(2, 3)) + __builtin_abort(); +}