| // 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. |
| |
| // @dart = 2.7 |
| |
| /// 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]]'; |
| } |