@@ -8255,17 +8255,15 @@ static bool hasCopyTypeOperations(const clang::CXXRecordDecl *decl) {
82558255}
82568256
82578257static bool hasMoveTypeOperations (const clang::CXXRecordDecl *decl) {
8258- if (llvm::any_of (decl->ctors (), [](clang::CXXConstructorDecl *ctor) {
8259- return ctor->isMoveConstructor () &&
8260- (ctor->isDeleted () || ctor->isIneligibleOrNotSelected () ||
8261- ctor->getAccess () != clang::AS_public);
8262- }))
8263- return false ;
8258+ if (decl->hasSimpleMoveConstructor ())
8259+ return true ;
82648260
82658261 return llvm::any_of (decl->ctors (), [](clang::CXXConstructorDecl *ctor) {
8266- return ctor->isMoveConstructor () &&
8262+ return ctor->isMoveConstructor () && !ctor->isDeleted () &&
8263+ !ctor->isIneligibleOrNotSelected () &&
82678264 // FIXME: Support default arguments (rdar://142414553)
8268- ctor->getNumParams () == 1 ;
8265+ ctor->getNumParams () == 1 &&
8266+ ctor->getAccess () == clang::AS_public;
82698267 });
82708268}
82718269
@@ -8397,46 +8395,48 @@ CxxValueSemantics::evaluate(Evaluator &evaluator,
83978395 return CxxValueSemanticsKind::Copyable;
83988396 }
83998397
8400- auto injectedStlAnnotation =
8401- recordDecl->isInStdNamespace ()
8402- ? STLConditionalParams.find (recordDecl->getName ())
8403- : STLConditionalParams.end ();
8404- auto STLParams = injectedStlAnnotation != STLConditionalParams.end ()
8405- ? injectedStlAnnotation->second
8406- : std::vector<int >();
8407- auto conditionalParams = getConditionalCopyableAttrParams (recordDecl);
8408-
8409- if (!STLParams.empty () || !conditionalParams.empty ()) {
8410- HeaderLoc loc{recordDecl->getLocation ()};
8411- std::function checkArgValueSemantics =
8412- [&](clang::TemplateArgument &arg,
8413- StringRef argToCheck) -> std::optional<CxxValueSemanticsKind> {
8414- if (arg.getKind () != clang::TemplateArgument::Type && importerImpl) {
8415- importerImpl->diagnose (loc, diag::type_template_parameter_expected,
8416- argToCheck);
8417- return CxxValueSemanticsKind::Unknown;
8418- }
8398+ if (!hasNonCopyableAttr (recordDecl)) {
8399+ auto injectedStlAnnotation =
8400+ recordDecl->isInStdNamespace ()
8401+ ? STLConditionalParams.find (recordDecl->getName ())
8402+ : STLConditionalParams.end ();
8403+ auto STLParams = injectedStlAnnotation != STLConditionalParams.end ()
8404+ ? injectedStlAnnotation->second
8405+ : std::vector<int >();
8406+ auto conditionalParams = getConditionalCopyableAttrParams (recordDecl);
84198407
8420- auto argValueSemantics = evaluateOrDefault (
8421- evaluator,
8422- CxxValueSemantics (
8423- {arg.getAsType ()->getUnqualifiedDesugaredType (), importerImpl}),
8424- {});
8425- if (argValueSemantics != CxxValueSemanticsKind::Copyable)
8426- return argValueSemantics;
8427- return std::nullopt ;
8428- };
8408+ if (!STLParams.empty () || !conditionalParams.empty ()) {
8409+ HeaderLoc loc{recordDecl->getLocation ()};
8410+ std::function checkArgValueSemantics =
8411+ [&](clang::TemplateArgument &arg,
8412+ StringRef argToCheck) -> std::optional<CxxValueSemanticsKind> {
8413+ if (arg.getKind () != clang::TemplateArgument::Type && importerImpl) {
8414+ importerImpl->diagnose (loc, diag::type_template_parameter_expected,
8415+ argToCheck);
8416+ return CxxValueSemanticsKind::Unknown;
8417+ }
84298418
8430- auto result = checkConditionalParams<CxxValueSemanticsKind>(
8431- recordDecl, STLParams, conditionalParams, checkArgValueSemantics);
8432- if (result.has_value ())
8433- return result.value ();
8419+ auto argValueSemantics = evaluateOrDefault (
8420+ evaluator,
8421+ CxxValueSemantics (
8422+ {arg.getAsType ()->getUnqualifiedDesugaredType (), importerImpl}),
8423+ {});
8424+ if (argValueSemantics != CxxValueSemanticsKind::Copyable)
8425+ return argValueSemantics;
8426+ return std::nullopt ;
8427+ };
84348428
8435- if (importerImpl)
8436- for (auto name : conditionalParams)
8437- importerImpl->diagnose (loc, diag::unknown_template_parameter, name);
8429+ auto result = checkConditionalParams<CxxValueSemanticsKind>(
8430+ recordDecl, STLParams, conditionalParams, checkArgValueSemantics);
8431+ if (result.has_value ())
8432+ return result.value ();
84388433
8439- return CxxValueSemanticsKind::Copyable;
8434+ if (importerImpl)
8435+ for (auto name : conditionalParams)
8436+ importerImpl->diagnose (loc, diag::unknown_template_parameter, name);
8437+
8438+ return CxxValueSemanticsKind::Copyable;
8439+ }
84408440 }
84418441
84428442 const auto cxxRecordDecl = dyn_cast<clang::CXXRecordDecl>(recordDecl);
@@ -8446,7 +8446,8 @@ CxxValueSemantics::evaluate(Evaluator &evaluator,
84468446 return CxxValueSemanticsKind::Copyable;
84478447 }
84488448
8449- bool isCopyable = hasCopyTypeOperations (cxxRecordDecl);
8449+ bool isCopyable = !hasNonCopyableAttr (cxxRecordDecl) &&
8450+ hasCopyTypeOperations (cxxRecordDecl);
84508451 bool isMovable = hasMoveTypeOperations (cxxRecordDecl);
84518452
84528453 if (!hasDestroyTypeOperations (cxxRecordDecl) || (!isCopyable && !isMovable)) {
0 commit comments