diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart index 6809bc97f49..92a5cabaeda 100644 --- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart @@ -4392,8 +4392,10 @@ class BodyBuilder extends ScopeListener String name = pop(); List typeArguments = pop(); if (inMetadata && typeArguments != null) { - handleRecoverableError(fasta.messageMetadataTypeArguments, - nameLastToken.next, nameLastToken.next); + if (!libraryBuilder.enableGenericMetadataInLibrary) { + handleRecoverableError(fasta.messageMetadataTypeArguments, + nameLastToken.next, nameLastToken.next); + } } Object type = pop(); diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart index b973591eb6e..b4767203f12 100644 --- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart @@ -298,6 +298,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl { Version _enableNonNullableVersionInLibrary; bool _enableTripleShiftInLibrary; bool _enableExtensionMethodsInLibrary; + bool _enableGenericMetadataInLibrary; bool get enableVarianceInLibrary => _enableVarianceInLibrary ??= loader.target.isExperimentEnabledInLibrary( @@ -332,6 +333,10 @@ class SourceLibraryBuilder extends LibraryBuilderImpl { .isExperimentEnabledInLibrary( ExperimentalFlag.extensionMethods, _packageUri ?? importUri); + bool get enableGenericMetadataInLibrary => _enableGenericMetadataInLibrary ??= + loader.target.isExperimentEnabledInLibrary( + ExperimentalFlag.genericMetadata, _packageUri ?? importUri); + void updateLibraryNNBDSettings() { library.isNonNullableByDefault = isNonNullableByDefault; if (enableNonNullableInLibrary) { diff --git a/pkg/front_end/testcases/generic_metadata/folder.options b/pkg/front_end/testcases/generic_metadata/folder.options new file mode 100644 index 00000000000..2d131712a7b --- /dev/null +++ b/pkg/front_end/testcases/generic_metadata/folder.options @@ -0,0 +1 @@ +--enable-experiment=generic-metadata \ No newline at end of file diff --git a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart new file mode 100644 index 00000000000..15c10655669 --- /dev/null +++ b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart @@ -0,0 +1,37 @@ +// Copyright (c) 2021, 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. + +class A { + const A(); +} + +class B { + const B(); +} + +class C { + const C(); +} + +class D { + const D(); +} + +@A() // error +@B() // error +@C() // error +@D() // error +test() {} + +@A() // ok +@A() // ok +@B() // ok +@B() // ok +@C() // ok +@C() // ok +@C() // ok +@D() // ok +@D() // ok +@D() // ok +main() {} \ No newline at end of file diff --git a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.strong.expect b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.strong.expect new file mode 100644 index 00000000000..d7ddced8c3d --- /dev/null +++ b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.strong.expect @@ -0,0 +1,99 @@ +library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:21:2: Error: Expected 1 type arguments. +// @A() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:6:9: Context: Found this candidate, but the arguments don't match. +// const A(); +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:22:2: Error: Expected 2 type arguments. +// @B() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:10:9: Context: Found this candidate, but the arguments don't match. +// const B(); +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:23:2: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'C'. +// Try changing type arguments so that they conform to the bounds. +// @C() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:13:9: Context: This is the type variable whose bound isn't conformed to. +// class C { +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:24:2: Error: Type argument 'num' doesn't conform to the bound 'S' of the type variable 'T' on 'D'. +// Try changing type arguments so that they conform to the bounds. +// @D() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:17:24: Context: This is the type variable whose bound isn't conformed to. +// class D { +// ^ +// +import self as self; +import "dart:core" as core; + +class A extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::A + : super core::Object::•() + ; +} +class B extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::B + : super core::Object::•() + ; +} +class C extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::C + : super core::Object::•() + ; +} +class D extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::D + : super core::Object::•() + ; +} +@invalid-expression "pkg/front_end/testcases/generic_metadata/generic_metadata.dart:21:2: Error: Expected 1 type arguments. +@A() // error + ^" +@invalid-expression "pkg/front_end/testcases/generic_metadata/generic_metadata.dart:22:2: Error: Expected 2 type arguments. +@B() // error + ^" +@#C1 +@#C2 +static method test() → dynamic {} +@#C3 +@#C4 +@#C5 +@#C6 +@#C7 +@#C7 +@#C8 +@#C9 +@#C9 +@#C10 +static method main() → dynamic {} + +constants { + #C1 = self::C {} + #C2 = self::D {} + #C3 = self::A {} + #C4 = self::A {} + #C5 = self::B {} + #C6 = self::B {} + #C7 = self::C {} + #C8 = self::C {} + #C9 = self::D {} + #C10 = self::D {} +} + + +Constructor coverage from constants: +org-dartlang-testcase:///generic_metadata.dart: +- C. (from org-dartlang-testcase:///generic_metadata.dart:14:9) +- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9) +- D. (from org-dartlang-testcase:///generic_metadata.dart:18:9) +- A. (from org-dartlang-testcase:///generic_metadata.dart:6:9) +- B. (from org-dartlang-testcase:///generic_metadata.dart:10:9) diff --git a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.strong.transformed.expect b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.strong.transformed.expect new file mode 100644 index 00000000000..d7ddced8c3d --- /dev/null +++ b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.strong.transformed.expect @@ -0,0 +1,99 @@ +library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:21:2: Error: Expected 1 type arguments. +// @A() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:6:9: Context: Found this candidate, but the arguments don't match. +// const A(); +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:22:2: Error: Expected 2 type arguments. +// @B() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:10:9: Context: Found this candidate, but the arguments don't match. +// const B(); +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:23:2: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'C'. +// Try changing type arguments so that they conform to the bounds. +// @C() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:13:9: Context: This is the type variable whose bound isn't conformed to. +// class C { +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:24:2: Error: Type argument 'num' doesn't conform to the bound 'S' of the type variable 'T' on 'D'. +// Try changing type arguments so that they conform to the bounds. +// @D() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:17:24: Context: This is the type variable whose bound isn't conformed to. +// class D { +// ^ +// +import self as self; +import "dart:core" as core; + +class A extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::A + : super core::Object::•() + ; +} +class B extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::B + : super core::Object::•() + ; +} +class C extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::C + : super core::Object::•() + ; +} +class D extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::D + : super core::Object::•() + ; +} +@invalid-expression "pkg/front_end/testcases/generic_metadata/generic_metadata.dart:21:2: Error: Expected 1 type arguments. +@A() // error + ^" +@invalid-expression "pkg/front_end/testcases/generic_metadata/generic_metadata.dart:22:2: Error: Expected 2 type arguments. +@B() // error + ^" +@#C1 +@#C2 +static method test() → dynamic {} +@#C3 +@#C4 +@#C5 +@#C6 +@#C7 +@#C7 +@#C8 +@#C9 +@#C9 +@#C10 +static method main() → dynamic {} + +constants { + #C1 = self::C {} + #C2 = self::D {} + #C3 = self::A {} + #C4 = self::A {} + #C5 = self::B {} + #C6 = self::B {} + #C7 = self::C {} + #C8 = self::C {} + #C9 = self::D {} + #C10 = self::D {} +} + + +Constructor coverage from constants: +org-dartlang-testcase:///generic_metadata.dart: +- C. (from org-dartlang-testcase:///generic_metadata.dart:14:9) +- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9) +- D. (from org-dartlang-testcase:///generic_metadata.dart:18:9) +- A. (from org-dartlang-testcase:///generic_metadata.dart:6:9) +- B. (from org-dartlang-testcase:///generic_metadata.dart:10:9) diff --git a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.textual_outline.expect b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.textual_outline.expect new file mode 100644 index 00000000000..e109be7a06e --- /dev/null +++ b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.textual_outline.expect @@ -0,0 +1,28 @@ +class A { + const A(); +} +class B { + const B(); +} +class C { + const C(); +} +class D { + const D(); +} +@A() +@B() +@C() +@D() +test() {} +@A() +@A() +@B() +@B() +@C() +@C() +@C() +@D() +@D() +@D() +main() {} diff --git a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.expect new file mode 100644 index 00000000000..338bb8d7580 --- /dev/null +++ b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.expect @@ -0,0 +1,99 @@ +library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:21:2: Error: Expected 1 type arguments. +// @A() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:6:9: Context: Found this candidate, but the arguments don't match. +// const A(); +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:22:2: Error: Expected 2 type arguments. +// @B() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:10:9: Context: Found this candidate, but the arguments don't match. +// const B(); +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:23:2: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'C'. +// Try changing type arguments so that they conform to the bounds. +// @C() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:13:9: Context: This is the type variable whose bound isn't conformed to. +// class C { +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:24:2: Error: Type argument 'num' doesn't conform to the bound 'S' of the type variable 'T' on 'D'. +// Try changing type arguments so that they conform to the bounds. +// @D() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:17:24: Context: This is the type variable whose bound isn't conformed to. +// class D { +// ^ +// +import self as self; +import "dart:core" as core; + +class A extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::A + : super core::Object::•() + ; +} +class B extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::B + : super core::Object::•() + ; +} +class C extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::C + : super core::Object::•() + ; +} +class D extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::D + : super core::Object::•() + ; +} +@invalid-expression "pkg/front_end/testcases/generic_metadata/generic_metadata.dart:21:2: Error: Expected 1 type arguments. +@A() // error + ^" +@invalid-expression "pkg/front_end/testcases/generic_metadata/generic_metadata.dart:22:2: Error: Expected 2 type arguments. +@B() // error + ^" +@#C1 +@#C2 +static method test() → dynamic {} +@#C3 +@#C4 +@#C5 +@#C6 +@#C7 +@#C7 +@#C8 +@#C9 +@#C9 +@#C10 +static method main() → dynamic {} + +constants { + #C1 = self::C {} + #C2 = self::D {} + #C3 = self::A {} + #C4 = self::A {} + #C5 = self::B {} + #C6 = self::B {} + #C7 = self::C {} + #C8 = self::C {} + #C9 = self::D {} + #C10 = self::D {} +} + + +Constructor coverage from constants: +org-dartlang-testcase:///generic_metadata.dart: +- C. (from org-dartlang-testcase:///generic_metadata.dart:14:9) +- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9) +- D. (from org-dartlang-testcase:///generic_metadata.dart:18:9) +- A. (from org-dartlang-testcase:///generic_metadata.dart:6:9) +- B. (from org-dartlang-testcase:///generic_metadata.dart:10:9) diff --git a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.outline.expect b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.outline.expect new file mode 100644 index 00000000000..229b1bb0cf5 --- /dev/null +++ b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.outline.expect @@ -0,0 +1,95 @@ +library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:21:2: Error: Expected 1 type arguments. +// @A() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:6:9: Context: Found this candidate, but the arguments don't match. +// const A(); +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:22:2: Error: Expected 2 type arguments. +// @B() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:10:9: Context: Found this candidate, but the arguments don't match. +// const B(); +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:23:2: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'C'. +// Try changing type arguments so that they conform to the bounds. +// @C() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:13:9: Context: This is the type variable whose bound isn't conformed to. +// class C { +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:24:2: Error: Type argument 'num' doesn't conform to the bound 'S' of the type variable 'T' on 'D'. +// Try changing type arguments so that they conform to the bounds. +// @D() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:17:24: Context: This is the type variable whose bound isn't conformed to. +// class D { +// ^ +// +import self as self; +import "dart:core" as core; + +class A extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::A + : super core::Object::•() + ; +} +class B extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::B + : super core::Object::•() + ; +} +class C extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::C + : super core::Object::•() + ; +} +class D extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::D + : super core::Object::•() + ; +} +@invalid-expression "pkg/front_end/testcases/generic_metadata/generic_metadata.dart:21:2: Error: Expected 1 type arguments. +@A() // error + ^" +@invalid-expression "pkg/front_end/testcases/generic_metadata/generic_metadata.dart:22:2: Error: Expected 2 type arguments. +@B() // error + ^" +@self::C::•() +@self::D::•() +static method test() → dynamic + ; +@self::A::•() +@self::A::•() +@self::B::•() +@self::B::•() +@self::C::•() +@self::C::•() +@self::C::•() +@self::D::•() +@self::D::•() +@self::D::•() +static method main() → dynamic + ; + + +Extra constant evaluation status: +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///generic_metadata.dart:23:2 -> InstanceConstant(const C{}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///generic_metadata.dart:24:2 -> InstanceConstant(const D{}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///generic_metadata.dart:27:2 -> InstanceConstant(const A{}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///generic_metadata.dart:28:2 -> InstanceConstant(const A{}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///generic_metadata.dart:29:2 -> InstanceConstant(const B{}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///generic_metadata.dart:30:2 -> InstanceConstant(const B{}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///generic_metadata.dart:31:2 -> InstanceConstant(const C{}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///generic_metadata.dart:32:2 -> InstanceConstant(const C{}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///generic_metadata.dart:33:2 -> InstanceConstant(const C{}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///generic_metadata.dart:34:2 -> InstanceConstant(const D{}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///generic_metadata.dart:35:2 -> InstanceConstant(const D{}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///generic_metadata.dart:36:2 -> InstanceConstant(const D{}) +Extra constant evaluation: evaluated: 12, effectively constant: 12 diff --git a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.transformed.expect new file mode 100644 index 00000000000..338bb8d7580 --- /dev/null +++ b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.transformed.expect @@ -0,0 +1,99 @@ +library /*isNonNullableByDefault*/; +// +// Problems in library: +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:21:2: Error: Expected 1 type arguments. +// @A() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:6:9: Context: Found this candidate, but the arguments don't match. +// const A(); +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:22:2: Error: Expected 2 type arguments. +// @B() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:10:9: Context: Found this candidate, but the arguments don't match. +// const B(); +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:23:2: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'C'. +// Try changing type arguments so that they conform to the bounds. +// @C() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:13:9: Context: This is the type variable whose bound isn't conformed to. +// class C { +// ^ +// +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:24:2: Error: Type argument 'num' doesn't conform to the bound 'S' of the type variable 'T' on 'D'. +// Try changing type arguments so that they conform to the bounds. +// @D() // error +// ^ +// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:17:24: Context: This is the type variable whose bound isn't conformed to. +// class D { +// ^ +// +import self as self; +import "dart:core" as core; + +class A extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::A + : super core::Object::•() + ; +} +class B extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::B + : super core::Object::•() + ; +} +class C extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::C + : super core::Object::•() + ; +} +class D extends core::Object /*hasConstConstructor*/ { + const constructor •() → self::D + : super core::Object::•() + ; +} +@invalid-expression "pkg/front_end/testcases/generic_metadata/generic_metadata.dart:21:2: Error: Expected 1 type arguments. +@A() // error + ^" +@invalid-expression "pkg/front_end/testcases/generic_metadata/generic_metadata.dart:22:2: Error: Expected 2 type arguments. +@B() // error + ^" +@#C1 +@#C2 +static method test() → dynamic {} +@#C3 +@#C4 +@#C5 +@#C6 +@#C7 +@#C7 +@#C8 +@#C9 +@#C9 +@#C10 +static method main() → dynamic {} + +constants { + #C1 = self::C {} + #C2 = self::D {} + #C3 = self::A {} + #C4 = self::A {} + #C5 = self::B {} + #C6 = self::B {} + #C7 = self::C {} + #C8 = self::C {} + #C9 = self::D {} + #C10 = self::D {} +} + + +Constructor coverage from constants: +org-dartlang-testcase:///generic_metadata.dart: +- C. (from org-dartlang-testcase:///generic_metadata.dart:14:9) +- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9) +- D. (from org-dartlang-testcase:///generic_metadata.dart:18:9) +- A. (from org-dartlang-testcase:///generic_metadata.dart:6:9) +- B. (from org-dartlang-testcase:///generic_metadata.dart:10:9) diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status index 86bf5819fd8..a9e5f3e1d87 100644 --- a/pkg/front_end/testcases/textual_outline.status +++ b/pkg/front_end/testcases/textual_outline.status @@ -62,6 +62,7 @@ general/null_safety_invalid_experiment: FormatterCrash general/null_safety_invalid_experiment_and_language_version: FormatterCrash general/type_parameters_on_void: FormatterCrash general/var_as_type_name: FormatterCrash +generic_metadata/generic_metadata: FormatterCrash inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: FormatterCrash inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: FormatterCrash late_lowering/covariant_late_field: FormatterCrash