Distinguish between withoutActuallyEscaping and passing @noescape

Objective C closures when reporting that a closure has escaped

rdar://39682865
This commit is contained in:
Arnold Schwaighofer
2018-04-30 10:04:48 -07:00
parent 9048e97e83
commit 1f65ee25f6
20 changed files with 109 additions and 32 deletions

View File

@@ -1616,12 +1616,22 @@ bool SILDeserializer::readSILInstruction(SILFunction *Fn, SILBasicBlock *BB,
REFCOUNTING_INSTRUCTION(UnownedRelease)
UNARY_INSTRUCTION(IsUnique)
UNARY_INSTRUCTION(IsUniqueOrPinned)
UNARY_INSTRUCTION(IsEscapingClosure)
UNARY_INSTRUCTION(AbortApply)
UNARY_INSTRUCTION(EndApply)
#undef UNARY_INSTRUCTION
#undef REFCOUNTING_INSTRUCTION
case SILInstructionKind::IsEscapingClosureInst: {
assert(RecordKind == SIL_ONE_OPERAND && "Layout should be OneOperand.");
unsigned verificationType = Attr;
ResultVal = Builder.createIsEscapingClosure(
Loc,
getLocalValue(
ValID, getSILType(MF->getType(TyID), (SILValueCategory)TyCategory)),
verificationType);
break;
}
case SILInstructionKind::DestructureTupleInst: {
assert(RecordKind == SIL_ONE_OPERAND && "Layout should be OneOperand.");
SILValue Operand = getLocalValue(