From 2610a414c33ce192679c9774a91739b73f24bb74 Mon Sep 17 00:00:00 2001 From: Egor Zhdan Date: Thu, 25 Sep 2025 13:13:11 +0100 Subject: [PATCH 1/2] [cxx-interop] Add missing `// REQUIRES: executable_test` rdar://161132127 (cherry picked from commit 172b998fae61213fa189a5173c54206c73fc23ec) --- .../Cxx/foreign-reference/lifetime-operation-methods.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/Interop/Cxx/foreign-reference/lifetime-operation-methods.swift b/test/Interop/Cxx/foreign-reference/lifetime-operation-methods.swift index 64f7c700e5a54..6264c788dd808 100644 --- a/test/Interop/Cxx/foreign-reference/lifetime-operation-methods.swift +++ b/test/Interop/Cxx/foreign-reference/lifetime-operation-methods.swift @@ -1,5 +1,7 @@ // RUN: %target-run-simple-swift(-I %S/Inputs -cxx-interoperability-mode=upcoming-swift -I %swift_src_root/lib/ClangImporter/SwiftBridging -Xfrontend -disable-availability-checking) +// REQUIRES: executable_test + // Temporarily disable when running with an older runtime (rdar://128681137) // UNSUPPORTED: use_os_stdlib // UNSUPPORTED: back_deployment_runtime From 6fc3dfbcb4da7b93139daeca4da326d846b25e51 Mon Sep 17 00:00:00 2001 From: Egor Zhdan Date: Fri, 26 Sep 2025 16:08:15 +0100 Subject: [PATCH 2/2] [cxx-interop] Fix lifetime-operation-methods.swift in optimized mode (cherry picked from commit 92c97290f170fcc6a50b09800be49bfe5411e3c2) --- .../foreign-reference/Inputs/lifetime-operation-methods.h | 8 ++++---- .../foreign-reference/lifetime-operation-methods.swift | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/Interop/Cxx/foreign-reference/Inputs/lifetime-operation-methods.h b/test/Interop/Cxx/foreign-reference/Inputs/lifetime-operation-methods.h index b101f0998e859..1eac66fbe2cd0 100644 --- a/test/Interop/Cxx/foreign-reference/Inputs/lifetime-operation-methods.h +++ b/test/Interop/Cxx/foreign-reference/Inputs/lifetime-operation-methods.h @@ -62,18 +62,18 @@ struct CRTPDerived : CRTPBase { struct VirtualRetainRelease { int value; mutable int refCount = 1; + mutable bool calledBase = false; VirtualRetainRelease(int value) : value(value) {} - virtual void doRetainVirtual() const { refCount++; } - virtual void doReleaseVirtual() const { refCount--; } + virtual void doRetainVirtual() const { refCount++; calledBase = true; } + virtual void doReleaseVirtual() const { refCount--; calledBase = true; } virtual ~VirtualRetainRelease() = default; } SWIFT_SHARED_REFERENCE(.doRetainVirtual, .doReleaseVirtual); struct DerivedVirtualRetainRelease : VirtualRetainRelease { DerivedVirtualRetainRelease(int value) : VirtualRetainRelease(value) {} - mutable bool calledDerived = false; - void doRetainVirtual() const override { refCount++; calledDerived = true; } + void doRetainVirtual() const override { refCount++; } void doReleaseVirtual() const override { refCount--; } }; diff --git a/test/Interop/Cxx/foreign-reference/lifetime-operation-methods.swift b/test/Interop/Cxx/foreign-reference/lifetime-operation-methods.swift index 6264c788dd808..f2e3532662cf9 100644 --- a/test/Interop/Cxx/foreign-reference/lifetime-operation-methods.swift +++ b/test/Interop/Cxx/foreign-reference/lifetime-operation-methods.swift @@ -63,7 +63,7 @@ LifetimeMethodsTestSuite.test("virtual retain/release") { LifetimeMethodsTestSuite.test("overridden virtual retain/release") { let a = DerivedVirtualRetainRelease(456) expectEqual(a.value, 456) - expectTrue(a.calledDerived) + expectFalse(a.calledBase) // in optimized builds, we might not call retain/release at all expectTrue(a.refCount > 0) expectTrue(a.refCount < 10) // optimizations would affect the exact number }