| // Copyright (c) 2019, 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. | |
| /// Regression test: stack trace could be null when using async-await. | |
| import 'dart:async'; | |
| import 'package:expect/expect.dart'; | |
| main() async { | |
| C value = await test(); | |
| Expect.identical(StackTrace.empty, value._s); | |
| } | |
| Future<C> test() async { | |
| try { | |
| await throwInFuture(); | |
| return C(StackTrace.fromString("no-throw")); | |
| } on MyException catch (e, s) { | |
| return C(s); // Note: s is *no longer* null | |
| } | |
| } | |
| Future<int> throwInFuture() { | |
| var completer = new Completer<int>(); | |
| var future = completer.future; | |
| new Future(() {}).then((_) { | |
| StackTrace.fromString("hi"); | |
| completer.completeError(new MyException()); | |
| }); | |
| return future; | |
| } | |
| class MyException {} | |
| class C { | |
| final StackTrace _s; // Global inference used to infer this field as non-null | |
| C(this._s); | |
| @override | |
| String toString() => '[[$_s]]'; | |
| } |