Skip to content

Commit 7cc63e4

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Add test for switch on generic enum
Change-Id: I9ac215a4a0e24f4d1a7a5cfe043fe071fbed5002 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/277980 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 9383820 commit 7cc63e4

9 files changed

+1052
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
enum Enum<T> {
6+
a<num>(),
7+
b<String>(),
8+
c<bool>(),
9+
}
10+
11+
method1(Enum<dynamic> e) {
12+
switch (e) {
13+
case Enum.a:
14+
case Enum.b:
15+
case Enum.c:
16+
}
17+
}
18+
19+
method2(Enum<num> e) {
20+
switch (e) {
21+
case Enum.a:
22+
case Enum.b:
23+
case Enum.c:
24+
}
25+
}
26+
27+
method3(Enum<int> e) {
28+
switch (e) {
29+
case Enum.a:
30+
case Enum.b:
31+
case Enum.c:
32+
}
33+
}
34+
35+
method4<T>(Enum<T> e) {
36+
switch (e) {
37+
case Enum.a:
38+
case Enum.b:
39+
case Enum.c:
40+
}
41+
}
42+
43+
method5<T extends num>(Enum<T> e) {
44+
switch (e) {
45+
case Enum.a:
46+
case Enum.b:
47+
case Enum.c:
48+
}
49+
}
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:22:15: Error: Type 'Enum<String>' of the case expression is not a subtype of type 'Enum<num>' of this switch expression.
6+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
7+
// case Enum.b:
8+
// ^
9+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:20:11: Context: The switch expression is here.
10+
// switch (e) {
11+
// ^
12+
//
13+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:23:15: Error: Type 'Enum<bool>' of the case expression is not a subtype of type 'Enum<num>' of this switch expression.
14+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
15+
// case Enum.c:
16+
// ^
17+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:20:11: Context: The switch expression is here.
18+
// switch (e) {
19+
// ^
20+
//
21+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:29:15: Error: Type 'Enum<num>' of the case expression is not a subtype of type 'Enum<int>' of this switch expression.
22+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
23+
// case Enum.a:
24+
// ^
25+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:28:11: Context: The switch expression is here.
26+
// switch (e) {
27+
// ^
28+
//
29+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:30:15: Error: Type 'Enum<String>' of the case expression is not a subtype of type 'Enum<int>' of this switch expression.
30+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
31+
// case Enum.b:
32+
// ^
33+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:28:11: Context: The switch expression is here.
34+
// switch (e) {
35+
// ^
36+
//
37+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:31:15: Error: Type 'Enum<bool>' of the case expression is not a subtype of type 'Enum<int>' of this switch expression.
38+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
39+
// case Enum.c:
40+
// ^
41+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:28:11: Context: The switch expression is here.
42+
// switch (e) {
43+
// ^
44+
//
45+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:37:15: Error: Type 'Enum<num>' of the case expression is not a subtype of type 'Enum<T>' of this switch expression.
46+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
47+
// case Enum.a:
48+
// ^
49+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:36:11: Context: The switch expression is here.
50+
// switch (e) {
51+
// ^
52+
//
53+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:38:15: Error: Type 'Enum<String>' of the case expression is not a subtype of type 'Enum<T>' of this switch expression.
54+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
55+
// case Enum.b:
56+
// ^
57+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:36:11: Context: The switch expression is here.
58+
// switch (e) {
59+
// ^
60+
//
61+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:39:15: Error: Type 'Enum<bool>' of the case expression is not a subtype of type 'Enum<T>' of this switch expression.
62+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
63+
// case Enum.c:
64+
// ^
65+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:36:11: Context: The switch expression is here.
66+
// switch (e) {
67+
// ^
68+
//
69+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:45:15: Error: Type 'Enum<num>' of the case expression is not a subtype of type 'Enum<T>' of this switch expression.
70+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
71+
// case Enum.a:
72+
// ^
73+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:44:11: Context: The switch expression is here.
74+
// switch (e) {
75+
// ^
76+
//
77+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:46:15: Error: Type 'Enum<String>' of the case expression is not a subtype of type 'Enum<T>' of this switch expression.
78+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
79+
// case Enum.b:
80+
// ^
81+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:44:11: Context: The switch expression is here.
82+
// switch (e) {
83+
// ^
84+
//
85+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:47:15: Error: Type 'Enum<bool>' of the case expression is not a subtype of type 'Enum<T>' of this switch expression.
86+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
87+
// case Enum.c:
88+
// ^
89+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:44:11: Context: The switch expression is here.
90+
// switch (e) {
91+
// ^
92+
//
93+
import self as self;
94+
import "dart:core" as core;
95+
96+
class Enum<T extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
97+
static const field core::List<self::Enum<dynamic>> values = #C10;
98+
enum-element static const field self::Enum<core::num> a = #C3;
99+
enum-element static const field self::Enum<core::String> b = #C6;
100+
enum-element static const field self::Enum<core::bool> c = #C9;
101+
const constructor •(core::int #index, core::String #name) → self::Enum<self::Enum::T%>
102+
: super core::_Enum::•(#index, #name)
103+
;
104+
method _enumToString() → core::String
105+
return "Enum.${this.{core::_Enum::_name}{core::String}}";
106+
}
107+
static method method1(self::Enum<dynamic> e) → dynamic {
108+
switch(e) /*isExplicitlyExhaustive*/ {
109+
#L1:
110+
case #C3:
111+
case #C6:
112+
case #C9:
113+
{}
114+
}
115+
}
116+
static method method2(self::Enum<core::num> e) → dynamic {
117+
switch(e) /*isExplicitlyExhaustive*/ {
118+
#L2:
119+
case #C3:
120+
case #C6:
121+
case #C9:
122+
{}
123+
}
124+
}
125+
static method method3(self::Enum<core::int> e) → dynamic {
126+
switch(e) /*isExplicitlyExhaustive*/ {
127+
#L3:
128+
case #C3:
129+
case #C6:
130+
case #C9:
131+
{}
132+
}
133+
}
134+
static method method4<T extends core::Object? = dynamic>(self::Enum<self::method4::T%> e) → dynamic {
135+
switch(e) /*isExplicitlyExhaustive*/ {
136+
#L4:
137+
case #C3:
138+
case #C6:
139+
case #C9:
140+
{}
141+
}
142+
}
143+
static method method5<T extends core::num>(self::Enum<self::method5::T> e) → dynamic {
144+
switch(e) /*isExplicitlyExhaustive*/ {
145+
#L5:
146+
case #C3:
147+
case #C6:
148+
case #C9:
149+
{}
150+
}
151+
}
152+
153+
constants {
154+
#C1 = 0
155+
#C2 = "a"
156+
#C3 = self::Enum<core::num> {index:#C1, _name:#C2}
157+
#C4 = 1
158+
#C5 = "b"
159+
#C6 = self::Enum<core::String> {index:#C4, _name:#C5}
160+
#C7 = 2
161+
#C8 = "c"
162+
#C9 = self::Enum<core::bool> {index:#C7, _name:#C8}
163+
#C10 = <self::Enum<dynamic>>[#C3, #C6, #C9]
164+
}
165+
166+
167+
Constructor coverage from constants:
168+
org-dartlang-testcase:///generic_enum_switch.dart:
169+
- Enum. (from org-dartlang-testcase:///generic_enum_switch.dart:5:6)
170+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
171+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:22:15: Error: Type 'Enum<String>' of the case expression is not a subtype of type 'Enum<num>' of this switch expression.
6+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
7+
// case Enum.b:
8+
// ^
9+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:20:11: Context: The switch expression is here.
10+
// switch (e) {
11+
// ^
12+
//
13+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:23:15: Error: Type 'Enum<bool>' of the case expression is not a subtype of type 'Enum<num>' of this switch expression.
14+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
15+
// case Enum.c:
16+
// ^
17+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:20:11: Context: The switch expression is here.
18+
// switch (e) {
19+
// ^
20+
//
21+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:29:15: Error: Type 'Enum<num>' of the case expression is not a subtype of type 'Enum<int>' of this switch expression.
22+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
23+
// case Enum.a:
24+
// ^
25+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:28:11: Context: The switch expression is here.
26+
// switch (e) {
27+
// ^
28+
//
29+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:30:15: Error: Type 'Enum<String>' of the case expression is not a subtype of type 'Enum<int>' of this switch expression.
30+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
31+
// case Enum.b:
32+
// ^
33+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:28:11: Context: The switch expression is here.
34+
// switch (e) {
35+
// ^
36+
//
37+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:31:15: Error: Type 'Enum<bool>' of the case expression is not a subtype of type 'Enum<int>' of this switch expression.
38+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
39+
// case Enum.c:
40+
// ^
41+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:28:11: Context: The switch expression is here.
42+
// switch (e) {
43+
// ^
44+
//
45+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:37:15: Error: Type 'Enum<num>' of the case expression is not a subtype of type 'Enum<T>' of this switch expression.
46+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
47+
// case Enum.a:
48+
// ^
49+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:36:11: Context: The switch expression is here.
50+
// switch (e) {
51+
// ^
52+
//
53+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:38:15: Error: Type 'Enum<String>' of the case expression is not a subtype of type 'Enum<T>' of this switch expression.
54+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
55+
// case Enum.b:
56+
// ^
57+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:36:11: Context: The switch expression is here.
58+
// switch (e) {
59+
// ^
60+
//
61+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:39:15: Error: Type 'Enum<bool>' of the case expression is not a subtype of type 'Enum<T>' of this switch expression.
62+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
63+
// case Enum.c:
64+
// ^
65+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:36:11: Context: The switch expression is here.
66+
// switch (e) {
67+
// ^
68+
//
69+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:45:15: Error: Type 'Enum<num>' of the case expression is not a subtype of type 'Enum<T>' of this switch expression.
70+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
71+
// case Enum.a:
72+
// ^
73+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:44:11: Context: The switch expression is here.
74+
// switch (e) {
75+
// ^
76+
//
77+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:46:15: Error: Type 'Enum<String>' of the case expression is not a subtype of type 'Enum<T>' of this switch expression.
78+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
79+
// case Enum.b:
80+
// ^
81+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:44:11: Context: The switch expression is here.
82+
// switch (e) {
83+
// ^
84+
//
85+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:47:15: Error: Type 'Enum<bool>' of the case expression is not a subtype of type 'Enum<T>' of this switch expression.
86+
// - 'Enum' is from 'pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart'.
87+
// case Enum.c:
88+
// ^
89+
// pkg/front_end/testcases/enhanced_enums/generic_enum_switch.dart:44:11: Context: The switch expression is here.
90+
// switch (e) {
91+
// ^
92+
//
93+
import self as self;
94+
import "dart:core" as core;
95+
96+
class Enum<T extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
97+
static const field core::List<self::Enum<dynamic>> values = #C10;
98+
enum-element static const field self::Enum<core::num> a = #C3;
99+
enum-element static const field self::Enum<core::String> b = #C6;
100+
enum-element static const field self::Enum<core::bool> c = #C9;
101+
const constructor •(core::int #index, core::String #name) → self::Enum<self::Enum::T%>
102+
: super core::_Enum::•(#index, #name)
103+
;
104+
method _enumToString() → core::String
105+
return "Enum.${this.{core::_Enum::_name}{core::String}}";
106+
}
107+
static method method1(self::Enum<dynamic> e) → dynamic {
108+
switch(e) /*isExplicitlyExhaustive*/ {
109+
#L1:
110+
case #C3:
111+
case #C6:
112+
case #C9:
113+
{}
114+
}
115+
}
116+
static method method2(self::Enum<core::num> e) → dynamic {
117+
switch(e) /*isExplicitlyExhaustive*/ {
118+
#L2:
119+
case #C3:
120+
case #C6:
121+
case #C9:
122+
{}
123+
}
124+
}
125+
static method method3(self::Enum<core::int> e) → dynamic {
126+
switch(e) /*isExplicitlyExhaustive*/ {
127+
#L3:
128+
case #C3:
129+
case #C6:
130+
case #C9:
131+
{}
132+
}
133+
}
134+
static method method4<T extends core::Object? = dynamic>(self::Enum<self::method4::T%> e) → dynamic {
135+
switch(e) /*isExplicitlyExhaustive*/ {
136+
#L4:
137+
case #C3:
138+
case #C6:
139+
case #C9:
140+
{}
141+
}
142+
}
143+
static method method5<T extends core::num>(self::Enum<self::method5::T> e) → dynamic {
144+
switch(e) /*isExplicitlyExhaustive*/ {
145+
#L5:
146+
case #C3:
147+
case #C6:
148+
case #C9:
149+
{}
150+
}
151+
}
152+
153+
constants {
154+
#C1 = 0
155+
#C2 = "a"
156+
#C3 = self::Enum<core::num> {index:#C1, _name:#C2}
157+
#C4 = 1
158+
#C5 = "b"
159+
#C6 = self::Enum<core::String> {index:#C4, _name:#C5}
160+
#C7 = 2
161+
#C8 = "c"
162+
#C9 = self::Enum<core::bool> {index:#C7, _name:#C8}
163+
#C10 = <self::Enum<dynamic>>[#C3, #C6, #C9]
164+
}
165+
166+
167+
Constructor coverage from constants:
168+
org-dartlang-testcase:///generic_enum_switch.dart:
169+
- Enum. (from org-dartlang-testcase:///generic_enum_switch.dart:5:6)
170+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
171+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)

0 commit comments

Comments
 (0)