2ec3b513db
This fixes a minor bug in flow analysis which was preventing it from recognizing when a switch statement was trivially exhaustive, meaning one of its reachable cases was guaranteed to always match. This mostly addresses https://github.com/dart-lang/language/issues/2980, but flow analysis still fails to recognize that: - A list pattern containing a just a single rest pattern always matches (unless the rest pattern has a subpattern that may fail to match). - A null check pattern always matches if its subpattern always matches and the matched value type is non-nullable. - The relational pattern `!= null` always matches if its subpattern always matches and the matched value type is non-nullable. Fortunately, these drawbacks are small and don't lead to unsoundness. I'll try to address them in follow up CLs. Bug: https://github.com/dart-lang/language/issues/2980 Change-Id: Ie9f8564cde66a5a2c41114033ca3ff0e1a0f139a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/293860 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Paul Berry <paulberry@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com>