public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "feildel+gccbugzilla@corona-renderer.com" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/94061] defaulted member operator <=> defined as deleted if a base has protected member operator <=>
Date: Tue, 12 Apr 2022 09:07:13 +0000	[thread overview]
Message-ID: <bug-94061-4-l7ZPUF9JGF@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-94061-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94061

--- Comment #4 from Baudouin Feildel <feildel+gccbugzilla@corona-renderer.com> ---
We also ran into this issue with operator==(). This behavior might be explained
by some implementation detail of the generated code for the operator, but we
believe it is wrong because it is inconsistent, see the following example
(https://godbolt.org/z/f4EjojExh):

struct Base {
  protected:
    Base() = default;
    bool operator==(const Base& other) const = default;
};

struct Child : Base {
    int         i = 0;
    Child() = default;
    bool operator==(const Child& other) const = default;
};

int main() 
{
    Child a1;
    Child b1;
    return a1 == b1;
}

Here calling protected constructor in defaulted ctor is totally fine. But
trying to do the same with comparison operator fails with the following
compiler error:

<source>: In function 'int main()':
<source>:17:18: error: use of deleted function 'constexpr bool
Child::operator==(const Child&) const'
   17 |     return a1 == b1;
      |                  ^~
<source>:10:10: note: 'constexpr bool Child::operator==(const Child&) const' is
implicitly deleted because the default definition would be ill-formed:
   10 |     bool operator==(const Child& other) const = default;
      |          ^~~~~~~~
<source>:10:10: error: 'bool Base::operator==(const Base&) const' is protected
within this context
<source>:4:10: note: declared protected here
    4 |     bool operator==(const Base& other) const = default;
      |          ^~~~~~~~




This behavior is unfortunate and make it very difficult to use defaulted
operator== when you have a common base class that should not be comparable. See
this other example: https://godbolt.org/z/v78r1nYr9.

  parent reply	other threads:[~2022-04-12  9:07 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <bug-94061-4@http.gcc.gnu.org/bugzilla/>
2022-01-08  1:06 ` f.heckenbach@fh-soft.de
2022-01-08 16:35 ` ppalka at gcc dot gnu.org
2022-01-08 21:59 ` f.heckenbach@fh-soft.de
2022-04-12  9:07 ` feildel+gccbugzilla@corona-renderer.com [this message]
2024-04-24  7:42 ` gcc-90 at tbilles dot hu
2024-04-24 21:31 ` ppalka at gcc dot gnu.org
2024-04-24 21:32 ` ppalka at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-94061-4-l7ZPUF9JGF@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).