Skip to content

[6.2] Bypass lifetime diagnostics in interfaces for copied arguments. #81118

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: release/6.2
Choose a base branch
from

Conversation

atrick
Copy link
Contributor

@atrick atrick commented Apr 26, 2025

main PR: #81105

  • LifetimeDependenceScopeFixup: cleanup for clarity
    (cherry picked from commit bb9e52c)

  • [NFC] LifetimeDependenceUtils comment
    (cherry picked from commit 0603645)

  • Fix LifetimeDependence attribute checking
    Handle parameters with no name: foo(_:T)

    (cherry picked from commit a7c9b6e)

  • Fix LifetimeDependenceDiagnostics: handle mark_dependence_addr
    A small typo meant that scoped dependencies modeled with mark_dependence_addr
    were not diagnosed.

    (cherry picked from commit 92b2a85)

  • Fix LifetimeDependenceDiagnostics: scoped dependence on a copy
    Diagnose a scoped dependence on an argument that inherits its lifetime as an
    error:

    @Lifetime(borrow arg)
    func reborrowSpan(_ arg: Span) -> Span { arg }

    @Lifetime(copy span)
    public func testBorrowInheritedArg(_ span: Span) -> Span {
    reborrowSpan(span) // expected-error {{lifetime-dependent value escapes its scope}}
    }

    Fixes: rdar://146319009 ([nonescapable] enforce borrow constraint narrowing of inherited lifetime)
    (cherry picked from commit 4f470a1)

  • Add .swiftinterface tests to check backward compatibility.
    (cherry picked from commit 49a8770)

  • Add _overrideLifetime to Span APIs
    The implementation previously took advantage of a missing diagnostic. They
    returned a borrowed Span with a dependency on a copied argument. This illegally
    promotes the dependency. This is what the author intended to do (the
    implementation was correct) but the compiler can't know that so the code needs
    to be explicit about overriding the lifetime.

    (cherry picked from commit e9d1128)

  • Update tests for stricter diagnostics on borrowed argument lifetime
    (cherry picked from commit 4ef3b4f)

  • Disable a test until SILGen supports borrowing getter + library evo
    rdar://150073405 ([SILGen] support synthesized _modify on top of borrowed
    getters with library evolution)

    (cherry picked from commit 78758da)

  • Bypass lifetime diagnostics in interfaces for copied arguments.
    Briefly (April 2025), RawSpan._extracting, Span._extracting, and UTF8Span.span
    returned a borrowed value that depended on a copied argument. Continue to
    support those interfaces. The implementations were correct but needed an
    explicit _overrideLifetime.

    (cherry picked from commit 8a48cd9)

atrick added 10 commits April 25, 2025 19:21
(cherry picked from commit 0603645)
Handle parameters with no name: foo(_:T)

(cherry picked from commit a7c9b6e)
A small typo meant that scoped dependencies modeled with mark_dependence_addr
were not diagnosed.

(cherry picked from commit 92b2a85)
Diagnose a scoped dependence on an argument that inherits its lifetime as an
error:

@Lifetime(borrow arg)
func reborrowSpan<T>(_ arg: Span<T>) -> Span<T> { arg }

@Lifetime(copy span)
public func testBorrowInheritedArg<T>(_ span: Span<T>) -> Span<T> {
  reborrowSpan(span) // expected-error {{lifetime-dependent value escapes its scope}}
}

Fixes: rdar://146319009 ([nonescapable] enforce borrow constraint narrowing of inherited lifetime)
(cherry picked from commit 4f470a1)
The implementation previously took advantage of a missing diagnostic. They
returned a borrowed Span with a dependency on a copied argument. This illegally
promotes the dependency. This is what the author intended to do (the
implementation was correct) but the compiler can't know that so the code needs
to be explicit about overriding the lifetime.

(cherry picked from commit e9d1128)
rdar://150073405 ([SILGen] support synthesized _modify on top of borrowed
getters with library evolution)

(cherry picked from commit 78758da)
Briefly (April 2025), RawSpan._extracting, Span._extracting, and UTF8Span.span
returned a borrowed value that depended on a copied argument. Continue to
support those interfaces. The implementations were correct but needed an
explicit _overrideLifetime.

(cherry picked from commit 8a48cd9)
@atrick atrick requested a review from a team as a code owner April 26, 2025 02:22
@atrick atrick added 🍒 release cherry pick Flag: Release branch cherry picks swift 6.2 labels Apr 26, 2025
@atrick atrick requested a review from tbkka April 26, 2025 02:23
@atrick
Copy link
Contributor Author

atrick commented Apr 26, 2025

@swift-ci test

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🍒 release cherry pick Flag: Release branch cherry picks swift 6.2
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant