diff --git a/lib/Sema/TypeCheckEffects.cpp b/lib/Sema/TypeCheckEffects.cpp index 16bf80605b15a..5f952112c27bd 100644 --- a/lib/Sema/TypeCheckEffects.cpp +++ b/lib/Sema/TypeCheckEffects.cpp @@ -4555,6 +4555,10 @@ class CheckEffectsCoverage : public EffectsHandlingWalker auto insertionLoc = S->getPattern()->getStartLoc(); Ctx.Diags.diagnose(S->getForLoc(), diag::for_unsafe_without_unsafe) .fixItInsert(insertionLoc, "unsafe "); + + for (const auto &unsafeUse : classification.getUnsafeUses()) { + diagnoseUnsafeUse(unsafeUse); + } } } else if (S->getUnsafeLoc().isValid()) { // Extraneous "unsafe" on the sequence. diff --git a/test/Unsafe/safe.swift b/test/Unsafe/safe.swift index 4a22410611345..6178806e32ec3 100644 --- a/test/Unsafe/safe.swift +++ b/test/Unsafe/safe.swift @@ -89,10 +89,12 @@ struct UnsafeAsSequence: @unsafe Sequence, @unsafe IteratorProtocol { func testUnsafeAsSequenceForEach() { let uas = UnsafeAsSequence() + // expected-note@+2{{reference to unsafe instance method 'next()'}} // expected-warning@+1{{expression uses unsafe constructs but is not marked with 'unsafe'}}{{12-12=unsafe }} for _ in uas { } // expected-note{{conformance}} // expected-warning@-1{{for-in loop uses unsafe constructs but is not marked with 'unsafe'}}{{documentation-file=strict-memory-safety}}{{7-7=unsafe }} + // expected-note@+1{{reference to unsafe instance method 'next()'}} for _ in unsafe uas { } // expected-warning{{for-in loop uses unsafe constructs but is not marked with 'unsafe'}}{{documentation-file=strict-memory-safety}}{{7-7=unsafe }} for unsafe _ in unsafe uas { } // okay @@ -118,6 +120,7 @@ struct SequenceWithUnsafeIterator: Sequence { func testUnsafeIteratorForEach() { let swui = SequenceWithUnsafeIterator() + // expected-note@+1{{reference to unsafe instance method 'next()'}} for _ in swui { } // expected-warning{{for-in loop uses unsafe constructs but is not marked with 'unsafe'}}{{7-7=unsafe }} for unsafe _ in swui { } // okay, it's only the iterator that's unsafe } diff --git a/test/Unsafe/unsafe-suppression.swift b/test/Unsafe/unsafe-suppression.swift index bec707fc73584..63d31fa45f88d 100644 --- a/test/Unsafe/unsafe-suppression.swift +++ b/test/Unsafe/unsafe-suppression.swift @@ -144,9 +144,12 @@ struct UnsafeSequence: @unsafe IteratorProtocol, @unsafe Sequence { } func forEachLoop(us: UnsafeSequence) { + // expected-note@+1{{reference to unsafe instance method 'next()'}} for _ in us { } // expected-warning{{expression uses unsafe constructs but is not marked with 'unsafe'}}{{documentation-file=strict-memory-safety}}{{12-12=unsafe }} // expected-note@-1{{'@unsafe' conformance of 'UnsafeSequence' to protocol 'Sequence' involves unsafe code}} // expected-warning@-2{{for-in loop uses unsafe constructs but is not marked with 'unsafe'}}{{documentation-file=strict-memory-safety}} + + // expected-note@+1{{reference to unsafe instance method 'next()'}} for _ in unsafe us { } // expected-warning@-1{{for-in loop uses unsafe constructs but is not marked with 'unsafe'}}{{documentation-file=strict-memory-safety}} }