Fix for 'int' in const List<void>.
This is another issue with runtimeTypeMatch(). This time we will use
both, TypeSystem and DartType.isSubtypeOf(), and accept the value if
any of them succeedes.
R=brianwilkerson@google.com, paulberry@google.com
Change-Id: I77294485e1d62e016e25992ba869e909608b1e42
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97540
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 3ae8c0a..569489d 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -918,6 +918,10 @@
// fixed.
return true;
}
+ // TODO(scheglov ) Switch to using this, but not now, dartbug.com/33441
+ if (typeSystem.isSubtypeOf(objType, type)) {
+ return true;
+ }
return objType.isSubtypeOf(type);
}
diff --git a/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
index c92a8a0..98381f5 100644
--- a/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
@@ -17,31 +17,56 @@
@reflectiveTest
class ListElementTypeNotAssignableTest extends DriverResolutionTest {
- test_explicitTypeArgs_const() async {
+ test_const_stringInt() async {
await assertErrorsInCode('''
var v = const <String>[42];
''', [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
}
- test_explicitTypeArgs_const_actualTypeMatch() async {
- await assertNoErrorsInCode('''
-const dynamic x = null;
-var v = const <String>[x];
-''');
- }
-
- test_explicitTypeArgs_const_actualTypeMismatch() async {
+ test_const_stringInt_dynamic() async {
await assertErrorsInCode('''
const dynamic x = 42;
var v = const <String>[x];
''', [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
}
- test_explicitTypeArgs_notConst() async {
+ test_const_stringNull() async {
+ await assertNoErrorsInCode('''
+var v = const <String>[null];
+''');
+ }
+
+ test_const_stringNull_dynamic() async {
+ await assertNoErrorsInCode('''
+const dynamic x = null;
+var v = const <String>[x];
+''');
+ }
+
+ test_const_voidInt() async {
+ await assertNoErrorsInCode('''
+var v = const <void>[42];
+''');
+ }
+
+ test_nonConst_stringInt() async {
await assertErrorsInCode('''
-var v = <String> [42];
+var v = <String>[42];
''', [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
}
+
+ test_nonConst_stringInt_dynamic() async {
+ await assertNoErrorsInCode('''
+const dynamic x = 42;
+var v = <String>[x];
+''');
+ }
+
+ test_nonConst_voidInt() async {
+ await assertNoErrorsInCode('''
+var v = <void>[42];
+''');
+ }
}
@reflectiveTest