Skip to content

Commit

Permalink
dart-lang#3057. Add more flow analysis tests for type Never. Part 2.
Browse files Browse the repository at this point in the history
  • Loading branch information
sgrekhov committed Feb 10, 2025
1 parent 5198824 commit 55384eb
Show file tree
Hide file tree
Showing 9 changed files with 459 additions and 0 deletions.
34 changes: 34 additions & 0 deletions TypeSystem/flow-analysis/reachability_A01_t17.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright (c) 2025, 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.

/// @assertion
/// - Variable or getter: If `N` is an expression of the form `x` where the
/// type of `x` is `T` then:
/// If `T <: Never` then:
/// - Let `after(N) = unreachable(before(N))`.
/// Otherwise:
/// - Let `after(N) = before(N)`.
///
/// @description Checks that the code is unreachable after a variable of type
/// `Never`. Test a list literal.
/// @author [email protected]
void test(Never n) {
late int i;
bool b = (() => true)();
if (b) {
[
n, // The code after this point is unreachable
i = 42 // Variable is initialized in a dead code. This leaves it definitely unassigned
];
}
i; // It is an error to read a local late variable when it is definitely unassigned.
//^
// [analyzer] unspecified
// [cfe] unspecified
}

main() {
print(test);
}
34 changes: 34 additions & 0 deletions TypeSystem/flow-analysis/reachability_A01_t18.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright (c) 2025, 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.

/// @assertion
/// - Variable or getter: If `N` is an expression of the form `x` where the
/// type of `x` is `T` then:
/// If `T <: Never` then:
/// - Let `after(N) = unreachable(before(N))`.
/// Otherwise:
/// - Let `after(N) = before(N)`.
///
/// @description Checks that the code is unreachable after a variable of type
/// `Never`. Test a map literal.
/// @author [email protected]
void test(Never n) {
late int i;
bool b = (() => true)();
if (b) {
<Object>{
n, // The code after this point is unreachable
i = 42 // Variable is initialized in a dead code. This leaves it definitely unassigned
};
}
i; // It is an error to read a local late variable when it is definitely unassigned.
//^
// [analyzer] unspecified
// [cfe] unspecified
}

main() {
print(test);
}
49 changes: 49 additions & 0 deletions TypeSystem/flow-analysis/reachability_A01_t19.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// Copyright (c) 2025, 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.

/// @assertion
/// - Variable or getter: If `N` is an expression of the form `x` where the
/// type of `x` is `T` then:
/// If `T <: Never` then:
/// - Let `after(N) = unreachable(before(N))`.
/// Otherwise:
/// - Let `after(N) = before(N)`.
///
/// @description Checks that the code is unreachable after a variable of type
/// `Never`. Test a map literal.
/// @author [email protected]
void test1(Never n) {
late int i;
bool b = (() => true)();
if (b) {
<int, Object>{
1: n, // The code after this point is unreachable
2: i = 42}; // Variable is initialized in a dead code. This leaves it definitely unassigned
}
i; // It is an error to read a local late variable when it is definitely unassigned.
//^
// [analyzer] unspecified
// [cfe] unspecified
}

void test2(Never n) {
late int i;
bool b = (() => true)();
if (b) {
<Object, int>{
n: // The code after this point is unreachable
i = 42 // Variable is initialized in a dead code. This leaves it definitely unassigned
};
}
i; // It is an error to read a local late variable when it is definitely unassigned.
//^
// [analyzer] unspecified
// [cfe] unspecified
}

main() {
print(test1);
print(test2);
}
34 changes: 34 additions & 0 deletions TypeSystem/flow-analysis/reachability_A01_t20.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright (c) 2025, 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.

/// @assertion
/// - Variable or getter: If `N` is an expression of the form `x` where the
/// type of `x` is `T` then:
/// If `T <: Never` then:
/// - Let `after(N) = unreachable(before(N))`.
/// Otherwise:
/// - Let `after(N) = before(N)`.
///
/// @description Checks that the code is unreachable after a variable of type
/// `Never`. Test an `if` statement in a list literal.
/// @author [email protected]
void test(Never n) {
late int i;
bool b = (() => true)();
if (b) {
[
if (n is String) // The code after this point is unreachable
i = 42 // Variable is initialized in a dead code. This leaves it definitely unassigned
];
}
i; // It is an error to read a local late variable when it is definitely unassigned.
//^
// [analyzer] unspecified
// [cfe] unspecified
}

main() {
print(test);
}
34 changes: 34 additions & 0 deletions TypeSystem/flow-analysis/reachability_A01_t21.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright (c) 2025, 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.

/// @assertion
/// - Variable or getter: If `N` is an expression of the form `x` where the
/// type of `x` is `T` then:
/// If `T <: Never` then:
/// - Let `after(N) = unreachable(before(N))`.
/// Otherwise:
/// - Let `after(N) = before(N)`.
///
/// @description Checks that the code is unreachable after a variable of type
/// `Never`. Test an `if` statement in a set literal.
/// @author [email protected]
void test(Never n) {
late int i;
bool b = (() => true)();
if (b) {
<Object>{
if (n is String) // The code after this point is unreachable
i = 42 // Variable is initialized in a dead code. This leaves it definitely unassigned
};
}
i; // It is an error to read a local late variable when it is definitely unassigned.
//^
// [analyzer] unspecified
// [cfe] unspecified
}

