Skip to content

Commit 0a05cd0

Browse files
authored
Merge pull request #62935 from gottesmm/pr-114a0082fe0f258851f6d645c8c5d5c72d5df2a1
[move-only-addr] Fix an assert and add some more tests.
2 parents cc70677 + 8356a1d commit 0a05cd0

File tree

2 files changed

+51
-14
lines changed

2 files changed

+51
-14
lines changed

lib/SIL/Utils/FieldSensitivePrunedLiveness.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -781,7 +781,7 @@ void FieldSensitiveMultiDefPrunedLiveRange::findBoundariesInBlock(
781781
LLVM_DEBUG(llvm::dbgs() << "Has multiple defs!\n");
782782

783783
// Handle a live-out or live-within block with potentially multiple defs
784-
// unsigned prevCount = boundary.getNumLastUsersAndDeadDefs(bitNo);
784+
unsigned prevCount = boundary.getNumLastUsersAndDeadDefs(bitNo);
785785
bool isLive = isLiveOut;
786786
for (auto &inst : llvm::reverse(*block)) {
787787
LLVM_DEBUG(llvm::dbgs() << "Visiting: " << inst);
@@ -861,6 +861,7 @@ void FieldSensitiveMultiDefPrunedLiveRange::findBoundariesInBlock(
861861
<< " Live at beginning of block! No dead args!\n");
862862
}
863863

864-
// assert(prevCount < boundary.getNumLastUsersAndDeadDefs(bitNo) &&
865-
// "findBoundariesInBlock must be called on a live block");
864+
assert((isLiveOut ||
865+
prevCount < boundary.getNumLastUsersAndDeadDefs(bitNo)) &&
866+
"findBoundariesInBlock must be called on a live block");
866867
}

test/SILOptimizer/moveonly_addresschecker_diagnostics.swift

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2299,16 +2299,15 @@ func copyableStructsInMoveOnlyStructNonConsuming() {
22992299
// Field Sensitive Tests //
23002300
///////////////////////////
23012301

2302-
func fieldSensitiveTestReinitField () {
2302+
func fieldSensitiveTestReinitField() {
23032303
var a = NonTrivialStruct()
23042304
a = NonTrivialStruct()
23052305
classConsume(a.k)
23062306
a.k = Klass()
23072307
classUseMoveOnlyWithoutEscaping(a.k)
23082308
}
23092309

2310-
#if false
2311-
func fieldSensitiveTestReinitFieldMultiBlock1 () {
2310+
func fieldSensitiveTestReinitFieldMultiBlock1() {
23122311
var a = NonTrivialStruct()
23132312
a = NonTrivialStruct()
23142313
classConsume(a.k)
@@ -2318,9 +2317,8 @@ func fieldSensitiveTestReinitFieldMultiBlock1 () {
23182317
classUseMoveOnlyWithoutEscaping(a.k)
23192318
}
23202319
}
2321-
#endif
23222320

2323-
func fieldSensitiveTestReinitFieldMultiBlock2 () {
2321+
func fieldSensitiveTestReinitFieldMultiBlock2() {
23242322
var a = NonTrivialStruct() // expected-error {{'a' used after consume. Lifetime extension of variable requires a copy}}
23252323
a = NonTrivialStruct()
23262324
classConsume(a.k) // expected-note {{consuming use}}
@@ -2332,8 +2330,7 @@ func fieldSensitiveTestReinitFieldMultiBlock2 () {
23322330
classUseMoveOnlyWithoutEscaping(a.k) // expected-note {{non-consuming use}}
23332331
}
23342332

2335-
#if false
2336-
func fieldSensitiveTestReinitFieldMultiBlock3 () {
2333+
func fieldSensitiveTestReinitFieldMultiBlock3() {
23372334
var a = NonTrivialStruct()
23382335
a = NonTrivialStruct()
23392336
classConsume(a.k)
@@ -2346,10 +2343,10 @@ func fieldSensitiveTestReinitFieldMultiBlock3 () {
23462343

23472344
classUseMoveOnlyWithoutEscaping(a.k)
23482345
}
2349-
#endif
23502346

2351-
#if false
2352-
func fieldSensitiveTestReinitFieldMultiBlock4 () {
2347+
// This test sees what happens if we partially reinit along one path and do a
2348+
// full reinit along another path.
2349+
func fieldSensitiveTestReinitFieldMultiBlock4() {
23532350
var a = NonTrivialStruct()
23542351
a = NonTrivialStruct()
23552352
classConsume(a.k)
@@ -2362,4 +2359,43 @@ func fieldSensitiveTestReinitFieldMultiBlock4 () {
23622359

23632360
classUseMoveOnlyWithoutEscaping(a.k)
23642361
}
2365-
#endif
2362+
2363+
func fieldSensitiveTestReinitEnumMultiBlock() {
2364+
var e = NonTrivialEnum.first // expected-error {{'e' used after consume. Lifetime extension of variable requires a copy}}
2365+
e = NonTrivialEnum.second(Klass())
2366+
switch e { // expected-note {{consuming use}}
2367+
case .second:
2368+
e = NonTrivialEnum.third(NonTrivialStruct())
2369+
default:
2370+
break
2371+
}
2372+
nonConsumingUseNonTrivialEnum(e) // expected-note {{non-consuming use}}
2373+
}
2374+
2375+
func fieldSensitiveTestReinitEnumMultiBlock1() {
2376+
var e = NonTrivialEnum.first
2377+
e = NonTrivialEnum.second(Klass())
2378+
switch e {
2379+
case .second:
2380+
e = NonTrivialEnum.third(NonTrivialStruct())
2381+
default:
2382+
e = NonTrivialEnum.fourth(CopyableKlass())
2383+
}
2384+
nonConsumingUseNonTrivialEnum(e)
2385+
}
2386+
2387+
func fieldSensitiveTestReinitEnumMultiBlock2() {
2388+
var e = NonTrivialEnum.first
2389+
e = NonTrivialEnum.second(Klass())
2390+
if boolValue {
2391+
switch e {
2392+
case .second:
2393+
e = NonTrivialEnum.third(NonTrivialStruct())
2394+
default:
2395+
e = NonTrivialEnum.fourth(CopyableKlass())
2396+
}
2397+
} else {
2398+
e = NonTrivialEnum.third(NonTrivialStruct())
2399+
}
2400+
nonConsumingUseNonTrivialEnum(e)
2401+
}

0 commit comments

Comments
 (0)