@@ -571,6 +571,39 @@ void swift::conformToCxxIteratorIfNeeded(
571571 decl, {KnownProtocolKind::UnsafeCxxRandomAccessIterator});
572572}
573573
574+ void swift::conformToCxxConvertibleToBoolIfNeeded (
575+ ClangImporter::Implementation &impl, swift::NominalTypeDecl *decl,
576+ const clang::CXXRecordDecl *clangDecl) {
577+ PrettyStackTraceDecl trace (" conforming to CxxConvertibleToBool" , decl);
578+
579+ assert (decl);
580+ assert (clangDecl);
581+ ASTContext &ctx = decl->getASTContext ();
582+
583+ auto conversionId = ctx.getIdentifier (" __convertToBool" );
584+ auto conversions = lookupDirectWithoutExtensions (decl, conversionId);
585+
586+ // Find a non-mutating overload of `__convertToBool`.
587+ FuncDecl *conversion = nullptr ;
588+ for (auto c : conversions) {
589+ auto candidate = dyn_cast<FuncDecl>(c);
590+ if (!candidate || candidate->isMutating ())
591+ continue ;
592+ if (conversion)
593+ // Overload ambiguity?
594+ return ;
595+ conversion = candidate;
596+ }
597+ if (!conversion)
598+ return ;
599+ auto conversionTy = conversion->getResultInterfaceType ();
600+ if (!conversionTy->isBool ())
601+ return ;
602+
603+ impl.addSynthesizedProtocolAttrs (decl,
604+ {KnownProtocolKind::CxxConvertibleToBool});
605+ }
606+
574607void swift::conformToCxxOptionalIfNeeded (
575608 ClangImporter::Implementation &impl, NominalTypeDecl *decl,
576609 const clang::CXXRecordDecl *clangDecl) {
0 commit comments