[Bug c++/94058] New: defaulted three way comparison operator defined as deleted when a member is a small bitfield of long type.

okannen at gmail dot com gcc-bugzilla@gcc.gnu.org
Thu Mar 5 17:45:00 GMT 2020


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

            Bug ID: 94058
           Summary: defaulted three way comparison operator defined as
                    deleted when a member is a small bitfield of long
                    type.
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: okannen at gmail dot com
  Target Milestone: ---

Version: GCC 10.0.1 20200229

Exemple of code:
#include <compare>

struct A{
      long i : 48;
      auto operator <=> (const A&) const = default;
      };

struct B{
      long i : 8;
      auto operator <=> (const B&) const = default;
      };

void f(A a, B b){
   a <=> a; //OK
   b <=> b; //error (see bellow)
   }

Error message:
<source>: In function 'void f(A, B)':
<source>:15:11: error: use of deleted function 'constexpr auto
B::operator<=>(const B&) const'
   15 |     b <=> b;
      |           ^
<source>:10:10: note: 'constexpr auto B::operator<=>(const B&) const' is
implicitly deleted because the default definition would be ill-formed:
   10 |     auto operator <=> (const B&) const = default;
      |          ^~~~~~~~
<source>:10:10: warning: narrowing conversion of '((const B*)this)->B::i' from
'long int' to 'int' [-Wnarrowing]
<source>:10:10: warning: narrowing conversion of '<anonymous>.B::i' from 'long
int' to 'int' [-Wnarrowing]
Compiler returned: 1


More information about the Gcc-bugs mailing list