blob: 0b2d59389ab5df3ccd22d632884ceadaf9fdc8a1 [file] [log] [blame]
// Copyright (c) 2023, 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.
// This test verifies that in language versions prior to patterns support, `case
// null` is not treated specially by flow analysis.
// @dart=2.19
import '../static_type_helper.dart';
// Checks that even if the type of the scrutinee is `Null`, and one of the cases
// matches `null`, the other `default` case is still considered reachable.
void test1(Null Function() f, int? i1, int? i2) {
if (i1 != null && i2 != null) {
i1.expectStaticType<Exactly<int>>();
i2.expectStaticType<Exactly<int>>();
switch (f()) {
case null:
i1 = null;
break;
default:
i2 = null;
break;
}
// Check that both switch cases were considered reachable by flow analysis.
i1.expectStaticType<Exactly<int?>>();
i2.expectStaticType<Exactly<int?>>();
}
}
// Checks that if the type of the scrutinee is nullable, and one of the cases
// matches `null`, the scrutinee is not promoted in the other `default` case.
void test2(int? x) {
switch (x) {
case null:
x.expectStaticType<Exactly<int?>>();
break;
default:
x.expectStaticType<Exactly<int?>>();
break;
}
}
main() {
test1(() => null, 1, 2);
test2(null);
test2(1);
}