Skip to content

Commit 219f94f

Browse files
committed
tailor reinit-after-consume message for closure captures
rdar://109908383
1 parent e715947 commit 219f94f

8 files changed

+74
-60
lines changed

include/swift/AST/DiagnosticsSIL.def

+3-2
Original file line numberDiff line numberDiff line change
@@ -767,8 +767,9 @@ ERROR(sil_movechecking_borrowed_parameter_captured_by_closure, none,
767767
(StringRef))
768768
ERROR(sil_movechecking_capture_consumed, none,
769769
"noncopyable '%0' cannot be consumed when captured by an escaping closure", (StringRef))
770-
ERROR(sil_movechecking_inout_not_reinitialized_before_end_of_function, none,
771-
"missing reinitialization of inout parameter '%0' after consume", (StringRef))
770+
ERROR(sil_movechecking_not_reinitialized_before_end_of_function, none,
771+
"missing reinitialization of %select{inout parameter|closure capture}1 '%0' "
772+
"after consume", (StringRef, bool))
772773
ERROR(sil_movechecking_value_consumed_in_a_loop, none,
773774
"'%0' consumed in a loop", (StringRef))
774775
ERROR(sil_movechecking_use_after_partial_consume, none,

lib/SILOptimizer/Mandatory/MoveOnlyDiagnostics.cpp

+17-4
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,19 @@ void DiagnosticEmitter::emitObjectDiagnosticsForPartialApplyUses(
542542
// MARK: Address Diagnostics
543543
//===----------------------------------------------------------------------===//
544544

545+
static bool isClosureCapture(MarkMustCheckInst *markedValue) {
546+
SILValue val = markedValue->getOperand();
547+
548+
// look past any project-box
549+
if (auto *pbi = dyn_cast<ProjectBoxInst>(val))
550+
val = pbi->getOperand();
551+
552+
if (auto *fArg = dyn_cast<SILFunctionArgument>(val))
553+
return fArg->isClosureCapture();
554+
555+
return false;
556+
}
557+
545558
void DiagnosticEmitter::emitAddressExclusivityHazardDiagnostic(
546559
MarkMustCheckInst *markedValue, SILInstruction *consumingUser) {
547560
if (!useWithDiagnostic.insert(consumingUser).second)
@@ -596,8 +609,8 @@ void DiagnosticEmitter::emitAddressDiagnostic(MarkMustCheckInst *markedValue,
596609
diagnose(
597610
astContext, markedValue,
598611
diag::
599-
sil_movechecking_inout_not_reinitialized_before_end_of_function,
600-
varName);
612+
sil_movechecking_not_reinitialized_before_end_of_function,
613+
varName, isClosureCapture(markedValue));
601614
diagnose(astContext, violatingUser,
602615
diag::sil_movechecking_consuming_use_here);
603616
return;
@@ -647,8 +660,8 @@ void DiagnosticEmitter::emitInOutEndOfFunctionDiagnostic(
647660
// consuming message:
648661
diagnose(
649662
astContext, markedValue,
650-
diag::sil_movechecking_inout_not_reinitialized_before_end_of_function,
651-
varName);
663+
diag::sil_movechecking_not_reinitialized_before_end_of_function,
664+
varName, isClosureCapture(markedValue));
652665
diagnose(astContext, violatingUser,
653666
diag::sil_movechecking_consuming_use_here);
654667
}

test/SILOptimizer/discard_checking.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ struct Basics: ~Copyable {
388388

389389
// FIXME move checker is treating the defer like a closure capture (rdar://100468597)
390390
// not expecting any errors here
391-
consuming func brokenPositiveTest(_ i: Int) { // expected-error {{missing reinitialization of inout parameter 'self' after consume}}
391+
consuming func brokenPositiveTest(_ i: Int) { // expected-error {{missing reinitialization of closure capture 'self' after consume}}
392392
defer { discard self } // expected-note {{consumed here}}
393393
switch i {
394394
case 0, 1, 2, 3: return

test/SILOptimizer/moveonly_addresschecker_diagnostics.swift

+17-17
Original file line numberDiff line numberDiff line change
@@ -3083,7 +3083,7 @@ public func closureLetClassUseAfterConsumeArg(_ argX: inout Klass) {
30833083

30843084
// We do not support captures of vars by closures today.
30853085
public func closureLetCaptureClassUseAfterConsume() {
3086-
var x2 = Klass() // expected-error {{missing reinitialization of inout parameter 'x2' after consume}}
3086+
var x2 = Klass() // expected-error {{missing reinitialization of closure capture 'x2' after consume}}
30873087
// expected-error @-1 {{'x2' consumed more than once}}
30883088
x2 = Klass()
30893089
let f = {
@@ -3096,7 +3096,7 @@ public func closureLetCaptureClassUseAfterConsume() {
30963096
}
30973097

30983098
public func closureLetCaptureClassUseAfterConsume2() {
3099-
var x2 = Klass() // expected-error {{missing reinitialization of inout parameter 'x2' after consume}}
3099+
var x2 = Klass() // expected-error {{missing reinitialization of closure capture 'x2' after consume}}
31003100
x2 = Klass()
31013101
let f = {
31023102
borrowVal(x2)
@@ -3106,7 +3106,7 @@ public func closureLetCaptureClassUseAfterConsume2() {
31063106
}
31073107

31083108
public func closureLetCaptureClassUseAfterConsumeError() {
3109-
var x2 = Klass() // expected-error {{missing reinitialization of inout parameter 'x2' after consume}}
3109+
var x2 = Klass() // expected-error {{missing reinitialization of closure capture 'x2' after consume}}
31103110
// expected-error @-1 {{'x2' consumed more than once}}
31113111
// expected-error @-2 {{'x2' consumed more than once}}
31123112
x2 = Klass()
@@ -3254,7 +3254,7 @@ public func closureVarCaptureClassArgUseAfterConsume(_ x2: inout Klass) {
32543254
public func deferCaptureClassUseAfterConsume() {
32553255
var x2 = Klass()
32563256
// expected-error @-1 {{'x2' used after consume}}
3257-
// expected-error @-2 {{missing reinitialization of inout parameter 'x2' after consume}}
3257+
// expected-error @-2 {{missing reinitialization of closure capture 'x2' after consume}}
32583258
// expected-error @-3 {{'x2' consumed more than once}}
32593259
x2 = Klass()
32603260
defer { // expected-note {{used here}}
@@ -3269,7 +3269,7 @@ public func deferCaptureClassUseAfterConsume() {
32693269

32703270
public func deferCaptureClassUseAfterConsume2() {
32713271
var x2 = Klass()
3272-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3272+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
32733273
// expected-error @-2 {{'x2' consumed more than once}}
32743274
// expected-error @-3 {{'x2' used after consume}}
32753275
x2 = Klass()
@@ -3284,7 +3284,7 @@ public func deferCaptureClassUseAfterConsume2() {
32843284
}
32853285

32863286
public func deferCaptureClassArgUseAfterConsume(_ x2: inout Klass) {
3287-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3287+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
32883288
// expected-error @-2 {{'x2' consumed more than once}}
32893289
borrowVal(x2)
32903290
defer {
@@ -3298,7 +3298,7 @@ public func deferCaptureClassArgUseAfterConsume(_ x2: inout Klass) {
32983298

32993299
public func closureLetAndDeferCaptureClassUseAfterConsume() {
33003300
var x2 = Klass()
3301-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3301+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
33023302
// expected-error @-2 {{'x2' consumed more than once}}
33033303
x2 = Klass()
33043304
let f = {
@@ -3316,7 +3316,7 @@ public func closureLetAndDeferCaptureClassUseAfterConsume() {
33163316

33173317
public func closureLetAndDeferCaptureClassUseAfterConsume2() {
33183318
var x2 = Klass() // expected-error {{'x2' used after consume}}
3319-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3319+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
33203320
// expected-error @-2 {{'x2' consumed more than once}}
33213321
x2 = Klass()
33223322
let f = {
@@ -3335,7 +3335,7 @@ public func closureLetAndDeferCaptureClassUseAfterConsume2() {
33353335

33363336
public func closureLetAndDeferCaptureClassUseAfterConsume3() {
33373337
var x2 = Klass() // expected-error {{'x2' used after consume}}
3338-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3338+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
33393339
// expected-error @-2 {{'x2' consumed more than once}}
33403340
x2 = Klass()
33413341
let f = {
@@ -3354,7 +3354,7 @@ public func closureLetAndDeferCaptureClassUseAfterConsume3() {
33543354
}
33553355

33563356
public func closureLetAndDeferCaptureClassArgUseAfterConsume(_ x2: inout Klass) {
3357-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3357+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
33583358
// expected-error @-2 {{'x2' consumed more than once}}
33593359
// expected-note @-3 {{'x2' is declared 'inout'}}
33603360
let f = { // expected-error {{escaping closure captures 'inout' parameter 'x2'}}
@@ -3377,7 +3377,7 @@ public func closureLetAndDeferCaptureClassArgUseAfterConsume(_ x2: inout Klass)
33773377

33783378
public func closureLetAndClosureCaptureClassUseAfterConsume() {
33793379
var x2 = Klass() // expected-error {{'x2' consumed more than once}}
3380-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3380+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
33813381
x2 = Klass()
33823382
let f = {
33833383
let g = {
@@ -3393,7 +3393,7 @@ public func closureLetAndClosureCaptureClassUseAfterConsume() {
33933393

33943394
public func closureLetAndClosureCaptureClassUseAfterConsume2() {
33953395
var x2 = Klass() // expected-error {{'x2' consumed more than once}}
3396-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3396+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
33973397
x2 = Klass()
33983398
let f = {
33993399
let g = {
@@ -3436,7 +3436,7 @@ public func closureLetAndClosureCaptureClassArgUseAfterConsume(_ x2: inout Klass
34363436

34373437
public func closureVarAndDeferCaptureClassUseAfterConsume(_ x: borrowing Klass) { // expected-error {{'x' is borrowed and cannot be consumed}}
34383438
var x2 = Klass() // expected-error {{'x2' consumed more than once}}
3439-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3439+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
34403440
x2 = x // expected-note {{consumed here}}
34413441
var f = {}
34423442
f = {
@@ -3453,7 +3453,7 @@ public func closureVarAndDeferCaptureClassUseAfterConsume(_ x: borrowing Klass)
34533453

34543454
public func closureVarAndDeferCaptureClassUseAfterConsume2(_ x: borrowing Klass) { // expected-error {{'x' is borrowed and cannot be consumed}}
34553455
var x2 = Klass()
3456-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3456+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
34573457
// expected-error @-2 {{'x2' consumed more than once}}
34583458
x2 = x // expected-note {{consumed here}}
34593459
var f = {}
@@ -3474,7 +3474,7 @@ public func closureVarAndDeferCaptureClassUseAfterConsume2(_ x: borrowing Klass)
34743474
public func closureVarAndDeferCaptureClassUseAfterConsume3(_ x: borrowing Klass) { // expected-error {{'x' is borrowed and cannot be consumed}}
34753475
var x2 = Klass()
34763476
// expected-error @-1 {{'x2' consumed more than once}}
3477-
// expected-error @-2 {{missing reinitialization of inout parameter 'x2' after consume}}
3477+
// expected-error @-2 {{missing reinitialization of closure capture 'x2' after consume}}
34783478
x2 = x
34793479
// expected-note @-1 {{consumed here}}
34803480
var f = {}
@@ -3522,7 +3522,7 @@ public func closureVarAndDeferCaptureClassOwnedArgUseAfterConsume(_ x2: __owned
35223522
}
35233523

35243524
public func closureVarAndDeferCaptureClassOwnedArgUseAfterConsume2(_ x2: consuming Klass) {
3525-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3525+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
35263526
// expected-error @-2 {{'x2' consumed more than once}}
35273527
var f = {}
35283528
f = {
@@ -3555,7 +3555,7 @@ public func closureVarAndDeferCaptureClassOwnedArgUseAfterConsume3(_ x2: __owned
35553555

35563556
public func closureVarAndDeferCaptureClassOwnedArgUseAfterConsume4(_ x2: consuming Klass) {
35573557
// expected-error @-1 {{'x2' consumed more than once}}
3558-
// expected-error @-2 {{missing reinitialization of inout parameter 'x2' after consume}}
3558+
// expected-error @-2 {{missing reinitialization of closure capture 'x2' after consume}}
35593559
var f = {}
35603560
f = {
35613561
defer {

test/SILOptimizer/moveonly_nonescaping_closures.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func d(x: __owned M) { // expected-error {{noncopyable 'x' cannot be consumed wh
8282
// expected-note @-1 {{consumed here}}
8383
}
8484

85-
func d2(x: consuming M) { // expected-error {{missing reinitialization of inout parameter 'x' after consume}}
85+
func d2(x: consuming M) { // expected-error {{missing reinitialization of closure capture 'x' after consume}}
8686
clodger({ consume(x) })
8787
// expected-note @-1 {{consumed here}}
8888
}
@@ -129,7 +129,7 @@ func k(x: borrowing M) {
129129
}
130130

131131

132-
func l(x: inout M) { // expected-error {{missing reinitialization of inout parameter 'x' after consume}}
132+
func l(x: inout M) { // expected-error {{missing reinitialization of closure capture 'x' after consume}}
133133
clodger({ consume(x) }) // expected-note {{consumed here}}
134134
}
135135

test/SILOptimizer/moveonly_objectchecker_diagnostics.swift

+15-15
Original file line numberDiff line numberDiff line change
@@ -2777,7 +2777,7 @@ public func closureLetCaptureClassUseAfterConsume(_ x: consuming Klass) {
27772777
public func closureLetCaptureClassUseAfterConsume1(_ x: borrowing Klass) { // expected-error {{'x' is borrowed and cannot be consumed}}
27782778
var x2 = x // expected-note {{consumed here}}
27792779
// expected-error @-1 {{'x2' consumed more than once}}
2780-
// expected-error @-2 {{missing reinitialization of inout parameter 'x2' after consume}}
2780+
// expected-error @-2 {{missing reinitialization of closure capture 'x2' after consume}}
27812781
x2 = x // expected-note {{consumed here}}
27822782

27832783
let f = {
@@ -2802,7 +2802,7 @@ public func closureLetCaptureClassUseAfterConsume2(_ x2: inout Klass) {
28022802
// TODO: We are considering this to be an escaping use.
28032803
public func closureLetCaptureClassUseAfterConsume3(_ x2: inout Klass) {
28042804
// expected-error @-1 {{'x2' consumed more than once}}
2805-
// expected-error @-2 {{missing reinitialization of inout parameter 'x2' after consume}}
2805+
// expected-error @-2 {{missing reinitialization of closure capture 'x2' after consume}}
28062806
func useClosure(_ x: () -> ()) {}
28072807

28082808
useClosure {
@@ -2852,7 +2852,7 @@ public func closureLetCaptureClassOwnedArgUseAfterConsume(_ x2: __owned Klass) {
28522852

28532853
public func closureLetCaptureClassOwnedArgUseAfterConsume2(_ x2: consuming Klass) {
28542854
// expected-error @-1 {{'x2' consumed more than once}}
2855-
// expected-error @-2 {{missing reinitialization of inout parameter 'x2' after consume}}
2855+
// expected-error @-2 {{missing reinitialization of closure capture 'x2' after consume}}
28562856
let f = {
28572857
borrowVal(x2)
28582858
consumeVal(x2) // expected-note {{consumed here}}
@@ -2878,7 +2878,7 @@ public func closureLetCaptureClassOwnedArgUseAfterConsume3(_ x2: __owned Klass)
28782878
public func closureLetCaptureClassOwnedArgUseAfterConsume4(_ x2: consuming Klass) {
28792879
// expected-error @-1 {{'x2' consumed more than once}}
28802880
// expected-error @-2 {{'x2' consumed more than once}}
2881-
// expected-error @-3 {{missing reinitialization of inout parameter 'x2' after consume}}
2881+
// expected-error @-3 {{missing reinitialization of closure capture 'x2' after consume}}
28822882
let f = {
28832883
borrowVal(x2)
28842884
consumeVal(x2) // expected-note {{consumed here}}
@@ -2980,7 +2980,7 @@ public func closureVarCaptureClassUseAfterConsume3(_ x2: inout Klass) {
29802980

29812981
public func closureVarCaptureClassUseAfterConsume4(_ x2: inout Klass) {
29822982
// expected-error @-1 {{'x2' consumed more than once}}
2983-
// expected-error @-2 {{missing reinitialization of inout parameter 'x2' after consume}}
2983+
// expected-error @-2 {{missing reinitialization of closure capture 'x2' after consume}}
29842984
func useClosure(_ x: () -> ()) {}
29852985

29862986
useClosure {
@@ -3115,7 +3115,7 @@ public func deferCaptureClassOwnedArgUseAfterConsume(_ x2: __owned Klass) {
31153115
}
31163116

31173117
public func deferCaptureClassOwnedArgUseAfterConsume2(_ x2: consuming Klass) {
3118-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3118+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
31193119
// expected-error @-2 {{'x2' consumed more than once}}
31203120
defer {
31213121
borrowVal(x2)
@@ -3138,7 +3138,7 @@ public func deferCaptureClassOwnedArgUseAfterConsume3(_ x2: __owned Klass) {
31383138
}
31393139

31403140
public func deferCaptureClassOwnedArgUseAfterConsume4(_ x2: consuming Klass) {
3141-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3141+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
31423142
// expected-error @-2 {{'x2' consumed more than once}}
31433143
// expected-error @-3 {{'x2' used after consume}}
31443144
defer { // expected-note {{used here}}
@@ -3232,7 +3232,7 @@ public func closureLetAndDeferCaptureClassOwnedArgUseAfterConsume(_ x2: __owned
32323232
}
32333233

32343234
public func closureLetAndDeferCaptureClassOwnedArgUseAfterConsume2(_ x2: consuming Klass) {
3235-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3235+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
32363236
// expected-error @-2 {{'x2' consumed more than once}}
32373237
let f = {
32383238
defer {
@@ -3263,7 +3263,7 @@ public func closureLetAndDeferCaptureClassOwnedArgUseAfterConsume3(_ x2: __owned
32633263

32643264
public func closureLetAndDeferCaptureClassOwnedArgUseAfterConsume4(_ x2: consuming Klass) {
32653265
// expected-error @-1 {{'x2' consumed more than once}}
3266-
// expected-error @-2 {{missing reinitialization of inout parameter 'x2' after consume}}
3266+
// expected-error @-2 {{missing reinitialization of closure capture 'x2' after consume}}
32673267
let f = {
32683268
defer {
32693269
borrowVal(x2)
@@ -3321,7 +3321,7 @@ public func closureLetAndClosureCaptureClassUseAfterConsume3(_ x: borrowing Klas
33213321
var x2 = x
33223322
// expected-note @-1 {{consumed here}}
33233323
// expected-error @-2 {{'x2' consumed more than once}}
3324-
// expected-error @-3 {{missing reinitialization of inout parameter 'x2' after consume}}
3324+
// expected-error @-3 {{missing reinitialization of closure capture 'x2' after consume}}
33253325
// expected-error @-4 {{'x2' consumed more than once}}
33263326
x2 = x
33273327
// expected-note @-1 {{consumed here}}
@@ -3372,7 +3372,7 @@ public func closureLetAndClosureCaptureClassOwnedArgUseAfterConsume(_ x2: __owne
33723372

33733373
public func closureLetAndClosureCaptureClassOwnedArgUseAfterConsume2(_ x2: consuming Klass) {
33743374
// expected-error @-1 {{'x2' consumed more than once}}
3375-
// expected-error @-2 {{missing reinitialization of inout parameter 'x2' after consume}}
3375+
// expected-error @-2 {{missing reinitialization of closure capture 'x2' after consume}}
33763376
let f = {
33773377
let g = {
33783378
borrowVal(x2)
@@ -3401,7 +3401,7 @@ public func closureLetAndClosureCaptureClassOwnedArgUseAfterConsume3(_ x2: __own
34013401
}
34023402

34033403
public func closureLetAndClosureCaptureClassOwnedArgUseAfterConsume4(_ x2: consuming Klass) {
3404-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3404+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
34053405
// expected-error @-2 {{'x2' consumed more than once}}
34063406
let f = {
34073407
let g = {
@@ -3417,7 +3417,7 @@ public func closureLetAndClosureCaptureClassOwnedArgUseAfterConsume4(_ x2: consu
34173417
}
34183418

34193419
public func closureLetAndClosureCaptureClassOwnedArgUseAfterConsume5(_ x2: consuming Klass) {
3420-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3420+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
34213421
// expected-error @-2 {{'x2' consumed more than once}}
34223422
// expected-error @-3 {{'x2' used after consume}}
34233423
let f = {
@@ -3518,7 +3518,7 @@ public func closureVarAndDeferCaptureClassOwnedArgUseAfterConsume(_ x2: __owned
35183518
}
35193519

35203520
public func closureVarAndDeferCaptureClassOwnedArgUseAfterConsume2(_ x2: consuming Klass) {
3521-
// expected-error @-1 {{missing reinitialization of inout parameter 'x2' after consume}}
3521+
// expected-error @-1 {{missing reinitialization of closure capture 'x2' after consume}}
35223522
// expected-error @-2 {{'x2' consumed more than once}}
35233523
var f = {}
35243524
f = {
@@ -3551,7 +3551,7 @@ public func closureVarAndDeferCaptureClassOwnedArgUseAfterConsume3(_ x2: __owned
35513551

35523552
public func closureVarAndDeferCaptureClassOwnedArgUseAfterConsume4(_ x2: consuming Klass) {
35533553
// expected-error @-1 {{'x2' consumed more than once}}
3554-
// expected-error @-2 {{missing reinitialization of inout parameter 'x2' after consume}}
3554+
// expected-error @-2 {{missing reinitialization of closure capture 'x2' after consume}}
35553555
var f = {}
35563556
f = {
35573557
defer {

0 commit comments

Comments
 (0)