@@ -2112,21 +2112,35 @@ static void DiagnoseNonTriviallyCopyableReason(Sema &SemaRef,
21122112 << diag::TraitNotSatisfiedReason::DeletedDtr << 0
21132113 << D->getDestructor ()->getSourceRange ();
21142114
2115- if (!D->hasSimpleMoveConstructor () && !D->hasSimpleCopyConstructor ()) {
2116- const auto *Decl = cast<CXXConstructorDecl>(
2117- LookupSpecialMemberFromXValue (SemaRef, D, /* Assign=*/ false ));
2118- if (Decl && Decl->isUserProvided ())
2119- SemaRef.Diag (Loc, diag::note_unsatisfied_trait_reason)
2120- << diag::TraitNotSatisfiedReason::UserProvidedCtr
2121- << Decl->isMoveConstructor () << Decl->getSourceRange ();
2122- }
2123- if (!D->hasSimpleMoveAssignment () && !D->hasSimpleCopyAssignment ()) {
2124- CXXMethodDecl *Decl =
2125- LookupSpecialMemberFromXValue (SemaRef, D, /* Assign=*/ true );
2126- if (Decl && Decl->isUserProvided ())
2115+ for (const CXXMethodDecl *Method : D->methods ()) {
2116+ if (Method->isIneligibleOrNotSelected () || Method->isTrivial () ||
2117+ !Method->isUserProvided ()) {
2118+ continue ;
2119+ }
2120+ auto SpecialMemberKind =
2121+ SemaRef.getDefaultedFunctionKind (Method).asSpecialMember ();
2122+ switch (SpecialMemberKind) {
2123+ case CXXSpecialMemberKind::CopyConstructor:
2124+ case CXXSpecialMemberKind::MoveConstructor:
2125+ case CXXSpecialMemberKind::CopyAssignment:
2126+ case CXXSpecialMemberKind::MoveAssignment: {
2127+ bool IsAssignment =
2128+ SpecialMemberKind == CXXSpecialMemberKind::CopyAssignment ||
2129+ SpecialMemberKind == CXXSpecialMemberKind::MoveAssignment;
2130+ bool IsMove =
2131+ SpecialMemberKind == CXXSpecialMemberKind::MoveConstructor ||
2132+ SpecialMemberKind == CXXSpecialMemberKind::MoveAssignment;
2133+
21272134 SemaRef.Diag (Loc, diag::note_unsatisfied_trait_reason)
2128- << diag::TraitNotSatisfiedReason::UserProvidedAssign
2129- << Decl->isMoveAssignmentOperator () << Decl->getSourceRange ();
2135+ << (IsAssignment ? diag::TraitNotSatisfiedReason::UserProvidedAssign
2136+ : diag::TraitNotSatisfiedReason::UserProvidedCtr)
2137+ << IsMove << Method->getSourceRange ();
2138+ break ;
2139+ }
2140+ default : {
2141+ break ;
2142+ }
2143+ }
21302144 }
21312145 CXXDestructorDecl *Dtr = D->getDestructor ();
21322146 if (Dtr && !Dtr->isTrivial ())
0 commit comments