@@ -2112,21 +2112,35 @@ static void DiagnoseNonTriviallyCopyableReason(Sema &SemaRef,
2112
2112
<< diag::TraitNotSatisfiedReason::DeletedDtr << 0
2113
2113
<< D->getDestructor ()->getSourceRange ();
2114
2114
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
+
2127
2134
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
+ }
2130
2144
}
2131
2145
CXXDestructorDecl *Dtr = D->getDestructor ();
2132
2146
if (Dtr && !Dtr->isTrivial ())
0 commit comments