diff --git a/include/swift/Basic/Features.def b/include/swift/Basic/Features.def index f8bc6d1ccda41..3404fef25e53e 100644 --- a/include/swift/Basic/Features.def +++ b/include/swift/Basic/Features.def @@ -256,6 +256,7 @@ LANGUAGE_FEATURE(RawIdentifiers, 451, "Raw identifiers") LANGUAGE_FEATURE(SendableCompletionHandlers, 463, "Objective-C completion handler parameters are imported as @Sendable") LANGUAGE_FEATURE(IsolatedConformances, 470, "Global-actor isolated conformances") LANGUAGE_FEATURE(AsyncExecutionBehaviorAttributes, 0, "@concurrent and nonisolated(nonsending)") +LANGUAGE_FEATURE(GeneralizedIsSameMetaTypeBuiltin, 465, "Builtin.is_same_metatype with support for noncopyable/nonescapable types") // Swift 6 UPCOMING_FEATURE(ConciseMagicFile, 274, 6) diff --git a/lib/AST/FeatureSet.cpp b/lib/AST/FeatureSet.cpp index f0d59db2f9752..5465aefd60625 100644 --- a/lib/AST/FeatureSet.cpp +++ b/lib/AST/FeatureSet.cpp @@ -491,6 +491,8 @@ static bool usesFeatureCoroutineAccessors(Decl *decl) { } } +UNINTERESTING_FEATURE(GeneralizedIsSameMetaTypeBuiltin) + static bool usesFeatureCustomAvailability(Decl *decl) { for (auto attr : decl->getSemanticAvailableAttrs()) { if (attr.getDomain().isCustom()) diff --git a/stdlib/public/core/Builtin.swift b/stdlib/public/core/Builtin.swift index a2bea81aec659..c7533092e5a71 100644 --- a/stdlib/public/core/Builtin.swift +++ b/stdlib/public/core/Builtin.swift @@ -175,7 +175,15 @@ public func == ( case (.none, .none): return true case let (.some(ty0), .some(ty1)): +#if compiler(>=5.3) && $GeneralizedIsSameMetaTypeBuiltin return Bool(Builtin.is_same_metatype(ty0, ty1)) +#else + // FIXME: Remove this branch once all supported compilers understand the + // generalized is_same_metatype builtin + let p1 = unsafeBitCast(ty0, to: UnsafeRawPointer.self) + let p2 = unsafeBitCast(ty1, to: UnsafeRawPointer.self) + return p1 == p2 +#endif default: return false }