main() {
print(test);
}
34 changes: 34 additions & 0 deletions TypeSystem/flow-analysis/reachability_A01_t22.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright (c) 2025, 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.

/// @assertion
/// - Variable or getter: If `N` is an expression of the form `x` where the
/// type of `x` is `T` then:
/// If `T <: Never` then:
/// - Let `after(N) = unreachable(before(N))`.
/// Otherwise:
/// - Let `after(N) = before(N)`.
///
/// @description Checks that the code is unreachable after a variable of type
/// `Never`. Test an `if` statement in a map literal.
/// @author [email protected]
void test(Never n) {
late int i;
bool b = (() => true)();
if (b) {
<int, int>{
if (n is String) // The code after this point is unreachable
1: i = 42 // Variable is initialized in a dead code. This leaves it definitely unassigned
};
}
i; // It is an error to read a local late variable when it is definitely unassigned.
//^
// [analyzer] unspecified
// [cfe] unspecified
}

main() {
print(test);
}
80 changes: 80 additions & 0 deletions TypeSystem/flow-analysis/reachability_A01_t23.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// Copyright (c) 2025, 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.

/// @assertion
/// - Variable or getter: If `N` is an expression of the form `x` where the
/// type of `x` is `T` then:
/// If `T <: Never` then:
/// - Let `after(N) = unreachable(before(N))`.
/// Otherwise:
/// - Let `after(N) = before(N)`.
///
/// @description Checks that the code is unreachable after a variable of type
/// `Never`. Test a `for(;;)` statement in a list literal.
/// @author [email protected]
/// @issue 60089
void test1(Never n) {
late int i;
bool b = (() => true)();
if (b) {
[
for (n;;) // The code after this point is unreachable
i = 42 // Variable is initialized in a dead code. This leaves it definitely unassigned
];
}
i; // It is an error to read a local late variable when it is definitely unassigned.
//^
// [analyzer] unspecified
// [cfe] unspecified
}

void test2(Never n) {
late int i;
bool b = (() => true)();
if (b) {
[
for (;n;) // The code after this point is unreachable
i = 42 // Variable is initialized in a dead code. This leaves it definitely unassigned
];
}
i; // It is an error to read a local late variable when it is definitely unassigned.
//^
// [analyzer] unspecified
// [cfe] unspecified
}

void test3(Never n) {
late int i;
bool b = (() => true)();
if (b) {
[
for (;;n) // The code after this point is unreachable
i = 42 // Variable is initialized in a dead code. This leaves it definitely unassigned
];
}
i; // It is an error to read a local late variable when it is definitely unassigned.
//^
// [analyzer] unspecified
// [cfe] unspecified
}

void test4(Never n) {
late int i;
bool b = (() => true)();
if (b) {
[
for (var j = 0; j < 0; n) // Ok, not a dead code
i = 42
];
}
i; // Not an error
}

main() {
print(test1);
print(test2);
print(test3);
print(test4);
}
80 changes: 80 additions & 0 deletions TypeSystem/flow-analysis/reachability_A01_t24.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// Copyright (c) 2025, 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.

/// @assertion
/// - Variable or getter: If `N` is an expression of the form `x` where the
/// type of `x` is `T` then:
/// If `T <: Never` then:
/// - Let `after(N) = unreachable(before(N))`.
/// Otherwise:
/// - Let `after(N) = before(N)`.
///
/// @description Checks that the code is unreachable after a variable of type
/// `Never`. Test a `for(;;)` statement in a set literal.
/// @author [email protected]
/// @issue 60089
void test1(Never n) {
late int i;
bool b = (() => true)();
if (b) {
<int>{
for (n;;) // The code after this point is unreachable
i = 42 // Variable is initialized in a dead code. This leaves it definitely unassigned
};
}
i; // It is an error to read a local late variable when it is definitely unassigned.
//^
// [analyzer] unspecified
// [cfe] unspecified
}

void test2(Never n) {
late int i;
bool b = (() => true)();
if (b) {
<int>{
for (; n;) // The code after this point is unreachable
i = 42 // Variable is initialized in a dead code. This leaves it definitely unassigned
};
}
i; // It is an error to read a local late variable when it is definitely unassigned.
//^
// [analyzer] unspecified
// [cfe] unspecified
}

void test3(Never n) {
late int i;
bool b = (() => true)();
if (b) {
<int>{
for (;; n) // The code after this point is unreachable
i = 42 // Variable is initialized in a dead code. This leaves it definitely unassigned
};
}
i; // It is an error to read a local late variable when it is definitely unassigned.
//^
// [analyzer] unspecified
// [cfe] unspecified
}

void test4(Never n) {
late int i;
bool b = (() => true)();
if (b) {
<int>{
for (var j = 0; j < 0; n) // Ok, not a dead code
i = 42
};
}
i; // Not an error
}

main() {
print(test1);
print(test2);
print(test3);
print(test4);
}
Loading

0 comments on commit 55384eb

Please sign in to comment.