blob: e0d03b73f77a55e0361a926c0e8ad02404d2044a [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.
enum Enum { a, b, c }
void exhaustiveSwitch(Enum e) {
/*
subtypes={Enum.a,Enum.b,Enum.c},
type=Enum
*/
switch (e) {
/*space=Enum.a*/
case Enum.a:
print('a');
break;
/*space=Enum.b*/
case Enum.b:
print('b');
break;
/*space=Enum.c*/
case Enum.c:
print('c');
break;
}
}
const a1 = Enum.a;
const b1 = Enum.b;
const c1 = Enum.c;
void exhaustiveSwitchAliasedBefore(Enum e) {
/*
subtypes={Enum.a,Enum.b,Enum.c},
type=Enum
*/
switch (e) {
/*space=Enum.a*/
case a1:
print('a');
break;
/*space=Enum.b*/
case b1:
print('b');
break;
/*space=Enum.c*/
case c1:
print('c');
break;
}
}
void exhaustiveSwitchAliasedAfter(Enum e) {
/*
subtypes={Enum.a,Enum.b,Enum.c},
type=Enum
*/
switch (e) {
/*space=Enum.a*/
case a2:
print('a');
break;
/*space=Enum.b*/
case b2:
print('b');
break;
/*space=Enum.c*/
case c2:
print('c');
break;
}
}
const a2 = Enum.a;
const b2 = Enum.b;
const c2 = Enum.c;
void nonExhaustiveSwitch1(Enum e) {
/*
error=non-exhaustive:Enum.c,
subtypes={Enum.a,Enum.b,Enum.c},
type=Enum
*/
switch (e) {
/*space=Enum.a*/
case Enum.a:
print('a');
break;
/*space=Enum.b*/
case Enum.b:
print('b');
break;
}
}
void nonExhaustiveSwitch2(Enum e) {
/*
error=non-exhaustive:Enum.b,
subtypes={Enum.a,Enum.b,Enum.c},
type=Enum
*/
switch (e) {
/*space=Enum.a*/
case Enum.a:
print('a');
break;
/*space=Enum.c*/
case Enum.c:
print('c');
break;
}
}
void nonExhaustiveSwitch3(Enum e) {
/*
error=non-exhaustive:Enum.a,
subtypes={Enum.a,Enum.b,Enum.c},
type=Enum
*/
switch (e) {
/*space=Enum.b*/
case Enum.b:
print('b');
break;
/*space=Enum.c*/
case Enum.c:
print('c');
break;
}
}
void nonExhaustiveSwitch4(Enum e) {
/*
error=non-exhaustive:Enum.a,
subtypes={Enum.a,Enum.b,Enum.c},
type=Enum
*/
switch (e) {
/*space=Enum.b*/
case Enum.b:
print('b');
break;
}
}
void nonExhaustiveSwitchWithDefault(Enum e) {
/*
subtypes={Enum.a,Enum.b,Enum.c},
type=Enum
*/
switch (e) {
/*space=Enum.b*/
case Enum.b:
print('b');
break;
default:
print('a|c');
break;
}
}
void exhaustiveNullableSwitch(Enum? e) {
/*
expandedSubtypes={Enum.a,Enum.b,Enum.c,Null},
subtypes={Enum,Null},
type=Enum?
*/
switch (e) {
/*space=Enum.a*/
case Enum.a:
print('a');
break;
/*space=Enum.b*/
case Enum.b:
print('b');
break;
/*space=Enum.c*/
case Enum.c:
print('c');
break;
/*space=Null*/
case null:
print('null');
break;
}
}
void nonExhaustiveNullableSwitch1(Enum? e) {
/*
error=non-exhaustive:Null,
expandedSubtypes={Enum.a,Enum.b,Enum.c,Null},
subtypes={Enum,Null},
type=Enum?
*/
switch (e) {
/*space=Enum.a*/
case Enum.a:
print('a');
break;
/*space=Enum.b*/
case Enum.b:
print('b');
break;
/*space=Enum.c*/
case Enum.c:
print('c');
break;
}
}
void nonExhaustiveNullableSwitch2(Enum? e) {
/*
error=non-exhaustive:Enum.b,
expandedSubtypes={Enum.a,Enum.b,Enum.c,Null},
subtypes={Enum,Null},
type=Enum?
*/
switch (e) {
/*space=Enum.a*/
case Enum.a:
print('a');
break;
/*space=Enum.c*/
case Enum.c:
print('c');
break;
/*space=Null*/
case null:
print('null');
break;
}
}
void unreachableCase1(Enum e) {
/*
subtypes={Enum.a,Enum.b,Enum.c},
type=Enum
*/
switch (e) {
/*space=Enum.a*/
case Enum.a:
print('a1');
break;
/*space=Enum.b*/
case Enum.b:
print('b');
break;
/*
error=unreachable,
space=Enum.a
*/
case Enum.a:
print('a2');
break;
/*space=Enum.c*/
case Enum.c:
print('c');
break;
}
}
void unreachableCase2(Enum e) {
/*
error=non-exhaustive:Enum.c,
subtypes={Enum.a,Enum.b,Enum.c},
type=Enum
*/
switch (e) {
/*space=Enum.a*/
case Enum.a:
print('a1');
break;
/*space=Enum.b*/
case Enum.b:
print('b');
break;
/*
error=unreachable,
space=Enum.a
*/
case Enum.a:
print('a2');
break;
}
}
void unreachableCase3(Enum e) {
// TODO(johnniwinther): Should we avoid the unreachable error here?
/*
subtypes={Enum.a,Enum.b,Enum.c},
type=Enum
*/
switch (e) {
/*space=Enum.a*/
case Enum.a:
print('a');
break;
/*space=Enum.b*/
case Enum.b:
print('b');
break;
/*space=Enum.c*/
case Enum.c:
print('c');
break;
/*space=Null*/
case null: // Unreachable
print('null');
break;
}
}
void unreachableCase4(Enum? e) {
/*
expandedSubtypes={Enum.a,Enum.b,Enum.c,Null},
subtypes={Enum,Null},
type=Enum?
*/
switch (e) {
/*space=Enum.a*/
case Enum.a:
print('a');
break;
/*space=Enum.b*/
case Enum.b:
print('b');
break;
/*space=Enum.c*/
case Enum.c:
print('c');
break;
/*space=Null*/
case null:
print('null1');
break;
/*
error=unreachable,
space=Null
*/
case null:
print('null2');
break;
}
}
void unreachableCase5(Enum e) {
/*
subtypes={Enum.a,Enum.b,Enum.c},
type=Enum
*/
switch (e) {
/*space=Enum.a*/
case Enum.a:
print('a1');
break;
/*space=Enum.b*/
case Enum.b:
/*
error=unreachable,
space=Enum.a
*/
case Enum.a:
/*space=Enum.c*/
case Enum.c:
print('c');
break;
}
}