@@ -2702,13 +2702,18 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
27022702 }
27032703
27042704 void checkExtendLifetimeInst (ExtendLifetimeInst *I) {
2705- require (!I->getOperand ()->getType ().isTrivial (*I->getFunction ()),
2706- " Source value should be non-trivial" );
27072705 require (F.hasOwnership (),
27082706 " extend_lifetime is only valid in functions with qualified "
27092707 " ownership" );
2708+ // In Raw SIL, extend_lifetime marks the end of variable scopes.
2709+ if (F.getModule ().getStage () == SILStage::Raw)
2710+ return ;
2711+
2712+ require (!I->getOperand ()->getType ().isTrivial (*I->getFunction ()),
2713+ " Source value should be non-trivial after diagnostics" );
27102714 require (getDeadEndBlocks ().isDeadEnd (I->getParent ()),
2711- " extend_lifetime in non-dead-end!?" );
2715+ " extend_lifetime in non-dead-end after diagnostics" );
2716+
27122717 auto value = I->getOperand ();
27132718 LinearLiveness linearLiveness (value,
27142719 LinearLiveness::DoNotIncludeExtensions);
@@ -3403,7 +3408,8 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
34033408 void checkDestroyValueInst (DestroyValueInst *I) {
34043409 require (I->getOperand ()->getType ().isObject (),
34053410 " Source value should be an object value" );
3406- require (!I->getOperand ()->getType ().isTrivial (*I->getFunction ()),
3411+ require (!I->getOperand ()->getType ().isTrivial (*I->getFunction ())
3412+ || I->getOperand ()->isFromVarDecl (),
34073413 " Source value should be non-trivial" );
34083414 require (!fnConv.useLoweredAddresses () || F.hasOwnership (),
34093415 " destroy_value is only valid in functions with qualified "
@@ -6779,6 +6785,9 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
67796785
67806786 } else if (i.isDeallocatingStack ()) {
67816787 SILValue op = i.getOperand (0 );
6788+ while (auto *mvi = dyn_cast<MoveValueInst>(op)) {
6789+ op = mvi->getOperand ();
6790+ }
67826791 require (!state.Stack .empty (),
67836792 " stack dealloc with empty stack" );
67846793 if (op != state.Stack .back ()) {
0 commit comments