swift
7abe2222 - Disable surprising lifetime inference of implicit initializers

Commit
97 days ago
Disable surprising lifetime inference of implicit initializers Non-escapable struct definitions often have inicidental integer fields that are unrelated to lifetime. Without an explicit initializer, the compiler would infer these fields to be borrowed by the implicit intializer. struct CountedSpan: ~Escapable { let span: Span<Int> let i: Int /* infer: @lifetime(copy span, borrow i) init(...) */ } This was done because - we always want to infer lifetimes of synthesized code if possible - inferring a borrow dependence is always conservative But this was the wrong decision because it inevitabely results in lifetime diagnostic errors elsewhere in the code that can't be tracked down at the use site: let span = CountedSpan(span: span, i: 3) // ERROR: span depends on the lifetime of this value Instead, force the author of the data type to specify whether the type actually depends on trivial fields or not. Such as: struct CountedSpan: ~Escapable { let span: Span<Int> let i: Int @lifetime(copy span) init(...) { ... } } This fix enables stricter diagnostics, so we need it in 6.2. Fixes rdar://152130977 ([nonescapable] confusing diagnostic message when a synthesized initializer generates dependence on an Int parameter)
Author
Committer
Parents
Loading