[Concurrency] Diagnose mutating accesses to locals from concurrent code.

Replace the existing warning about any access to a local variable from
concurrently-executing code with a more tailored error:
concurrently-executing code may read a mutable varable, but cannot
modify it. This is safe so long as we either always do by-value
captures in concurrent closures or we ensure that no mutation of that
variable can occur after the point of capture.

We'll follow up with one of those. For now... be careful out there.

Since we're promoting this to an error, narrow it down to concurrent
closures and local functions, dropping the assumption that escaping
closures "may execute concurrently."
This commit is contained in:
Doug Gregor
2021-01-29 14:17:02 -08:00
parent 99f8d7a5e8
commit a554ad632b
6 changed files with 155 additions and 36 deletions

View File

@@ -17,9 +17,9 @@ actor class MyActor {
async let z = synchronous()
// expected-error @-1{{actor-isolated instance method 'synchronous()' cannot be referenced from 'async let' initializer}}
var localText = text // expected-note{{var declared here}}
var localText = text
async let w = localText.removeLast()
// expected-warning@-1{{local var 'localText' is unsafe to reference in code that may execute concurrently}}
// expected-error@-1{{mutation of captured var 'localText' in concurrently-executing code}}
_ = await x
_ = await y