Handle covariant parameters in function types

Closes #33575

Change-Id: I743a951f5864ca538b588441ecba2680eba2081f
Reviewed-on: https://dart-review.googlesource.com/61924
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index b2584d4..2136ceb 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -439,11 +439,20 @@
     }
     List<DartType> parameterTypes = <DartType>[];
     List<DartType> optionalParameterTypes = <DartType>[];
+
+    DartType getParameterType(ir.VariableDeclaration variable) {
+      if (variable.isCovariant || variable.isGenericCovariantImpl) {
+        // A covariant parameter has type `Object` in the method signature.
+        return commonElements.objectType;
+      }
+      return getDartType(variable.type);
+    }
+
     for (ir.VariableDeclaration variable in node.positionalParameters) {
       if (parameterTypes.length == node.requiredParameterCount) {
-        optionalParameterTypes.add(getDartType(variable.type));
+        optionalParameterTypes.add(getParameterType(variable));
       } else {
-        parameterTypes.add(getDartType(variable.type));
+        parameterTypes.add(getParameterType(variable));
       }
     }
     List<String> namedParameters = <String>[];
@@ -452,7 +461,7 @@
         node.namedParameters.toList()..sort((a, b) => a.name.compareTo(b.name));
     for (ir.VariableDeclaration variable in sortedNamedParameters) {
       namedParameters.add(variable.name);
-      namedParameterTypes.add(getDartType(variable.type));
+      namedParameterTypes.add(getParameterType(variable));
     }
     List<FunctionTypeVariable> typeVariables;
     if (node.typeParameters.isNotEmpty && options.strongMode) {
diff --git a/tests/compiler/dart2js/model/type_substitution_test.dart b/tests/compiler/dart2js/model/type_substitution_test.dart
index a00a701..2844a00 100644
--- a/tests/compiler/dart2js/model/type_substitution_test.dart
+++ b/tests/compiler/dart2js/model/type_substitution_test.dart
@@ -108,10 +108,8 @@
     ElementEnvironment elementEnvironment,
     List<DartType> arguments,
     List<DartType> parameters,
-    String name1,
-    String name2) {
-  DartType type1 = getType(elementEnvironment, name1);
-  DartType type2 = getType(elementEnvironment, name2);
+    DartType type1,
+    DartType type2) {
   DartType subst = type1.subst(arguments, parameters);
   Expect.equals(
       type2, subst, "$type1.subst($arguments,$parameters)=$subst != $type2");
@@ -119,57 +117,7 @@
 
 testTypeSubstitution() async {
   var env = await TypeEnvironment.create(r"""
-      typedef void Typedef1<X,Y>(X x1, Y y2);
-      typedef void Typedef2<Z>(Z z1);
-
-      class Class<T,S> {
-        void void1() {}
-        void void2() {}
-        void dynamic1(dynamic a) {}
-        void dynamic2(dynamic b) {}
-        void int1(int a) {}
-        void int2(int a) {}
-        void String1(String a) {}
-        void String2(String a) {}
-        void ListInt1(List<int> a) {}
-        void ListInt2(List<int> b) {}
-        void ListT1(List<T> a) {}
-        void ListT2(List<int> b) {}
-        void ListS1(List<S> a) {}
-        void ListS2(List<String> b) {}
-        void ListListT1(List<List<T>> a) {}
-        void ListListT2(List<List<int>> b) {}
-        void ListRaw1(List a) {}
-        void ListRaw2(List b) {}
-        void ListDynamic1(List<dynamic> a) {}
-        void ListDynamic2(List<dynamic> b) {}
-        void MapIntString1(Map<T,S> a) {}
-        void MapIntString2(Map<int,String> b) {}
-        void MapTString1(Map<T,String> a) {}
-        void MapTString2(Map<int,String> b) {}
-        void MapDynamicString1(Map<dynamic,String> a) {}
-        void MapDynamicString2(Map<dynamic,String> b) {}
-        void TypeVarT1(T t1) {}
-        void TypeVarT2(int t2) {}
-        void TypeVarS1(S s1) {}
-        void TypeVarS2(String s2) {}
-        void Function1a(int a(String s1)) {}
-        void Function2a(int b(String s2)) {}
-        void Function1b(void a(T t1, S s1)) {}
-        void Function2b(void b(int t2, String s2)) {}
-        void Function1c(void a(dynamic t1, dynamic s1)) {}
-        void Function2c(void b(dynamic t2, dynamic s2)) {}
-        void Typedef1a(Typedef1<T,S> a) {}
-        void Typedef2a(Typedef1<int,String> b) {}
-        void Typedef1b(Typedef1<dynamic,dynamic> a) {}
-        void Typedef2b(Typedef1<dynamic,dynamic> b) {}
-        void Typedef1c(Typedef1 a) {}
-        void Typedef2c(Typedef1 b) {}
-        void Typedef1d(Typedef2<T> a) {}
-        void Typedef2d(Typedef2<int> b) {}
-        void Typedef1e(Typedef2<S> a) {}
-        void Typedef2e(Typedef2<String> b) {}
-      }
+      class Class<T,S> {}
       """);
   InterfaceType Class_T_S = env["Class"];
   Expect.isNotNull(Class_T_S);
@@ -184,82 +132,89 @@
   Expect.isNotNull(S);
   Expect.isTrue(S.isTypeVariable);
 
-  DartType intType = env['int']; //getType(compiler, "int1");
+  DartType intType = env['int'];
   Expect.isNotNull(intType);
   Expect.isTrue(intType.isInterfaceType);
 
-  DartType StringType = env['String']; //getType(compiler, "String1");
+  DartType StringType = env['String'];
   Expect.isNotNull(StringType);
   Expect.isTrue(StringType.isInterfaceType);
 
+  ClassEntity ListClass = env.getElement('List');
+  ClassEntity MapClass = env.getElement('Map');
+
   List<DartType> parameters = <DartType>[T, S];
   List<DartType> arguments = <DartType>[intType, StringType];
 
-  // TODO(johnniwinther): Create types directly from strings to improve
-  // test readability.
-
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "void1", "void2");
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "dynamic1", "dynamic2");
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "int1", "int2");
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "String1", "String2");
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "ListInt1", "ListInt2");
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "ListT1", "ListT2");
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "ListS1", "ListS2");
-  testSubstitution(env.elementEnvironment, arguments, parameters, "ListListT1",
-      "ListListT2");
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "ListRaw1", "ListRaw2");
   testSubstitution(env.elementEnvironment, arguments, parameters,
-      "ListDynamic1", "ListDynamic2");
+      const VoidType(), const VoidType());
   testSubstitution(env.elementEnvironment, arguments, parameters,
-      "MapIntString1", "MapIntString2");
-  testSubstitution(env.elementEnvironment, arguments, parameters, "MapTString1",
-      "MapTString2");
+      const DynamicType(), const DynamicType());
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, intType, intType);
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, StringType, StringType);
   testSubstitution(env.elementEnvironment, arguments, parameters,
-      "MapDynamicString1", "MapDynamicString2");
+      instantiate(ListClass, [intType]), instantiate(ListClass, [intType]));
+  testSubstitution(env.elementEnvironment, arguments, parameters,
+      instantiate(ListClass, [T]), instantiate(ListClass, [intType]));
+  testSubstitution(env.elementEnvironment, arguments, parameters,
+      instantiate(ListClass, [S]), instantiate(ListClass, [StringType]));
   testSubstitution(
-      env.elementEnvironment, arguments, parameters, "TypeVarT1", "TypeVarT2");
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      instantiate(ListClass, [
+        instantiate(ListClass, [T])
+      ]),
+      instantiate(ListClass, [
+        instantiate(ListClass, [intType])
+      ]));
   testSubstitution(
-      env.elementEnvironment, arguments, parameters, "TypeVarS1", "TypeVarS2");
-  testSubstitution(env.elementEnvironment, arguments, parameters, "Function1a",
-      "Function2a");
-  testSubstitution(env.elementEnvironment, arguments, parameters, "Function1b",
-      "Function2b");
-  testSubstitution(env.elementEnvironment, arguments, parameters, "Function1c",
-      "Function2c");
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      instantiate(ListClass, [const DynamicType()]),
+      instantiate(ListClass, [const DynamicType()]));
   testSubstitution(
-      env.elementEnvironment, arguments, parameters, "Typedef1a", "Typedef2a");
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      instantiate(MapClass, [intType, StringType]),
+      instantiate(MapClass, [intType, StringType]));
   testSubstitution(
-      env.elementEnvironment, arguments, parameters, "Typedef1b", "Typedef2b");
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      instantiate(MapClass, [T, StringType]),
+      instantiate(MapClass, [intType, StringType]));
   testSubstitution(
-      env.elementEnvironment, arguments, parameters, "Typedef1c", "Typedef2c");
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      instantiate(MapClass, [const DynamicType(), StringType]),
+      instantiate(MapClass, [const DynamicType(), StringType]));
+  testSubstitution(env.elementEnvironment, arguments, parameters, T, intType);
   testSubstitution(
-      env.elementEnvironment, arguments, parameters, "Typedef1d", "Typedef2d");
+      env.elementEnvironment, arguments, parameters, S, StringType);
   testSubstitution(
-      env.elementEnvironment, arguments, parameters, "Typedef1e", "Typedef2e");
-
-  // Substitution in unalias.
-  DartType Typedef2_int_String = getType(env.elementEnvironment, "Typedef2a");
-  Expect.isNotNull(Typedef2_int_String);
-  DartType Function_int_String = getType(env.elementEnvironment, "Function2b");
-  Expect.isNotNull(Function_int_String);
-  DartType unalias1 = Typedef2_int_String.unaliased;
-  Expect.equals(Function_int_String, unalias1,
-      '$Typedef2_int_String.unalias=$unalias1 != $Function_int_String');
-
-  DartType Typedef1 = getType(env.elementEnvironment, "Typedef1c");
-  Expect.isNotNull(Typedef1);
-  DartType Function_dynamic_dynamic =
-      getType(env.elementEnvironment, "Function1c");
-  Expect.isNotNull(Function_dynamic_dynamic);
-  DartType unalias2 = Typedef1.unaliased;
-  Expect.equals(Function_dynamic_dynamic, unalias2,
-      '$Typedef1.unalias=$unalias2 != $Function_dynamic_dynamic');
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      new FunctionType(intType, [StringType], [], [], [], []),
+      new FunctionType(intType, [StringType], [], [], [], []));
+  testSubstitution(
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      new FunctionType(const VoidType(), [T, S], [], [], [], []),
+      new FunctionType(
+          const VoidType(), [intType, StringType], [], [], [], []));
+  testSubstitution(
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      new FunctionType(const VoidType(), [const DynamicType()], [], [], [], []),
+      new FunctionType(
+          const VoidType(), [const DynamicType()], [], [], [], []));
 }
