title: Closure use of non-escaping parameter may allow it to escape
body: <p>I have a protocol:</p>
  
  <pre><code>enum DataFetchResult {
      case success(data: Data)
      case failure
  }
  
  protocol DataServiceType {
      func fetchData(location: String, completion: (DataFetchResult) -&gt; (Void))
      func cachedData(location: String) -&gt; Data?
  }
  </code></pre>
  
  <p>With an example implementation:</p>
  
  <pre><code>    /// An implementation of DataServiceType protocol returning predefined results using arbitrary queue for asynchronyous mechanisms.
      /// Dedicated to be used in various tests (Unit Tests).
      class DataMockService: DataServiceType {
  
          var result      : DataFetchResult
          var async       : Bool = true
          var queue       : DispatchQueue = DispatchQueue.global(qos: .background)
          var cachedData  : Data? = nil
  
          init(result : DataFetchResult) {
              self.result = result
          }
  
          func cachedData(location: String) -&gt; Data? {
              switch self.result {
              case .success(let data):
                  return data
              default:
                  return nil
              }
          }
  
          func fetchData(location: String, completion: (DataFetchResult) -&gt; (Void)) {
  
              // Returning result on arbitrary queue should be tested,
              // so we can check if client can work with any (even worse) implementation:
  
              if async == true {
                  queue.async { [weak self ] in
                      guard let weakSelf = self else { return }
  
                      // This line produces compiler error: 
                      // "Closure use of non-escaping parameter 'completion' may allow it to escape"
                      completion(weakSelf.result)
                  }
              } else {
                 completion(self.result)
              }
          }
      }
  </code></pre>
  
  <p>The code above compiled and worked in Swift3 (Xcode8-beta5) but does not work with beta 6 anymore. Can you point me to the underlying cause?</p>