| // Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 | // | 
 | // Exact regression test for issue #33040. | 
 |  | 
 | import 'dart:async'; | 
 |  | 
 | class Optional<T> {} | 
 |  | 
 | typedef T ConvertFunction<T>(); | 
 |  | 
 | T blockingLatest<T>() { | 
 |   return null; | 
 | } | 
 |  | 
 | abstract class ObservableModel<T> {} | 
 |  | 
 | abstract class AsyncValueMixin<T> { | 
 |   Future<T> get asyncValue { | 
 |     ConvertFunction<T> f = blockingLatest; | 
 |     if (f is! ConvertFunction<T>) throw "error"; | 
 |     return null; | 
 |   } | 
 | } | 
 |  | 
 | abstract class OptionalSettableObservableModel<T> | 
 |     extends ObservableModel<Optional<T>> with AsyncValueMixin<Optional<T>> {} | 
 |  | 
 | class FooObservableModel extends OptionalSettableObservableModel<int> {} | 
 |  | 
 | Future<void> main() async { | 
 |   var model = new FooObservableModel(); | 
 |   await model.asyncValue; | 
 | } |