blob: 71eb63db8a6dcc1c5b7aa306023bc34fa1f470eb [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.
/// @assertion
/// The pattern variable set for a pattern is:
///
/// Logical-or: The pattern variable set of either branch. It is a compile-time
/// error if the two branches do not have equal pattern variable sets. Two
/// pattern variable sets are equal if they have the same set of names and each
/// corresponding pair of variables have the same finality and their types are
/// structurally equivalent after NORM().
///
/// @description Check that it is a compile-time error if the two branches do
/// not have equal pattern variable sets
/// @author sgrekhov22@gmail.com
String test1(Object? x) {
switch (x) {
case int v0 || [var v0] when v0 == 0:
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
return "logical-or";
case var v1 || [var v1] && [var v2, ...] when v1 == 1:
// ^^
// [analyzer] unspecified
// [cfe] unspecified
return "logical-and";
case final num v2 || final v2 as int when v2 == 2:
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
return "cast";
case final int v3 || final int? v3? when v3 == 3:
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
return "null-check";
case final int v4 || final int? v4! when v4 == 4:
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
return "null-assert";
case var v5 || final v5 when v5 == 5:
// ^^^^^
// [analyzer] unspecified
// [cfe] unspecified
return "variable";
case final num? v6 || (num? v6) when v6! == 6:
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
return "parenthesized";
case final v7 || [final int v7] when v7 == 7:
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
return "list";
case var v8 || {"key1": var v88} when v8 == 8:
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
return "map";
case final int v9 || (final int v9, n: v99) when v9 == 9:
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
return "record";
case final int v10 || Square(:var sizeAsInt) when v10 == 10:
// ^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
return "object";
default:
return "no match";
}
}
String test2(Object? x) {
if (x case int v0 || [var v0] when v0 == 0)
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
return "logical-or";
if (x case var v1 || [var v1] && [var v2, ...] when v1 == 1)
// ^^
// [analyzer] unspecified
// [cfe] unspecified
return "logical-and";
if (x case final num v2 || final v2 as int when v2 == 2)
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
return "cast";
if (x case final int v3 || final int? v3? when v3 == 3)
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
return "null-check";
if (x case final int v4! || final int? v4! when v4 == 4)
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
return "null-assert";
if (x case var v5 || final v5 when v5 == 5)
// ^^^^^
// [analyzer] unspecified
// [cfe] unspecified
return "variable";
if (x case final num? v6 || (num? v6) when v6! == 6)
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
return "parenthesized";
if (x case final v7 || [final int v7] when v7 == 7)
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
return "list";
if (x case var v8 || {"key1": var v88} when v8 == 8)
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
return "map";
if (x case final int v9 || (final int v9, n: v99) when v9 == 9)
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
return "record";
if (x case final int v10 || Square(:var sizeAsInt) when v10 == 10)
// ^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
return "object";
return "no match";
}
String test3(Object? x) =>
switch (x) {
int v0 || [var v0] when v0 == 0 => "logical-or",
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
var v1 || [var v1] && [var v2, ...] when v1 == 1 => "logical-and",
// ^^
// [analyzer] unspecified
// [cfe] unspecified
final num v2 || final v2 as int when v2 == 2 => "cast",
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
final int v3 || final int? v3? when v3 == 3 => "null-check",
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
final int v4 || final int? v4! when v4 == 4 => "null-assert",
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
var v5 || final v5 when v5 == 5 => "variable",
// ^^^^^
// [analyzer] unspecified
// [cfe] unspecified
final num? v6 || (num? v6) when v6! == 6 => "parenthesized",
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
final v7 || [final int v7] when v7 == 7 => "list",
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
var v8 || {"key1": var v88} when v8 == 8 => "map",
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
final int v9 || (final int v9, n: v99) when v9 == 9 => "record",
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
final int v10 || Square(:var sizeAsInt) when v10 == 10 => "object",
// ^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
_ => "no match"
};
main () {
test1(1);
test2(1);
test3(1);
}