================ @@ -2083,6 +2086,87 @@ static void DiagnoseNonTriviallyRelocatableReason(Sema &SemaRef, SemaRef.Diag(D->getLocation(), diag::note_defined_here) << D; } +static void DiagnoseNonTriviallyCopyableReason(Sema &SemaRef, + SourceLocation Loc, + const CXXRecordDecl *D) { + for (const CXXBaseSpecifier &B : D->bases()) { + assert(B.getType()->getAsCXXRecordDecl() && "invalid base?"); + if (B.isVirtual()) + SemaRef.Diag(Loc, diag::note_unsatisfied_trait_reason) + << diag::TraitNotSatisfiedReason::VBase << B.getType() + << B.getSourceRange(); + if (!B.getType().isTriviallyCopyableType(D->getASTContext())) { + SemaRef.Diag(Loc, diag::note_unsatisfied_trait_reason) + << diag::TraitNotSatisfiedReason::NTCBase << B.getType() + << B.getSourceRange(); + } + } + for (const FieldDecl *Field : D->fields()) { + if (!Field->getType().isTriviallyCopyableType(Field->getASTContext())) + SemaRef.Diag(Loc, diag::note_unsatisfied_trait_reason) + << diag::TraitNotSatisfiedReason::NTCField << Field + << Field->getType() << Field->getSourceRange(); + } + if (D->hasDeletedDestructor()) + SemaRef.Diag(Loc, diag::note_unsatisfied_trait_reason) + << diag::TraitNotSatisfiedReason::DeletedDtr << 0 + << D->getDestructor()->getSourceRange(); + + for (const CXXMethodDecl *Method : D->methods()) { + if (Method->isTrivial() || !Method->isUserProvided()) { + continue; + } + auto SpecialMemberKind = + SemaRef.getDefaultedFunctionKind(Method).asSpecialMember(); + switch (SpecialMemberKind) { + case CXXSpecialMemberKind::CopyConstructor: + case CXXSpecialMemberKind::MoveConstructor: + case CXXSpecialMemberKind::CopyAssignment: + case CXXSpecialMemberKind::MoveAssignment: { + bool IsAssignment = + SpecialMemberKind == CXXSpecialMemberKind::CopyAssignment || + SpecialMemberKind == CXXSpecialMemberKind::MoveAssignment; + bool IsMove = + SpecialMemberKind == CXXSpecialMemberKind::MoveConstructor || + SpecialMemberKind == CXXSpecialMemberKind::MoveAssignment; + + SemaRef.Diag(Loc, diag::note_unsatisfied_trait_reason) + << (IsAssignment ? diag::TraitNotSatisfiedReason::UserProvidedAssign + : diag::TraitNotSatisfiedReason::UserProvidedCtr) + << IsMove << Method->getSourceRange(); + break; + } + default: { + break; + } + } + } + CXXDestructorDecl *Dtr = D->getDestructor(); + if (Dtr && !Dtr->isTrivial()) + SemaRef.Diag(Loc, diag::note_unsatisfied_trait_reason) + << diag::TraitNotSatisfiedReason::DeletedDtr << 1 + << Dtr->getSourceRange(); +} ---------------- egorshamshura wrote:
Oh, fixed it, decided to write "has a deleted destructor" https://github.com/llvm/llvm-project/pull/142341 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits