1 // RUN: %clang_cc1 -std=c++2a -verify %s 2 3 struct Good { 4 int operator<=>(const Good&) const; 5 6 bool operator<(const Good&) const = default; 7 bool operator>(const Good&) const = default; 8 friend bool operator<=(const Good&, const Good&) = default; 9 friend bool operator>=(const Good&, const Good&) = default; 10 }; 11 12 enum Bool : bool {}; 13 struct Bad { 14 bool &operator<(const Bad&) const = default; // expected-error {{return type for defaulted relational comparison operator must be 'bool', not 'bool &'}} 15 const bool operator>(const Bad&) const = default; // expected-error {{return type for defaulted relational comparison operator must be 'bool', not 'const bool'}} 16 friend Bool operator<=(const Bad&, const Bad&) = default; // expected-error {{return type for defaulted relational comparison operator must be 'bool', not 'Bool'}} 17 friend int operator>=(const Bad&, const Bad&) = default; // expected-error {{return type for defaulted relational comparison operator must be 'bool', not 'int'}} 18 }; 19 20 template<typename T> struct Ugly { 21 T operator<(const Ugly&) const = default; // expected-error {{return type}} 22 T operator>(const Ugly&) const = default; // expected-error {{return type}} 23 friend T operator<=(const Ugly&, const Ugly&) = default; // expected-error {{return type}} 24 friend T operator>=(const Ugly&, const Ugly&) = default; // expected-error {{return type}} 25 }; 26 template struct Ugly<bool>; 27 template struct Ugly<int>; // expected-note {{in instantiation of}} 28