diff --git a/lib/Sema/TypeCheckEffects.cpp b/lib/Sema/TypeCheckEffects.cpp index 6ae2b8c46a916..03278fceb32fd 100644 --- a/lib/Sema/TypeCheckEffects.cpp +++ b/lib/Sema/TypeCheckEffects.cpp @@ -386,7 +386,7 @@ class AbstractFunction { Type getType() const { switch (getKind()) { case Kind::Opaque: - return getOpaqueFunction()->getType()->lookThroughSingleOptionalType(); + return getOpaqueFunction()->getType()->lookThroughAllOptionalTypes(); case Kind::Function: { auto *AFD = getFunction(); if (AFD->hasImplicitSelfDecl() && AppliedSelf) @@ -395,8 +395,7 @@ class AbstractFunction { } case Kind::Closure: return getClosure()->getType(); case Kind::Parameter: - return getParameter()->getInterfaceType() - ->lookThroughSingleOptionalType(); + return getParameter()->getInterfaceType()->lookThroughAllOptionalTypes(); } llvm_unreachable("bad kind"); } diff --git a/validation-test/Sema/type_checker_crashers_fixed/rdar151943924.swift b/validation-test/Sema/type_checker_crashers_fixed/rdar151943924.swift new file mode 100644 index 0000000000000..6b0cde035d736 --- /dev/null +++ b/validation-test/Sema/type_checker_crashers_fixed/rdar151943924.swift @@ -0,0 +1,18 @@ +// RUN: %target-typecheck-verify-swift + +@propertyWrapper +struct Weak { + var wrappedValue: Value? { fatalError() } +} + +struct WeakStorage { + @Weak var action: ((Set) -> Void)?? +} + +final class Test { + var storage: WeakStorage = .init() + + func test(items: Set) { + storage.action??(items) + } +}