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

            Bug ID: 103689
           Summary: Overriding spaceship operator when parent class does
                    not define spaceship operator for itself
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: fchelnokov at gmail dot com
  Target Milestone: ---

The following program is ill-formed:
```
#include <compare>

struct A;

struct I {
    virtual std::strong_ordering operator <=>(const A&) const { return
std::strong_ordering::equal; }
};

struct A : I {
    virtual std::strong_ordering operator <=>(const A&) const = default;
};

int main() {
    A a;
    I & i = a;
    return (i <=> a) == 0;
}
```
since I::operator <=>(const I&) const is not defined, so A::operator <=>(const
A&) const must be implicitly deleted, and a deleted method cannot override a
not deleted method from I. This must be a compilation error (as in Clang). 

GCC compiles it fine, but issues a linker error 
```
undefined reference to `A::operator==(A const&) const'
```
Demo: https://gcc.godbolt.org/z/Geoqdo4T8

Related discussion: https://stackoverflow.com/q/70334766/7325599

Reply via email to