Merge pull request #84593 from kavon/manual-ownership/usability-fixes-5

ManualOwnership: don't diagnose unknown callees
This commit is contained in:
Kavon Farvardin
2025-10-02 09:44:37 -07:00
committed by GitHub
2 changed files with 15 additions and 1 deletions

View File

@@ -208,7 +208,7 @@ bool PerformanceDiagnostics::visitFunction(SILFunction *function,
if (auto *fri = dyn_cast<FunctionRefInst>(bi->getArguments()[1])) {
if (visitCallee(bi, fri->getReferencedFunction(), perfConstr, parentLoc))
return true;
} else {
} else if (perfConstr != PerformanceConstraints::ManualOwnership) {
LocWithParent loc(inst.getLoc().getSourceLoc(), parentLoc);
diagnose(loc, diag::performance_unknown_callees);
return true;
@@ -250,6 +250,12 @@ bool PerformanceDiagnostics::checkClosureValue(SILValue closure,
SILInstruction *callInst,
PerformanceConstraints perfConstr,
LocWithParent *parentLoc) {
// Closures within a function are pre-annotated with [manual_ownership]
// within SILGen, if they're visible to users for annotation at all.
// So no recursive closure checking is needed here.
if (perfConstr == PerformanceConstraints::ManualOwnership)
return false;
// Walk through the definition of the closure until we find the "underlying"
// function_ref instruction.
while (!isa<FunctionRefInst>(closure)) {

View File

@@ -144,6 +144,14 @@ func basic_methods_consuming_fixed(_ t1: Triangle) {
(copy t2).consuming() // FIXME: why is this not propagated?
}
open class OpenClass {
open func classMethod() {}
}
@_manualOwnership
func callOpenMethod(_ c: OpenClass) {
return c.classMethod()
}
@_manualOwnership
@discardableResult
func consumingFunc(_ t0: consuming Triangle) -> Bool { return false }