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