diff --git a/lib/Sema/CSSimplify.cpp b/lib/Sema/CSSimplify.cpp index 5f3f7c8251c36..6162bf3b29056 100644 --- a/lib/Sema/CSSimplify.cpp +++ b/lib/Sema/CSSimplify.cpp @@ -6636,8 +6636,12 @@ static ConstraintFix *maybeWarnAboutExtraneousCast( } // Except for forced cast expressions, if optionals are more than a single - // level difference, we don't need to record any fix. - if (!isExpr(anchor) && extraOptionals > 1) + // level difference or there is a single level between the types but an extra + // level of optional is added to subexpr via OptionalEvaluationExpr, we don't + // need to record any fix. + if (!isExpr(anchor) && + (extraOptionals > 1 || + isExpr(castExpr->getSubExpr()))) return nullptr; // Always succeed diff --git a/test/Constraints/casts.swift b/test/Constraints/casts.swift index dc9861a802c3b..a4d408f68031e 100644 --- a/test/Constraints/casts.swift +++ b/test/Constraints/casts.swift @@ -535,3 +535,17 @@ protocol PP2: PP1 { } extension Optional: PP1 where Wrapped == PP2 { } nil is PP1 // expected-error {{'nil' requires a contextual type}} + +// SR-15039 +enum ChangeType { + case initial(T) + case delta(previous: T, next: T) + case unset + + var delta: (previous: T?, next: T)? { nil } +} + +extension ChangeType where T == String? { + var foo: String? { return self.delta?.previous as? String } // OK + var bar: String? { self.delta?.next } +}