@@ -923,15 +923,17 @@ void LifetimeChecker::handleLoadUse(unsigned UseID) {
923
923
void LifetimeChecker::handleStoreUse (unsigned UseID) {
924
924
DIMemoryUse &InstInfo = Uses[UseID];
925
925
926
- if (getSelfConsumedAtInst (InstInfo.Inst ) != DIKind::No) {
927
- // FIXME: more specific diagnostics here, handle this case gracefully below.
928
- if (!shouldEmitError (InstInfo.Inst ))
929
- return ;
926
+ if (TheMemory.isAnyInitSelf ()) {
927
+ if (getSelfConsumedAtInst (InstInfo.Inst ) != DIKind::No) {
928
+ // FIXME: more specific diagnostics here, handle this case gracefully below.
929
+ if (!shouldEmitError (InstInfo.Inst ))
930
+ return ;
930
931
931
- diagnose (Module, InstInfo.Inst ->getLoc (),
932
- diag::self_inside_catch_superselfinit,
933
- (unsigned )TheMemory.isDelegatingInit ());
934
- return ;
932
+ diagnose (Module, InstInfo.Inst ->getLoc (),
933
+ diag::self_inside_catch_superselfinit,
934
+ (unsigned )TheMemory.isDelegatingInit ());
935
+ return ;
936
+ }
935
937
}
936
938
937
939
// Determine the liveness state of the element that we care about.
@@ -1664,6 +1666,7 @@ void LifetimeChecker::handleLoadUseFailure(const DIMemoryUse &Use,
1664
1666
void LifetimeChecker::handleSelfInitUse (DIMemoryUse &InstInfo) {
1665
1667
auto *Inst = InstInfo.Inst ;
1666
1668
1669
+ assert (TheMemory.isAnyInitSelf ());
1667
1670
assert (TheMemory.getType ()->hasReferenceSemantics ());
1668
1671
1669
1672
if (getSelfConsumedAtInst (Inst) != DIKind::No) {
@@ -1899,8 +1902,10 @@ void LifetimeChecker::processNonTrivialRelease(unsigned ReleaseID) {
1899
1902
isa<DestroyAddrInst>(Release));
1900
1903
1901
1904
auto Availability = getLivenessAtInst (Release, 0 , TheMemory.NumElements );
1902
- DIKind SelfConsumed =
1903
- getSelfConsumedAtInst (Release);
1905
+ DIKind SelfConsumed = DIKind::No;
1906
+
1907
+ if (TheMemory.isAnyInitSelf ())
1908
+ SelfConsumed = getSelfConsumedAtInst (Release);
1904
1909
1905
1910
if (SelfConsumed == DIKind::Yes) {
1906
1911
// We're in an error path after performing a self.init or super.init
@@ -2643,12 +2648,14 @@ bool LifetimeChecker::isInitializedAtUse(const DIMemoryUse &Use,
2643
2648
bool *FailedSelfUse) {
2644
2649
if (FailedSelfUse) *FailedSelfUse = false ;
2645
2650
if (SuperInitDone) *SuperInitDone = true ;
2646
-
2647
- // If the self.init() or super.init() call threw an error and
2648
- // we caught it, self is no longer available.
2649
- if (getSelfConsumedAtInst (Use.Inst ) != DIKind::No) {
2650
- if (FailedSelfUse) *FailedSelfUse = true ;
2651
- return false ;
2651
+
2652
+ if (TheMemory.isAnyInitSelf ()) {
2653
+ // If the self.init() or super.init() call threw an error and
2654
+ // we caught it, self is no longer available.
2655
+ if (getSelfConsumedAtInst (Use.Inst ) != DIKind::No) {
2656
+ if (FailedSelfUse) *FailedSelfUse = true ;
2657
+ return false ;
2658
+ }
2652
2659
}
2653
2660
2654
2661
// Determine the liveness states of the elements that we care about.
0 commit comments