Skip to content

Commit 65ca243

Browse files
committed
Fixed for eligible special member functions
1 parent 8edd53d commit 65ca243

File tree

1 file changed

+28
-14
lines changed

1 file changed

+28
-14
lines changed

clang/lib/Sema/SemaTypeTraits.cpp

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)