blob: d98e1a1c1f99e6384243ee2892d525ee82c8dedd [file] [log] [blame]
// Copyright (c) 2022, 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.
enum Enum { a, b, c }
void exhaustiveSwitch(Enum e) {
switch (e) /* Ok */ {
case Enum.a:
print('a');
break;
case Enum.b:
print('b');
break;
case Enum.c:
print('c');
break;
}
}
void nonExhaustiveSwitch1(Enum e) {
switch (e) /* Error */ {
case Enum.a:
print('a');
break;
case Enum.b:
print('b');
break;
}
}
void nonExhaustiveSwitch2(Enum e) {
switch (e) /* Error */ {
case Enum.a:
print('a');
break;
case Enum.c:
print('c');
break;
}
}
void nonExhaustiveSwitch3(Enum e) {
switch (e) /* Error */ {
case Enum.b:
print('b');
break;
case Enum.c:
print('c');
break;
}
}
void nonExhaustiveSwitch4(Enum e) {
switch (e) /* Error */ {
case Enum.b:
print('b');
break;
}
}
void nonExhaustiveSwitchWithDefault(Enum e) {
switch (e) /* Ok */ {
case Enum.b:
print('b');
break;
default:
print('a|c');
break;
}
}
void exhaustiveNullableSwitch(Enum? e) {
switch (e) /* Ok */ {
case Enum.a:
print('a');
break;
case Enum.b:
print('b');
break;
case Enum.c:
print('c');
break;
case null:
print('null');
break;
}
}
void nonExhaustiveNullableSwitch1(Enum? e) {
switch (e) /* Error */ {
case Enum.a:
print('a');
break;
case Enum.b:
print('b');
break;
case Enum.c:
print('c');
break;
}
}
void nonExhaustiveNullableSwitch2(Enum? e) {
switch (e) /* Error */ {
case Enum.a:
print('a');
break;
case Enum.c:
print('c');
break;
case null:
print('null');
break;
}
}
void unreachableCase1(Enum e) {
switch (e) /* Ok */ {
case Enum.a:
print('a1');
break;
case Enum.b:
print('b');
break;
case Enum.a: // Unreachable
print('a2');
break;
case Enum.c:
print('c');
break;
}
}
void unreachableCase2(Enum e) {
switch (e) /* Non-exhaustive */ {
case Enum.a:
print('a1');
break;
case Enum.b:
print('b');
break;
case Enum.a: // Unreachable
print('a2');
break;
}
}
void unreachableCase3(Enum e) {
// TODO(johnniwinther): Should we avoid the unreachable error here?
switch (e) /* Error */ {
case Enum.a:
print('a');
break;
case Enum.b:
print('b');
break;
case Enum.c:
print('c');
break;
case null: // Unreachable
print('null');
break;
}
}
void unreachableCase4(Enum? e) {
switch (e) /* Ok */ {
case Enum.a:
print('a');
break;
case Enum.b:
print('b');
break;
case Enum.c:
print('c');
break;
case null:
print('null1');
break;
case null: // Unreachable
print('null2');
break;
}
}
enum GenericEnum<T> {
a<int>(),
b<String>(),
c<bool>(),
}
void exhaustiveGenericSwitch(GenericEnum<dynamic> e) {
switch (e) /* Ok */ {
case GenericEnum.a:
print('a');
break;
case GenericEnum.b:
print('b');
break;
case GenericEnum.c:
print('c');
break;
}
}
void exhaustiveGenericSwitchTyped(GenericEnum<int> e) {
switch (e) /* Ok */ {
case GenericEnum.a:
print('a');
break;
}
}