diff --git a/tests/compiler/dart2js/rti/data/call_typed_generic.dart b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
index d53e00c..69a082c1 100644
--- a/tests/compiler/dart2js/rti/data/call_typed_generic.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
@@ -6,10 +6,12 @@
 import 'package:meta/dart2js.dart';
 
 /*kernel.class: A:needsArgs*/
-/*omit.class: A:needsArgs*/
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
+/*omit.class: A:*/
 class A<T> {
-  /*element: A.call:needsSignature*/
+  /*kernel.element: A.call:needsSignature*/
+  /*strong.element: A.call:*/
+  /*omit.element: A.call:*/
   call(T t) {}
 }
 
diff --git a/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart b/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart
index 2a6bae7..cb5b8c4 100644
--- a/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart
@@ -6,10 +6,12 @@
 import 'package:meta/dart2js.dart';
 
 /*kernel.class: A:needsArgs*/
-/*omit.class: A:needsArgs*/
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
+/*omit.class: A:*/
 class A<T> {
-  /*element: A.call:needsSignature*/
+  /*kernel.element: A.call:needsSignature*/
+  /*strong.element: A.call:*/
+  /*omit.element: A.call:*/
   call(T t) {}
 }
 
diff --git a/tests/compiler/dart2js/rti/data/method_signatures.dart b/tests/compiler/dart2js/rti/data/method_signatures.dart
index 5a96cf0..b76455a 100644
--- a/tests/compiler/dart2js/rti/data/method_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/method_signatures.dart
@@ -16,10 +16,12 @@
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*omit.class: Class2:needsArgs*/
 /*strong.class: Class2:direct,explicit=[Class2.T],needsArgs*/
