diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -8979,8 +8979,8 @@ "defaulted %0 is implicitly deleted because it would invoke a deleted " "comparison function%select{| for member %2| for base class %2}1">; def note_defaulted_comparison_no_viable_function : Note< - "defaulted %0 is implicitly deleted because there is no viable comparison " - "function%select{| for member %2| for base class %2}1">; + "defaulted %0 is implicitly deleted because there is no viable three-way " + "comparison function for%select{| member| base class}1 %2">; def note_defaulted_comparison_no_viable_function_synthesized : Note< "three-way comparison cannot be synthesized because there is no viable " "function for %select{'=='|'<'}0 comparison">; diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7632,7 +7632,7 @@ private: Subobject getCompleteObject() { - return Subobject{Subobject::CompleteObject, nullptr, FD->getLocation()}; + return Subobject{Subobject::CompleteObject, RD, FD->getLocation()}; } Subobject getBase(CXXBaseSpecifier *Base) { diff --git a/clang/test/CXX/class/class.compare/class.compare.default/p1.cpp b/clang/test/CXX/class/class.compare/class.compare.default/p1.cpp --- a/clang/test/CXX/class/class.compare/class.compare.default/p1.cpp +++ b/clang/test/CXX/class/class.compare/class.compare.default/p1.cpp @@ -127,7 +127,7 @@ friend bool operator==(A &, A &); // expected-note {{would lose const qualifier}} }; struct B { - A a; // expected-note {{no viable comparison}} + A a; // expected-note {{no viable three-way comparison}} friend bool operator==(B, B) = default; // ok friend bool operator==(const B&, const B&) = default; // expected-warning {{deleted}} }; diff --git a/clang/test/CXX/class/class.compare/class.compare.default/p2.cpp b/clang/test/CXX/class/class.compare/class.compare.default/p2.cpp --- a/clang/test/CXX/class/class.compare/class.compare.default/p2.cpp +++ b/clang/test/CXX/class/class.compare/class.compare.default/p2.cpp @@ -44,7 +44,7 @@ bool operator==(const A3 &) const = default; // expected-warning {{implicitly deleted}} bool operator<(const A3 &) const = default; // expected-warning {{implicitly deleted}} - // expected-note@-1 {{because there is no viable comparison function}} + // expected-note@-1 {{because there is no viable three-way comparison function for 'A3'}} }; struct B1 { diff --git a/clang/test/CXX/class/class.compare/class.compare.default/p4.cpp b/clang/test/CXX/class/class.compare/class.compare.default/p4.cpp --- a/clang/test/CXX/class/class.compare/class.compare.default/p4.cpp +++ b/clang/test/CXX/class/class.compare/class.compare.default/p4.cpp @@ -99,7 +99,7 @@ struct Q { struct X { friend std::strong_ordering operator<=>(const X&, const X&); - } x; // expected-note {{no viable comparison}} + } x; // expected-note {{no viable three-way comparison}} // expected-error@+1 {{defaulting the corresponding implicit 'operator==' for this defaulted 'operator<=>' would delete it after its first declaration}} friend std::strong_ordering operator<=>(const Q&, const Q&) = default; }; diff --git a/clang/test/CXX/class/class.compare/class.eq/p2.cpp b/clang/test/CXX/class/class.compare/class.eq/p2.cpp --- a/clang/test/CXX/class/class.compare/class.eq/p2.cpp +++ b/clang/test/CXX/class/class.compare/class.eq/p2.cpp @@ -18,26 +18,26 @@ struct H1 { bool operator==(const H1 &) const = default; bool operator<(const H1 &) const = default; // expected-warning {{implicitly deleted}} - // expected-note@-1 {{because there is no viable comparison function}} + // expected-note@-1 {{because there is no viable three-way comparison function for 'H1'}} void (*x)(); }; struct H2 { bool operator==(const H2 &) const = default; bool operator<(const H2 &) const = default; // expected-warning {{implicitly deleted}} - // expected-note@-1 {{because there is no viable comparison function}} + // expected-note@-1 {{because there is no viable three-way comparison function for 'H2'}} void (H2::*x)(); }; struct H3 { bool operator==(const H3 &) const = default; bool operator<(const H3 &) const = default; // expected-warning {{implicitly deleted}} - // expected-note@-1 {{because there is no viable comparison function}} + // expected-note@-1 {{because there is no viable three-way comparison function for 'H3'}} int H3::*x; }; template struct X { X(); bool operator==(const X&) const = default; // #x expected-note 4{{deleted here}} - T t; // expected-note 3{{because there is no viable comparison function for member 't'}} + T t; // expected-note 3{{because there is no viable three-way comparison function for member 't'}} // expected-note@-1 {{because it would invoke a deleted comparison function for member 't'}} }; diff --git a/clang/test/CXX/class/class.compare/class.spaceship/p1.cpp b/clang/test/CXX/class/class.compare/class.spaceship/p1.cpp --- a/clang/test/CXX/class/class.compare/class.spaceship/p1.cpp +++ b/clang/test/CXX/class/class.compare/class.spaceship/p1.cpp @@ -78,9 +78,9 @@ }; // expected-note@#base {{deleted comparison function for base class 'C'}} - // expected-note@#base {{no viable comparison function for base class 'D1'}} + // expected-note@#base {{no viable three-way comparison function for base class 'D1'}} // expected-note@#base {{three-way comparison cannot be synthesized because there is no viable function for '<' comparison}} - // expected-note@#base {{no viable comparison function for base class 'D2'}} + // expected-note@#base {{no viable three-way comparison function for base class 'D2'}} // expected-note@#base {{three-way comparison cannot be synthesized because there is no viable function for '==' comparison}} // expected-note@#base {{deleted comparison function for base class 'E'}} // expected-note@#base {{implied comparison for base class 'F' is ambiguous}} @@ -110,9 +110,9 @@ } // expected-note@#arr {{deleted comparison function for member 'arr'}} - // expected-note@#arr {{no viable comparison function for member 'arr'}} + // expected-note@#arr {{no viable three-way comparison function for member 'arr'}} // expected-note@#arr {{three-way comparison cannot be synthesized because there is no viable function for '<' comparison}} - // expected-note@#arr {{no viable comparison function for member 'arr'}} + // expected-note@#arr {{no viable three-way comparison function for member 'arr'}} // expected-note@#arr {{three-way comparison cannot be synthesized because there is no viable function for '==' comparison}} // expected-note@#arr {{deleted comparison function for member 'arr'}} // expected-note@#arr {{implied comparison for member 'arr' is ambiguous}} diff --git a/clang/test/CXX/class/class.compare/class.spaceship/p2.cpp b/clang/test/CXX/class/class.compare/class.spaceship/p2.cpp --- a/clang/test/CXX/class/class.compare/class.spaceship/p2.cpp +++ b/clang/test/CXX/class/class.compare/class.spaceship/p2.cpp @@ -52,7 +52,7 @@ bool operator<(const A&) const; }; struct B { - A a; // expected-note {{no viable comparison function for member 'a'}} + A a; // expected-note {{no viable three-way comparison function for member 'a'}} auto operator<=>(const B&) const = default; // expected-warning {{implicitly deleted}} }; } @@ -159,16 +159,16 @@ namespace PR48856 { struct A { auto operator<=>(const A &) const = default; // expected-warning {{implicitly deleted}} - void (*x)(); // expected-note {{because there is no viable comparison function for member 'x'}} + void (*x)(); // expected-note {{because there is no viable three-way comparison function for member 'x'}} }; struct B { auto operator<=>(const B &) const = default; // expected-warning {{implicitly deleted}} - void (B::*x)(); // expected-note {{because there is no viable comparison function for member 'x'}} + void (B::*x)(); // expected-note {{because there is no viable three-way comparison function for member 'x'}} }; struct C { auto operator<=>(const C &) const = default; // expected-warning {{implicitly deleted}} - int C::*x; // expected-note {{because there is no viable comparison function for member 'x'}} + int C::*x; // expected-note {{because there is no viable three-way comparison function for member 'x'}} }; }