blob: b709e3df8427a1439add7c6b0a7f8031ad7a791e [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.
class I<T> {}
class J<T> extends I<T> {}
class A<T> extends J<T> {}
extension<T> on I<T> {
num get member {
return T == int ? 0.5 : 1;
}
}
extension<T> on A<T> {
void member(T t) {}
}
exhaustiveInferred(A<num> a) => switch (a) {
A<int>(:var member) => 0,
A<num>(:var member) => 1,
};
exhaustiveTyped(A<num> a) => switch (a) {
A<int>(:void Function(int) member) => 0,
A<num>(:void Function(num) member) => 1,
};
unreachable(A<num> a) => switch (a) {
A<num>(:var member) => 1,
A<int>(:var member) => 0,
};
nonExhaustiveRestricted(A<num> a) => switch (a) {
A<num>(:void Function(num) member) => 1,
A<int>(:var member) => 0,
};
intersection(o) {
switch (o) {
case A<int>(member: var member1) && A<double>(member: var member2):
case A<int>(member: var member1) && A<num>(member: var member2):
}
}
// TODO(johnniwinther): This should be exhaustive.
num exhaustiveMixed(I<num> i) => switch (i) {
I<num>(:int member) => member,
J<num>(:double member) => member,
};