+/*omit.class: Class2:*/
 class Class2<T> {
-  /*element: Class2.method4:needsSignature*/
+  /*kernel.element: Class2.method4:needsSignature*/
+  /*strong.element: Class2.method4:*/
+  /*omit.element: Class2.method4:*/
   num method4(T n) => null;
 }
 
diff --git a/tests/compiler/dart2js/rti/data/tear_off_generic.dart b/tests/compiler/dart2js/rti/data/tear_off_generic.dart
index d38ed3a..c8263c4 100644
--- a/tests/compiler/dart2js/rti/data/tear_off_generic.dart
+++ b/tests/compiler/dart2js/rti/data/tear_off_generic.dart
@@ -3,10 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*kernel.class: A:needsArgs*/
-/*omit.class: A:needsArgs*/
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
+/*omit.class: A:*/
 class A<T> {
-  /*element: A.m:needsSignature*/
+  /*kernel.element: A.m:needsSignature*/
+  /*strong.element: A.m:*/
+  /*omit.element: A.m:*/
   void m(T t) {}
 
   /*element: A.f:*/
diff --git a/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart b/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart
index 887e55f..7437085 100644
--- a/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart
+++ b/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart
@@ -3,9 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
-/*omit.class: A:needsArgs*/
+/*omit.class: A:*/
 class A<T> {
-  /*element: A.m:needsSignature*/
+  /*kernel.element: A.m:needsSignature*/
+  /*strong.element: A.m:*/
+  /*omit.element: A.m:*/
   void m(T t) {}
 
   /*element: A.f:*/
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index c178a3a..a79000f 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -58,17 +58,8 @@
 field_type_check2_test/01: MissingRuntimeError
 regress_23996_test: RuntimeError # Jsshell does not provide non-zero timers, Issue 7728
 
-[ $compiler == dart2js && $runtime != none ]
-covariant_tear_off_type_test: RuntimeError
-
 [ $compiler == dart2js && $runtime != none && $checked ]
 assert_with_message_test: RuntimeError
-function_subtype_bound_closure3_test: RuntimeError
-function_subtype_bound_closure4_test: RuntimeError
-function_subtype_call1_test: RuntimeError
-function_subtype_call2_test: RuntimeError
-function_subtype_cast1_test: RuntimeError
-function_subtype_not1_test: RuntimeError
 function_type/function_type0_test: RuntimeError # Issue 30476
 function_type/function_type10_test: RuntimeError # Issue 30476
 function_type/function_type12_test: RuntimeError # Issue 30476
@@ -140,8 +131,6 @@
 function_type/function_type90_test: RuntimeError # Issue 30476
 function_type/function_type96_test: RuntimeError # Issue 30476
 function_type/function_type9_test: RuntimeError # Issue 30476
-function_type_alias2_test: RuntimeError
-function_type_alias4_test: RuntimeError
 syncstar_covariant_type_test: RuntimeError # dart2js misplaces check in Iterator, not Iterable.
 syncstar_dcall_type_test: RuntimeError # dart2js misplaces check in Iterator, not Iterable.
 
@@ -319,8 +308,6 @@
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
 generalized_void_syntax_test: CompileTimeError # Issue #30176.
-generic_closure_test/01: RuntimeError
-generic_closure_test/none: RuntimeError
 generic_function_dcall_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_typedef_test: RuntimeError
@@ -516,13 +503,9 @@
 [ $compiler == dart2js && !$checked && $fasta ]
 bool_check_test: RuntimeError
 bool_condition_check_test: RuntimeError
-forwarding_stub_tearoff_generic_test: RuntimeError
-forwarding_stub_tearoff_test: RuntimeError
-issue31596_implement_covariant_test: RuntimeError
 issue31596_super_test/02: MissingCompileTimeError
 issue31596_super_test/04: MissingCompileTimeError
 issue31596_super_test/05: RuntimeError
-issue31596_test: RuntimeError
 
 [ $compiler == dart2js && $fast_startup ]
 library_env_test/has_mirror_support: Fail # mirrors not supported
@@ -570,7 +553,6 @@
 constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 covariance_type_parameter_test/02: RuntimeError
-covariant_override/tear_off_type_test: RuntimeError
 covariant_subtyping_test: Crash # Unsupported operation: Unsupported type parameter type node E.
 cyclic_constructor_test/01: Crash # Stack Overflow
 cyclic_type_test/00: RuntimeError
@@ -612,28 +594,15 @@
 full_stacktrace1_test: RuntimeError # Issue 12698
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
-function_subtype3_test: RuntimeError
-function_subtype_bound_closure3_test: RuntimeError
-function_subtype_bound_closure4_test: RuntimeError
-function_subtype_call1_test: RuntimeError
-function_subtype_call2_test: RuntimeError
-function_subtype_cast1_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
-function_subtype_not1_test: RuntimeError
 function_subtype_setter0_test: RuntimeError
-function_type_alias2_test: RuntimeError
-function_type_alias4_test: RuntimeError
-generic_closure_test/01: RuntimeError
-generic_closure_test/none: RuntimeError
 generic_function_bounds_test: RuntimeError
 generic_function_dcall_test: RuntimeError
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
-generic_method_types_test/02: RuntimeError
 generic_methods_bounds_test/02: MissingRuntimeError
-generic_methods_generic_class_tearoff_test: RuntimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
 generic_methods_unused_parameter_test: RuntimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
@@ -779,7 +748,6 @@
 regress_29784_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in () for j:constructor(A.ok).
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
 regress_30339_test: CompileTimeError
-runtime_type_function_test: RuntimeError
 setter_no_getter_test/01: CompileTimeError
 setter_override_test/00: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
@@ -793,9 +761,6 @@
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
 super_call4_test/01: MissingCompileTimeError
-super_operator_index6_test: CompileTimeError
-super_operator_index7_test: CompileTimeError
-super_operator_index8_test: CompileTimeError
 super_test: RuntimeError
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
@@ -952,7 +917,6 @@
 constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 covariance_type_parameter_test/02: RuntimeError
-covariant_override/tear_off_type_test: RuntimeError
 covariant_subtyping_test: RuntimeError
 cyclic_constructor_test/01: Crash # Issue 30856
 cyclic_type_test/00: RuntimeError
@@ -1007,29 +971,16 @@
 full_stacktrace1_test: RuntimeError # Issue 12698
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
-function_subtype3_test: RuntimeError
-function_subtype_bound_closure3_test: RuntimeError
-function_subtype_bound_closure4_test: RuntimeError
-function_subtype_call1_test: RuntimeError
-function_subtype_call2_test: RuntimeError
-function_subtype_cast1_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
-function_subtype_not1_test: RuntimeError
 function_subtype_setter0_test: RuntimeError
-function_type_alias2_test: RuntimeError
-function_type_alias4_test: RuntimeError
-generic_closure_test/01: RuntimeError
-generic_closure_test/none: RuntimeError
 generic_function_bounds_test: RuntimeError
 generic_function_dcall_test: RuntimeError
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
-generic_method_types_test/02: RuntimeError
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_bounds_test/02: MissingRuntimeError
-generic_methods_generic_class_tearoff_test: RuntimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
 generic_methods_overriding_test/01: MissingCompileTimeError
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
@@ -1250,7 +1201,6 @@
 regress_29784_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in () for j:constructor(A.ok).
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
 regress_30339_test: CompileTimeError
-runtime_type_function_test: RuntimeError
 setter4_test: MissingCompileTimeError
 setter_no_getter_test/01: CompileTimeError
 setter_override_test/00: MissingCompileTimeError
@@ -1267,9 +1217,6 @@
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
 super_call4_test/01: MissingCompileTimeError
-super_operator_index6_test: CompileTimeError
-super_operator_index7_test: CompileTimeError
-super_operator_index8_test: CompileTimeError
 super_test: RuntimeError
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
@@ -1452,7 +1399,6 @@
 constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 covariance_type_parameter_test/02: RuntimeError
-covariant_override/tear_off_type_test: RuntimeError
 covariant_subtyping_test: RuntimeError
 cyclic_constructor_test/01: Crash # Issue 30856
 cyclic_type_variable_test/01: MissingCompileTimeError
@@ -1503,27 +1449,16 @@
 full_stacktrace1_test: RuntimeError # Issue 12698
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
-function_subtype3_test: RuntimeError
-function_subtype_bound_closure3_test: RuntimeError
-function_subtype_bound_closure4_test: RuntimeError
-function_subtype_call1_test: RuntimeError
-function_subtype_call2_test: RuntimeError
-function_subtype_cast1_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
-function_subtype_not1_test: RuntimeError
 function_subtype_setter0_test: RuntimeError
-function_type_alias2_test: RuntimeError
-function_type_alias4_test: RuntimeError
 generic_function_bounds_test: RuntimeError
 generic_function_dcall_test: RuntimeError
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
-generic_method_types_test/02: RuntimeError
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_bounds_test/02: MissingRuntimeError
-generic_methods_generic_class_tearoff_test: RuntimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
 generic_methods_overriding_test/01: MissingCompileTimeError
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
@@ -1751,7 +1686,6 @@
 regress_29784_test/01: Crash # Issue 29784
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
 regress_30339_test: CompileTimeError
-runtime_type_function_test: RuntimeError
 setter4_test: MissingCompileTimeError
 setter_no_getter_test/01: CompileTimeError
 setter_override_test/00: MissingCompileTimeError
@@ -1863,7 +1797,7 @@
 cyclic_type2_test: RuntimeError # Issue 31054
 cyclic_type_test/0*: RuntimeError # Issue 31054
 f_bounded_quantification5_test: RuntimeError # Issue 31054
-generic_closure_test: RuntimeError # Issue 31054
+generic_closure_test/01: RuntimeError # Uses runtimeType.toString()
 mixin_mixin2_test: RuntimeError # Issue 31054
 mixin_mixin3_test: RuntimeError # Issue 31054
 mixin_mixin4_test: RuntimeError # Issue 31054
@@ -1872,3 +1806,4 @@
 mixin_mixin_bound2_test: RuntimeError # Issue 31054
 mixin_mixin_bound_test: RuntimeError # Issue 31054
 mixin_mixin_type_arguments_test: RuntimeError # Issue 31054
+runtime_type_function_test: RuntimeError # Uses runtimeType.toString()