diff --git a/lib/Sema/TypeCheckEffects.cpp b/lib/Sema/TypeCheckEffects.cpp index 23fe8a7f42988..fdde20acc1a7d 100644 --- a/lib/Sema/TypeCheckEffects.cpp +++ b/lib/Sema/TypeCheckEffects.cpp @@ -4309,7 +4309,8 @@ class CheckEffectsCoverage : public EffectsHandlingWalker Ctx.Diags.diagnose(S->getForLoc(), diag::for_unsafe_without_unsafe) .fixItInsert(insertionLoc, "unsafe "); } - } else if (S->getUnsafeLoc().isValid()) { + } else if (S->getUnsafeLoc().isValid() && + Ctx.LangOpts.hasFeature(Feature::StrictMemorySafety)) { // Extraneous "unsafe" on the sequence. Ctx.Diags.diagnose(S->getUnsafeLoc(), diag::no_unsafe_in_unsafe_for) .fixItRemove(S->getUnsafeLoc()); @@ -4343,6 +4344,9 @@ class CheckEffectsCoverage : public EffectsHandlingWalker } void diagnoseRedundantUnsafe(UnsafeExpr *E) const { + if (!Ctx.LangOpts.hasFeature(Feature::StrictMemorySafety)) + return; + if (auto *SVE = SingleValueStmtExpr::tryDigOutSingleValueStmtExpr(E)) { // For an if/switch expression, produce a tailored warning. Ctx.Diags.diagnose(E->getUnsafeLoc(), @@ -4351,6 +4355,7 @@ class CheckEffectsCoverage : public EffectsHandlingWalker .highlight(E->getUnsafeLoc()); return; } + Ctx.Diags.diagnose(E->getUnsafeLoc(), diag::no_unsafe_in_unsafe); } diff --git a/test/Unsafe/unsafe_nonstrict.swift b/test/Unsafe/unsafe_nonstrict.swift new file mode 100644 index 0000000000000..d8110fa70f218 --- /dev/null +++ b/test/Unsafe/unsafe_nonstrict.swift @@ -0,0 +1,18 @@ +// RUN: %target-typecheck-verify-swift -print-diagnostic-groups + +@unsafe func unsafeFunc() { } + +@unsafe +struct UnsafeType { } + +protocol P { } + +struct X: @unsafe P { } + +func acceptP(_: T) { } + +func testItAll(ut: UnsafeType, x: X, i: Int) { + _ = unsafe ut + unsafe acceptP(x) + _ = unsafe i +}