Skip to content

Commit a031944

Browse files
committed
---
yaml --- r: 322999 b: refs/heads/tensorflow-next c: 1d3b2a9 h: refs/heads/master i: 322997: df16de4 322995: 0ef8fe2 322991: 108af1e
1 parent 894b940 commit a031944

File tree

3 files changed

+47
-9
lines changed

3 files changed

+47
-9
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1461,4 +1461,4 @@ refs/heads/master-rebranch: 86e95c23aa0d37f24ec138b7853146c1cead2e40
14611461
refs/heads/rdar-53901732: 9bd06af3284e18a109cdbf9aa59d833b24eeca7b
14621462
refs/heads/revert-26776-subst-always-returns-a-type: 1b8e18fdd391903a348970a4c848995d4cdd789c
14631463
refs/heads/tensorflow-merge: 8b854f62f80d4476cb383d43c4aac2001dde3cec
1464-
refs/heads/tensorflow-next: f9f14c3613e037d124a9b4709ab27781351113d9
1464+
refs/heads/tensorflow-next: 1d3b2a90b3bc5ccff871502191c73bdbcf38e019

branches/tensorflow-next/lib/SILOptimizer/Mandatory/DiagnoseInvalidEscapingCaptures.cpp

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,28 @@ const ParamDecl *getParamDeclFromOperand(SILValue value) {
146146
return nullptr;
147147
}
148148

149+
bool isUseOfSelfInInitializer(Operand *oper) {
150+
if (auto *PBI = dyn_cast<ProjectBoxInst>(oper->get())) {
151+
if (auto *MUI = dyn_cast<MarkUninitializedInst>(PBI->getOperand())) {
152+
switch (MUI->getKind()) {
153+
case MarkUninitializedInst::Kind::Var:
154+
return false;
155+
case MarkUninitializedInst::Kind::RootSelf:
156+
case MarkUninitializedInst::Kind::CrossModuleRootSelf:
157+
case MarkUninitializedInst::Kind::DerivedSelf:
158+
case MarkUninitializedInst::Kind::DerivedSelfOnly:
159+
case MarkUninitializedInst::Kind::DelegatingSelf:
160+
case MarkUninitializedInst::Kind::DelegatingSelfAllocated:
161+
return true;
162+
}
163+
164+
llvm_unreachable("Bad MarkUninitializedInst::Kind");
165+
}
166+
}
167+
168+
return false;
169+
}
170+
149171
static bool checkForEscapingPartialApplyUses(PartialApplyInst *PAI) {
150172
// Avoid exponential path exploration.
151173
SmallVector<Operand *, 8> uses;
@@ -301,14 +323,18 @@ static void checkPartialApply(ASTContext &Context, DeclContext *DC,
301323

302324
// First, diagnose the inout captures, if any.
303325
for (auto inoutCapture : inoutCaptures) {
304-
auto *param = getParamDeclFromOperand(inoutCapture->get());
305-
if (param->isSelfParameter())
326+
if (isUseOfSelfInInitializer(inoutCapture)) {
306327
diagnose(Context, PAI->getLoc(), diag::escaping_mutable_self_capture);
307-
else {
308-
diagnose(Context, PAI->getLoc(), diag::escaping_inout_capture,
309-
param->getName());
310-
diagnose(Context, param->getLoc(), diag::inout_param_defined_here,
311-
param->getName());
328+
} else {
329+
auto *param = getParamDeclFromOperand(inoutCapture->get());
330+
if (param->isSelfParameter())
331+
diagnose(Context, PAI->getLoc(), diag::escaping_mutable_self_capture);
332+
else {
333+
diagnose(Context, PAI->getLoc(), diag::escaping_inout_capture,
334+
param->getName());
335+
diagnose(Context, param->getLoc(), diag::inout_param_defined_here,
336+
param->getName());
337+
}
312338
}
313339

314340
diagnoseCaptureLoc(Context, DC, PAI, inoutCapture);

branches/tensorflow-next/test/SILOptimizer/invalid_escaping_captures.swift

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,4 +175,16 @@ func ~> (x: inout Int, f: @escaping (_: inout Int, _: Target) -> Target) -> (Tar
175175
// expected-note@-1 {{parameter 'x' is declared 'inout'}}
176176
return { f(&x, $0) } // expected-note {{captured here}}
177177
// expected-error@-1 {{escaping closure captures 'inout' parameter 'x'}}
178-
}
178+
}
179+
180+
func addHandler(_: @escaping () -> ()) {}
181+
182+
public struct SelfEscapeFromInit {
183+
public init() {
184+
addHandler { self.handler() }
185+
// expected-error@-1 {{escaping closure captures mutating 'self' parameter}}
186+
// expected-note@-2 {{captured here}}
187+
}
188+
189+
public mutating func handler() {}
190+
}

0 commit comments

Comments
 (0)