diff --git a/lib/Sema/TypeCheckAttr.cpp b/lib/Sema/TypeCheckAttr.cpp index b005626ffe527..c44ec26fd85d2 100644 --- a/lib/Sema/TypeCheckAttr.cpp +++ b/lib/Sema/TypeCheckAttr.cpp @@ -7982,6 +7982,14 @@ void AttributeChecker::visitNonisolatedAttr(NonisolatedAttr *attr) { } } + // `nonisolated` on an actor declaration is contradictory. + if (auto *classDecl = dyn_cast(D); + classDecl && classDecl->isExplicitActor()) { + diagnoseAndRemoveAttr(attr, diag::invalid_decl_modifier, attr) + .fixItRemove(attr->getRange()); + return; + } + if (auto VD = dyn_cast(D)) { //'nonisolated(unsafe)' is meaningless for computed properties, functions etc. auto var = dyn_cast(VD); diff --git a/test/decl/class/actor/basic.swift b/test/decl/class/actor/basic.swift index 23749ee114d15..7a4ffcdbb7cf1 100644 --- a/test/decl/class/actor/basic.swift +++ b/test/decl/class/actor/basic.swift @@ -53,3 +53,5 @@ extension A2 { init(doesNotDelegate: ()) {} // expected-error {{designated initializer cannot be declared in an extension of 'A2'}} } + +nonisolated actor A3 {} // expected-error {{'nonisolated' modifier cannot be applied to this declaration}}{{1-13=}} diff --git a/test/decl/protocol/special/DistributedActor.swift b/test/decl/protocol/special/DistributedActor.swift index f49ccc399db9c..a3efe499a8390 100644 --- a/test/decl/protocol/special/DistributedActor.swift +++ b/test/decl/protocol/special/DistributedActor.swift @@ -65,6 +65,8 @@ distributed actor D5: P1 { // expected-note@-1{{non-distributed instance method 'dist()'}} } +nonisolated distributed actor D6 {} // expected-error {{'nonisolated' modifier cannot be applied to this declaration}}{{1-13=}} + // ==== Tests ------------------------------------------------------------------ // Make sure the conformances have been added implicitly.