@@ -8237,17 +8237,15 @@ static bool hasCopyTypeOperations(const clang::CXXRecordDecl *decl) {
82378237}
82388238
82398239static bool hasMoveTypeOperations (const clang::CXXRecordDecl *decl) {
8240- if (llvm::any_of (decl->ctors (), [](clang::CXXConstructorDecl *ctor) {
8241- return ctor->isMoveConstructor () &&
8242- (ctor->isDeleted () || ctor->isIneligibleOrNotSelected () ||
8243- ctor->getAccess () != clang::AS_public);
8244- }))
8245- return false ;
8240+ if (decl->hasSimpleMoveConstructor ())
8241+ return true ;
82468242
82478243 return llvm::any_of (decl->ctors (), [](clang::CXXConstructorDecl *ctor) {
8248- return ctor->isMoveConstructor () &&
8244+ return ctor->isMoveConstructor () && !ctor->isDeleted () &&
8245+ !ctor->isIneligibleOrNotSelected () &&
82498246 // FIXME: Support default arguments (rdar://142414553)
8250- ctor->getNumParams () == 1 ;
8247+ ctor->getNumParams () == 1 &&
8248+ ctor->getAccess () == clang::AS_public;
82518249 });
82528250}
82538251
@@ -8379,46 +8377,48 @@ CxxValueSemantics::evaluate(Evaluator &evaluator,
83798377 return CxxValueSemanticsKind::Copyable;
83808378 }
83818379
8382- auto injectedStlAnnotation =
8383- recordDecl->isInStdNamespace ()
8384- ? STLConditionalParams.find (recordDecl->getName ())
8385- : STLConditionalParams.end ();
8386- auto STLParams = injectedStlAnnotation != STLConditionalParams.end ()
8387- ? injectedStlAnnotation->second
8388- : std::vector<int >();
8389- auto conditionalParams = getConditionalCopyableAttrParams (recordDecl);
8390-
8391- if (!STLParams.empty () || !conditionalParams.empty ()) {
8392- HeaderLoc loc{recordDecl->getLocation ()};
8393- std::function checkArgValueSemantics =
8394- [&](clang::TemplateArgument &arg,
8395- StringRef argToCheck) -> std::optional<CxxValueSemanticsKind> {
8396- if (arg.getKind () != clang::TemplateArgument::Type && importerImpl) {
8397- importerImpl->diagnose (loc, diag::type_template_parameter_expected,
8398- argToCheck);
8399- return CxxValueSemanticsKind::Unknown;
8400- }
8380+ if (!hasNonCopyableAttr (recordDecl)) {
8381+ auto injectedStlAnnotation =
8382+ recordDecl->isInStdNamespace ()
8383+ ? STLConditionalParams.find (recordDecl->getName ())
8384+ : STLConditionalParams.end ();
8385+ auto STLParams = injectedStlAnnotation != STLConditionalParams.end ()
8386+ ? injectedStlAnnotation->second
8387+ : std::vector<int >();
8388+ auto conditionalParams = getConditionalCopyableAttrParams (recordDecl);
84018389
8402- auto argValueSemantics = evaluateOrDefault (
8403- evaluator,
8404- CxxValueSemantics (
8405- {arg.getAsType ()->getUnqualifiedDesugaredType (), importerImpl}),
8406- {});
8407- if (argValueSemantics != CxxValueSemanticsKind::Copyable)
8408- return argValueSemantics;
8409- return std::nullopt ;
8410- };
8390+ if (!STLParams.empty () || !conditionalParams.empty ()) {
8391+ HeaderLoc loc{recordDecl->getLocation ()};
8392+ std::function checkArgValueSemantics =
8393+ [&](clang::TemplateArgument &arg,
8394+ StringRef argToCheck) -> std::optional<CxxValueSemanticsKind> {
8395+ if (arg.getKind () != clang::TemplateArgument::Type && importerImpl) {
8396+ importerImpl->diagnose (loc, diag::type_template_parameter_expected,
8397+ argToCheck);
8398+ return CxxValueSemanticsKind::Unknown;
8399+ }
84118400
8412- auto result = checkConditionalParams<CxxValueSemanticsKind>(
8413- recordDecl, STLParams, conditionalParams, checkArgValueSemantics);
8414- if (result.has_value ())
8415- return result.value ();
8401+ auto argValueSemantics = evaluateOrDefault (
8402+ evaluator,
8403+ CxxValueSemantics (
8404+ {arg.getAsType ()->getUnqualifiedDesugaredType (), importerImpl}),
8405+ {});
8406+ if (argValueSemantics != CxxValueSemanticsKind::Copyable)
8407+ return argValueSemantics;
8408+ return std::nullopt ;
8409+ };
84168410
8417- if (importerImpl)
8418- for (auto name : conditionalParams)
8419- importerImpl->diagnose (loc, diag::unknown_template_parameter, name);
8411+ auto result = checkConditionalParams<CxxValueSemanticsKind>(
8412+ recordDecl, STLParams, conditionalParams, checkArgValueSemantics);
8413+ if (result.has_value ())
8414+ return result.value ();
84208415
8421- return CxxValueSemanticsKind::Copyable;
8416+ if (importerImpl)
8417+ for (auto name : conditionalParams)
8418+ importerImpl->diagnose (loc, diag::unknown_template_parameter, name);
8419+
8420+ return CxxValueSemanticsKind::Copyable;
8421+ }
84228422 }
84238423
84248424 const auto cxxRecordDecl = dyn_cast<clang::CXXRecordDecl>(recordDecl);
@@ -8428,7 +8428,8 @@ CxxValueSemantics::evaluate(Evaluator &evaluator,
84288428 return CxxValueSemanticsKind::Copyable;
84298429 }
84308430
8431- bool isCopyable = hasCopyTypeOperations (cxxRecordDecl);
8431+ bool isCopyable = !hasNonCopyableAttr (cxxRecordDecl) &&
8432+ hasCopyTypeOperations (cxxRecordDecl);
84328433 bool isMovable = hasMoveTypeOperations (cxxRecordDecl);
84338434
84348435 if (!hasDestroyTypeOperations (cxxRecordDecl) || (!isCopyable && !isMovable)) {
0 commit comments