Skip to content

Commit 1549894

Browse files
committed
Add support for lifetime dependence in parameter position
1 parent 8137aed commit 1549894

25 files changed

+618
-353
lines changed

SwiftCompilerSources/Sources/SIL/FunctionConvention.swift

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,18 @@ public struct FunctionConvention : CustomStringConvertible {
7777
/// Collection of LifetimeDependenceConvention indexed on the
7878
/// function parameter.
7979
public var resultDependencies: ResultDependencies? {
80-
let deps = bridgedFunctionType.SILFunctionType_getLifetimeDependenceInfo()
81-
if deps.empty() {
82-
return nil
80+
let bridgedDependencies = bridgedFunctionType.SILFunctionType_getLifetimeDependencies()
81+
let dependencies = LifetimeDependencies(bridged: bridgedDependencies)
82+
let targetIndex = parameters.count
83+
84+
for dependence in dependencies {
85+
if dependence.getTargetIndex() == targetIndex {
86+
return ResultDependencies(bridged: dependence,
87+
parameterCount: parameters.count,
88+
hasSelfParameter: hasSelfParameter)
89+
}
8390
}
84-
return ResultDependencies(bridged: deps,
85-
parameterCount: parameters.count,
86-
hasSelfParameter: hasSelfParameter)
91+
return nil
8792
}
8893

8994
public var description: String {
@@ -242,6 +247,26 @@ public enum LifetimeDependenceConvention : CustomStringConvertible {
242247
}
243248
}
244249

250+
extension FunctionConvention {
251+
struct LifetimeDependencies : Collection {
252+
let bridged: BridgedLifetimeDependenceInfoArray
253+
254+
var startIndex: Int { 0 }
255+
256+
var endIndex: Int { bridged.count() }
257+
258+
func index(after index: Int) -> Int {
259+
return index + 1
260+
}
261+
// Create a Swift LifetimeDependenceInfo for BridgedLifetimeDependenceInfo if this method needs
262+
// to be exposed outside FunctionConvention.
263+
// That will likely need bridging IndexSubset to Swift.
264+
subscript(_ index: Int) -> BridgedLifetimeDependenceInfo {
265+
return bridged.at(index)
266+
}
267+
}
268+
}
269+
245270
extension FunctionConvention {
246271
/// Collection of LifetimeDependenceConvention? that parallels parameters.
247272
public struct ResultDependencies : Collection, CustomStringConvertible {

include/swift/AST/Decl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7482,7 +7482,8 @@ class AbstractFunctionDecl : public GenericContext, public ValueDecl {
74827482

74837483
/// Add the given derivative function configuration.
74847484
void addDerivativeFunctionConfiguration(const AutoDiffConfig &config);
7485-
std::optional<LifetimeDependenceInfo> getLifetimeDependenceInfo() const;
7485+
std::optional<llvm::ArrayRef<LifetimeDependenceInfo>>
7486+
getLifetimeDependencies() const;
74867487

74877488
protected:
74887489
// If a function has a body at all, we have either a parsed body AST node or

include/swift/AST/DiagnosticsSema.def

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7981,8 +7981,8 @@ ERROR(lifetime_dependence_invalid_self_ownership, none,
79817981
ERROR(lifetime_dependence_only_on_function_method_init_result, none,
79827982
"lifetime dependence specifiers may only be used on result of "
79837983
"functions, methods, initializers", ())
7984-
ERROR(lifetime_dependence_invalid_return_type, none,
7985-
"lifetime dependence can only be specified on ~Escapable results", ())
7984+
ERROR(lifetime_dependence_invalid_type, none,
7985+
"lifetime dependence can only be specified on ~Escapable types", ())
79867986
ERROR(lifetime_dependence_cannot_infer_ambiguous_candidate, none,
79877987
"cannot infer lifetime dependence %0, multiple parameters qualifiy as a candidate", (StringRef))
79887988
ERROR(lifetime_dependence_cannot_infer_no_candidates, none,

0 commit comments

Comments
 (0)