commit | b7567b17991cce725c8dc87114b26a2aeea15239 | [log] [tgz] |
---|---|---|
author | Paul Berry <paulberry@google.com> | Mon Aug 22 16:50:19 2022 +0000 |
committer | Commit Bot <commit-bot@chromium.org> | Mon Aug 22 16:50:19 2022 +0000 |
tree | 8eb0f443d05eea60b4c0d145122e1cb703a31cfd | |
parent | 8bd77bc510e7161491de3922902cebb13d08cf4e [diff] |
Flag additional code as unreachable due to types `Null` and `Never`. Several unusual constructs that lead to unreachable code are now recognized by flow analysis: - Control flow after an expression of the form `e ?? other` or `e ??= other`, where `e` has static type `Null` and `other` has static type `Never`, is considered unreachable. - Control flow predicated on an expression of the form `e is Never` evaluating to `true` is considered unreachable. - Control flow predicated on an expression of the form `e is! Never` evaluating to `false` is considered unreachable. - Control flow on the RHS of a null-aware access such as `e?.property...`, `e?.property = ...` or `e?.method(...)`, where `e` has static type `Null`, is considered unreachable (Note: this can arise in the presence of extension methods). Previously, these behaviors only took effect if `e` was a reference to a local variable. Note: the change to `regress/issue_31180` is because I’ve corrected the behavior of implicit temporary variables to not undergo a type change from `Null` to `dynamic`, so the dead code part of `null?[1]` is now erroneous. (I had to make this change in order for the last bullet above to work properly; without it, the type change to `dynamic` prevents flow analysis from recognizing that the code to the right of `?.` is unreachable.) There's no behavioral change to correct code, but I've captured the behavioral change to incorrect code in `tests/language_2/null_aware/null_aware_index_on_null_error_test.dart`. Bug: https://github.com/dart-lang/sdk/issues/49635 Change-Id: I8b24b3b040a34f897c0b61dcb9bd105be6d0af6d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/251280 Commit-Queue: Paul Berry <paulberry@google.com> Reviewed-by: Bob Nystrom <rnystrom@google.com> Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Dart is:
Optimized for UI: Develop with a programming language specialized around the needs of user interface creation.
Productive: Make changes iteratively: use hot reload to see the result instantly in your running app.
Fast on all platforms: Compile to ARM & x64 machine code for mobile, desktop, and backend. Or compile to JavaScript for the web.
Dart's flexible compiler technology lets you run Dart code in different ways, depending on your target platform and goals:
Dart Native: For programs targeting devices (mobile, desktop, server, and more), Dart Native includes both a Dart VM with JIT (just-in-time) compilation and an AOT (ahead-of-time) compiler for producing machine code.
Dart Web: For programs targeting the web, Dart Web includes both a development time compiler (dartdevc) and a production time compiler (dart2js).
Dart is free and open source.
See LICENSE and PATENT_GRANT.
Visit dart.dev to learn more about the language, tools, and to find codelabs.
Browse pub.dev for more packages and libraries contributed by the community and the Dart team.
Our API reference documentation is published at api.dart.dev, based on the stable release. (We also publish docs from our beta and dev channels, as well as from the primary development branch).
If you want to build Dart yourself, here is a guide to getting the source, preparing your machine to build the SDK, and building.
There are more documents on our wiki.
The easiest way to contribute to Dart is to file issues.
You can also contribute patches, as described in Contributing.