[cfe] Handle nullable function types in explicit instantiation

Part of https://github.com/dart-lang/sdk/issues/46232

Change-Id: I390dc15a253cf0b335ed41bf945bbab2a3b2bdcc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/215545
Reviewed-by: Chloe Stefantsova <dmitryas@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Johnni Winther 2021-10-05 13:01:41 +00:00 committed by commit-bot@chromium.org
parent cf1591f935
commit 74fd108a69
11 changed files with 689 additions and 10 deletions

View file

@ -2100,6 +2100,37 @@ Message _withArgumentsInstantiationNonGenericFunctionType(
arguments: {'type': _type});
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
templateInstantiationNullableGenericFunctionType = const Template<
Message Function(DartType _type, bool isNonNullableByDefault)>(
problemMessageTemplate:
r"""The static type of the explicit instantiation operand must be a non-null generic function type but is '#type'.""",
correctionMessageTemplate:
r"""Try changing the operand or remove the type arguments.""",
withArguments: _withArgumentsInstantiationNullableGenericFunctionType);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Message Function(DartType _type, bool isNonNullableByDefault)>
codeInstantiationNullableGenericFunctionType =
const Code<Message Function(DartType _type, bool isNonNullableByDefault)>(
"InstantiationNullableGenericFunctionType",
analyzerCodes: <String>["DISALLOWED_TYPE_INSTANTIATION_EXPRESSION"]);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
Message _withArgumentsInstantiationNullableGenericFunctionType(
DartType _type, bool isNonNullableByDefault) {
TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
List<Object> typeParts = labeler.labelType(_type);
String type = typeParts.join();
return new Message(codeInstantiationNullableGenericFunctionType,
problemMessage:
"""The static type of the explicit instantiation operand must be a non-null generic function type but is '${type}'.""" +
labeler.originMessages,
correctionMessage: """Try changing the operand or remove the type arguments.""",
arguments: {'type': _type});
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(

View file

@ -412,12 +412,24 @@ class InferenceVisitor
DartType resultType = const InvalidType();
if (operandType is FunctionType) {
if (operandType.typeParameters.length == node.typeArguments.length) {
inferrer.checkBoundsInInstantiation(
operandType, node.typeArguments, node.fileOffset,
inferred: false);
resultType = Substitution.fromPairs(
operandType.typeParameters, node.typeArguments)
.substituteType(operandType.withoutTypeParameters);
if (!inferrer.isTopLevel) {
inferrer.checkBoundsInInstantiation(
operandType, node.typeArguments, node.fileOffset,
inferred: false);
}
if (operandType.isPotentiallyNullable) {
if (!inferrer.isTopLevel) {
result = inferrer.helper!.buildProblem(
templateInstantiationNullableGenericFunctionType.withArguments(
operandType, inferrer.isNonNullableByDefault),
node.fileOffset,
noLength);
}
} else {
resultType = Substitution.fromPairs(
operandType.typeParameters, node.typeArguments)
.substituteType(operandType.withoutTypeParameters);
}
} else {
if (!inferrer.isTopLevel) {
if (operandType.typeParameters.isEmpty) {

View file

@ -5355,6 +5355,14 @@ InstantiationNonGenericFunctionType:
f() {}
main() => f<int>;
InstantiationNullableGenericFunctionType:
problemMessage: "The static type of the explicit instantiation operand must be a non-null generic function type but is '#type'."
correctionMessage: "Try changing the operand or remove the type arguments."
analyzerCode: DISALLOWED_TYPE_INSTANTIATION_EXPRESSION
experiments: constructor-tearoffs
script: |
test(void Function<T>()? f) => f<int>;
InstantiationTooFewArguments:
problemMessage: "Too few type arguments: #count required, #count2 given."
correctionMessage: "Try adding the missing type arguments."

View file

@ -42,6 +42,34 @@ test<T extends Class?, S extends int>(
f3<int>; // error
}
Class c1 = Class();
Class? c2;
GetterCall c3 = GetterCall();
int i1 = 0;
int? i2 = null;
void Function<T>()? f1 = null;
Never n = throw '';
dynamic d = null;
String a = '';
double b = 0.5;
bool c = true;
FutureOr<Class> f2 = Class();
Function f3 = () {};
var topLevel1 = c1<int>; // ok
var topLevel2 = i1<int>; // ok
var topLevel3 = c2<int>; // error
var topLevel4 = c3<int>; // error
var topLevel5 = i2<int>; // error
var topLevel6 = f1<int>; // error
var topLevel7 = n<int>; // error
var topLevel8 = d<int>; // error
var topLevel9 = a<int>; // error
var topLevel10 = b<int>; // error
var topLevel11 = c<int>; // error
var topLevel12 = f2<int>; // error
var topLevel13 = f3<int>; // error
class Class {
call<T>() {}
}

View file

@ -34,6 +34,11 @@ library /*isNonNullableByDefault*/;
// s<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:35:5: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
// Try changing the operand or remove the type arguments.
// f1<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
// Try changing the operand or remove the type arguments.
// n<int>; // error
@ -71,6 +76,65 @@ library /*isNonNullableByDefault*/;
// f3<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:61:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
// Try changing the operand or remove the type arguments.
// var topLevel3 = c2<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:62:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
// - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
// Try changing the operand or remove the type arguments.
// var topLevel4 = c3<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:63:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
// Try changing the operand or remove the type arguments.
// var topLevel5 = i2<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:64:19: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
// Try changing the operand or remove the type arguments.
// var topLevel6 = f1<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:65:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
// Try changing the operand or remove the type arguments.
// var topLevel7 = n<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:66:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
// Try changing the operand or remove the type arguments.
// var topLevel8 = d<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:67:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
// Try changing the operand or remove the type arguments.
// var topLevel9 = a<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:68:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
// Try changing the operand or remove the type arguments.
// var topLevel10 = b<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:69:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
// Try changing the operand or remove the type arguments.
// var topLevel11 = c<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:70:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
// Try changing the operand or remove the type arguments.
// var topLevel12 = f2<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:71:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
// - 'Function' is from 'dart:core'.
// Try changing the operand or remove the type arguments.
// var topLevel13 = f3<int>; // error
// ^
//
import self as self;
import "dart:core" as core;
@ -107,6 +171,69 @@ extension Ambiguous2 on core::String {
method call = self::Ambiguous2|call;
tearoff call = self::Ambiguous2|get#call;
}
static field self::Class c1 = new self::Class::•();
static field self::Class? c2;
static field self::GetterCall c3 = new self::GetterCall::•();
static field core::int i1 = 0;
static field core::int? i2 = null;
static field <T extends core::Object? = dynamic>() →? void f1 = null;
static field Never n = throw "";
static field dynamic d = null;
static field core::String a = "";
static field core::double b = 0.5;
static field core::bool c = true;
static field FutureOr<self::Class>f2 = new self::Class::•();
static field core::Function f3 = () → Null {};
static field () → dynamic topLevel1 = self::c1.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
static field () → dynamic topLevel2 = self::Extension|get#call(self::i1)<core::int>;
static field invalid-type topLevel3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:61:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
- 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
Try changing the operand or remove the type arguments.
var topLevel3 = c2<int>; // error
^";
static field invalid-type topLevel4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:62:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
- 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
Try changing the operand or remove the type arguments.
var topLevel4 = c3<int>; // error
^";
static field invalid-type topLevel5 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:63:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
Try changing the operand or remove the type arguments.
var topLevel5 = i2<int>; // error
^";
static field invalid-type topLevel6 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:64:19: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
Try changing the operand or remove the type arguments.
var topLevel6 = f1<int>; // error
^";
static field invalid-type topLevel7 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:65:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
Try changing the operand or remove the type arguments.
var topLevel7 = n<int>; // error
^";
static field invalid-type topLevel8 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:66:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
Try changing the operand or remove the type arguments.
var topLevel8 = d<int>; // error
^";
static field invalid-type topLevel9 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:67:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
Try changing the operand or remove the type arguments.
var topLevel9 = a<int>; // error
^";
static field invalid-type topLevel10 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:68:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
Try changing the operand or remove the type arguments.
var topLevel10 = b<int>; // error
^";
static field invalid-type topLevel11 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:69:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
Try changing the operand or remove the type arguments.
var topLevel11 = c<int>; // error
^";
static field invalid-type topLevel12 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:70:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
- 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
Try changing the operand or remove the type arguments.
var topLevel12 = f2<int>; // error
^";
static field invalid-type topLevel13 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:71:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
- 'Function' is from 'dart:core'.
Try changing the operand or remove the type arguments.
var topLevel13 = f3<int>; // error
^";
static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic {
c.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
self::Extension|get#call(i)<core::int>;
@ -140,7 +267,10 @@ Try changing the operand or remove the type arguments.
Try changing the operand or remove the type arguments.
s<int>; // error
^";
f1<core::int>;
invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:35:5: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
Try changing the operand or remove the type arguments.
f1<int>; // error
^";
invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
Try changing the operand or remove the type arguments.
n<int>; // error

View file

@ -34,6 +34,11 @@ library /*isNonNullableByDefault*/;
// s<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:35:5: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
// Try changing the operand or remove the type arguments.
// f1<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
// Try changing the operand or remove the type arguments.
// n<int>; // error
@ -71,6 +76,65 @@ library /*isNonNullableByDefault*/;
// f3<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:61:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
// Try changing the operand or remove the type arguments.
// var topLevel3 = c2<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:62:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
// - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
// Try changing the operand or remove the type arguments.
// var topLevel4 = c3<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:63:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
// Try changing the operand or remove the type arguments.
// var topLevel5 = i2<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:64:19: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
// Try changing the operand or remove the type arguments.
// var topLevel6 = f1<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:65:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
// Try changing the operand or remove the type arguments.
// var topLevel7 = n<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:66:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
// Try changing the operand or remove the type arguments.
// var topLevel8 = d<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:67:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
// Try changing the operand or remove the type arguments.
// var topLevel9 = a<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:68:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
// Try changing the operand or remove the type arguments.
// var topLevel10 = b<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:69:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
// Try changing the operand or remove the type arguments.
// var topLevel11 = c<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:70:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
// Try changing the operand or remove the type arguments.
// var topLevel12 = f2<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:71:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
// - 'Function' is from 'dart:core'.
// Try changing the operand or remove the type arguments.
// var topLevel13 = f3<int>; // error
// ^
//
import self as self;
import "dart:core" as core;
@ -107,6 +171,69 @@ extension Ambiguous2 on core::String {
method call = self::Ambiguous2|call;
tearoff call = self::Ambiguous2|get#call;
}
static field self::Class c1 = new self::Class::•();
static field self::Class? c2;
static field self::GetterCall c3 = new self::GetterCall::•();
static field core::int i1 = 0;
static field core::int? i2 = null;
static field <T extends core::Object? = dynamic>() →? void f1 = null;
static field Never n = throw "";
static field dynamic d = null;
static field core::String a = "";
static field core::double b = 0.5;
static field core::bool c = true;
static field FutureOr<self::Class>f2 = new self::Class::•();
static field core::Function f3 = () → Null {};
static field () → dynamic topLevel1 = self::c1.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
static field () → dynamic topLevel2 = self::Extension|get#call(self::i1)<core::int>;
static field invalid-type topLevel3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:61:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
- 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
Try changing the operand or remove the type arguments.
var topLevel3 = c2<int>; // error
^";
static field invalid-type topLevel4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:62:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
- 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
Try changing the operand or remove the type arguments.
var topLevel4 = c3<int>; // error
^";
static field invalid-type topLevel5 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:63:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
Try changing the operand or remove the type arguments.
var topLevel5 = i2<int>; // error
^";
static field invalid-type topLevel6 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:64:19: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
Try changing the operand or remove the type arguments.
var topLevel6 = f1<int>; // error
^";
static field invalid-type topLevel7 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:65:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
Try changing the operand or remove the type arguments.
var topLevel7 = n<int>; // error
^";
static field invalid-type topLevel8 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:66:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
Try changing the operand or remove the type arguments.
var topLevel8 = d<int>; // error
^";
static field invalid-type topLevel9 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:67:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
Try changing the operand or remove the type arguments.
var topLevel9 = a<int>; // error
^";
static field invalid-type topLevel10 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:68:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
Try changing the operand or remove the type arguments.
var topLevel10 = b<int>; // error
^";
static field invalid-type topLevel11 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:69:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
Try changing the operand or remove the type arguments.
var topLevel11 = c<int>; // error
^";
static field invalid-type topLevel12 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:70:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
- 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
Try changing the operand or remove the type arguments.
var topLevel12 = f2<int>; // error
^";
static field invalid-type topLevel13 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:71:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
- 'Function' is from 'dart:core'.
Try changing the operand or remove the type arguments.
var topLevel13 = f3<int>; // error
^";
static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic {
c.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
self::Extension|get#call(i)<core::int>;
@ -140,7 +267,10 @@ Try changing the operand or remove the type arguments.
Try changing the operand or remove the type arguments.
s<int>; // error
^";
f1<core::int>;
invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:35:5: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
Try changing the operand or remove the type arguments.
f1<int>; // error
^";
invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
Try changing the operand or remove the type arguments.
n<int>; // error

View file

@ -16,6 +16,32 @@ test<T extends Class?, S extends int>(
bool c,
FutureOr<Class> f2,
Function f3) {}
Class c1 = Class();
Class? c2;
GetterCall c3 = GetterCall();
int i1 = 0;
int? i2 = null;
void Function<T>()? f1 = null;
Never n = throw '';
dynamic d = null;
String a = '';
double b = 0.5;
bool c = true;
FutureOr<Class> f2 = Class();
Function f3 = () {};
var topLevel1 = c1<int>;
var topLevel2 = i1<int>;
var topLevel3 = c2<int>;
var topLevel4 = c3<int>;
var topLevel5 = i2<int>;
var topLevel6 = f1<int>;
var topLevel7 = n<int>;
var topLevel8 = d<int>;
var topLevel9 = a<int>;
var topLevel10 = b<int>;
var topLevel11 = c<int>;
var topLevel12 = f2<int>;
var topLevel13 = f3<int>;
class Class {
call<T>() {}

View file

@ -1,5 +1,14 @@
import 'dart:async';
Class? c2;
Class c1 = Class();
Function f3 = () {};
FutureOr<Class> f2 = Class();
GetterCall c3 = GetterCall();
Never n = throw '';
String a = '';
bool c = true;
class Class {
call<T>() {}
}
@ -8,6 +17,9 @@ class GetterCall {
void Function<T>() get call => <T>() {};
}
double b = 0.5;
dynamic d = null;
extension Ambiguous1 on String {
call<T>() {}
}
@ -28,6 +40,8 @@ extension ExtensionSetter on bool {
set call(void Function<T>() value) {}
}
int? i2 = null;
int i1 = 0;
main() {}
method<T extends Class, S extends int>(Class c, int i, T t, S s) {}
test<T extends Class?, S extends int>(
@ -45,3 +59,17 @@ test<T extends Class?, S extends int>(
bool c,
FutureOr<Class> f2,
Function f3) {}
var topLevel1 = c1<int>;
var topLevel10 = b<int>;
var topLevel11 = c<int>;
var topLevel12 = f2<int>;
var topLevel13 = f3<int>;
var topLevel2 = i1<int>;
var topLevel3 = c2<int>;
var topLevel4 = c3<int>;
var topLevel5 = i2<int>;
var topLevel6 = f1<int>;
var topLevel7 = n<int>;
var topLevel8 = d<int>;
var topLevel9 = a<int>;
void Function<T>()? f1 = null;

View file

@ -34,6 +34,11 @@ library /*isNonNullableByDefault*/;
// s<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:35:5: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
// Try changing the operand or remove the type arguments.
// f1<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
// Try changing the operand or remove the type arguments.
// n<int>; // error
@ -71,6 +76,65 @@ library /*isNonNullableByDefault*/;
// f3<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:61:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
// Try changing the operand or remove the type arguments.
// var topLevel3 = c2<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:62:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
// - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
// Try changing the operand or remove the type arguments.
// var topLevel4 = c3<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:63:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
// Try changing the operand or remove the type arguments.
// var topLevel5 = i2<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:64:19: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
// Try changing the operand or remove the type arguments.
// var topLevel6 = f1<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:65:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
// Try changing the operand or remove the type arguments.
// var topLevel7 = n<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:66:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
// Try changing the operand or remove the type arguments.
// var topLevel8 = d<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:67:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
// Try changing the operand or remove the type arguments.
// var topLevel9 = a<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:68:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
// Try changing the operand or remove the type arguments.
// var topLevel10 = b<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:69:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
// Try changing the operand or remove the type arguments.
// var topLevel11 = c<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:70:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
// Try changing the operand or remove the type arguments.
// var topLevel12 = f2<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:71:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
// - 'Function' is from 'dart:core'.
// Try changing the operand or remove the type arguments.
// var topLevel13 = f3<int>; // error
// ^
//
import self as self;
import "dart:core" as core;
@ -107,6 +171,69 @@ extension Ambiguous2 on core::String {
method call = self::Ambiguous2|call;
tearoff call = self::Ambiguous2|get#call;
}
static field self::Class c1 = new self::Class::•();
static field self::Class? c2;
static field self::GetterCall c3 = new self::GetterCall::•();
static field core::int i1 = 0;
static field core::int? i2 = null;
static field <T extends core::Object? = dynamic>() →? void f1 = null;
static field Never n = throw "";
static field dynamic d = null;
static field core::String a = "";
static field core::double b = 0.5;
static field core::bool c = true;
static field FutureOr<self::Class>f2 = new self::Class::•();
static field core::Function f3 = () → Null {};
static field () → dynamic topLevel1 = self::c1.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
static field () → dynamic topLevel2 = self::Extension|get#call(self::i1)<core::int>;
static field invalid-type topLevel3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:61:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
- 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
Try changing the operand or remove the type arguments.
var topLevel3 = c2<int>; // error
^";
static field invalid-type topLevel4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:62:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
- 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
Try changing the operand or remove the type arguments.
var topLevel4 = c3<int>; // error
^";
static field invalid-type topLevel5 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:63:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
Try changing the operand or remove the type arguments.
var topLevel5 = i2<int>; // error
^";
static field invalid-type topLevel6 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:64:19: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
Try changing the operand or remove the type arguments.
var topLevel6 = f1<int>; // error
^";
static field invalid-type topLevel7 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:65:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
Try changing the operand or remove the type arguments.
var topLevel7 = n<int>; // error
^";
static field invalid-type topLevel8 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:66:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
Try changing the operand or remove the type arguments.
var topLevel8 = d<int>; // error
^";
static field invalid-type topLevel9 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:67:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
Try changing the operand or remove the type arguments.
var topLevel9 = a<int>; // error
^";
static field invalid-type topLevel10 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:68:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
Try changing the operand or remove the type arguments.
var topLevel10 = b<int>; // error
^";
static field invalid-type topLevel11 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:69:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
Try changing the operand or remove the type arguments.
var topLevel11 = c<int>; // error
^";
static field invalid-type topLevel12 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:70:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
- 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
Try changing the operand or remove the type arguments.
var topLevel12 = f2<int>; // error
^";
static field invalid-type topLevel13 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:71:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
- 'Function' is from 'dart:core'.
Try changing the operand or remove the type arguments.
var topLevel13 = f3<int>; // error
^";
static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic {
c.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
self::Extension|get#call(i)<core::int>;
@ -140,7 +267,10 @@ Try changing the operand or remove the type arguments.
Try changing the operand or remove the type arguments.
s<int>; // error
^";
f1<core::int>;
invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:35:5: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
Try changing the operand or remove the type arguments.
f1<int>; // error
^";
invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
Try changing the operand or remove the type arguments.
n<int>; // error

View file

@ -34,6 +34,32 @@ extension Ambiguous2 on core::String {
method call = self::Ambiguous2|call;
tearoff call = self::Ambiguous2|get#call;
}
static field self::Class c1;
static field self::Class? c2;
static field self::GetterCall c3;
static field core::int i1;
static field core::int? i2;
static field <T extends core::Object? = dynamic>() →? void f1;
static field Never n;
static field dynamic d;
static field core::String a;
static field core::double b;
static field core::bool c;
static field FutureOr<self::Class>f2;
static field core::Function f3;
static field () → dynamic topLevel1;
static field () → dynamic topLevel2;
static field invalid-type topLevel3;
static field invalid-type topLevel4;
static field invalid-type topLevel5;
static field invalid-type topLevel6;
static field invalid-type topLevel7;
static field invalid-type topLevel8;
static field invalid-type topLevel9;
static field invalid-type topLevel10;
static field invalid-type topLevel11;
static field invalid-type topLevel12;
static field invalid-type topLevel13;
static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic
;
static method test<T extends self::Class?, S extends core::int>(self::Class? c1, self::GetterCall c2, core::int? i, self::test::T% t1, self::test::T? t2, self::test::S? s, <T extends core::Object? = dynamic>() →? void f1, Never n, dynamic d, core::String a, core::double b, core::bool c, FutureOr<self::Class>f2, core::Function f3) → dynamic

View file

@ -34,6 +34,11 @@ library /*isNonNullableByDefault*/;
// s<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:35:5: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
// Try changing the operand or remove the type arguments.
// f1<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
// Try changing the operand or remove the type arguments.
// n<int>; // error
@ -71,6 +76,65 @@ library /*isNonNullableByDefault*/;
// f3<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:61:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
// Try changing the operand or remove the type arguments.
// var topLevel3 = c2<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:62:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
// - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
// Try changing the operand or remove the type arguments.
// var topLevel4 = c3<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:63:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
// Try changing the operand or remove the type arguments.
// var topLevel5 = i2<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:64:19: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
// Try changing the operand or remove the type arguments.
// var topLevel6 = f1<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:65:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
// Try changing the operand or remove the type arguments.
// var topLevel7 = n<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:66:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
// Try changing the operand or remove the type arguments.
// var topLevel8 = d<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:67:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
// Try changing the operand or remove the type arguments.
// var topLevel9 = a<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:68:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
// Try changing the operand or remove the type arguments.
// var topLevel10 = b<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:69:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
// Try changing the operand or remove the type arguments.
// var topLevel11 = c<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:70:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
// Try changing the operand or remove the type arguments.
// var topLevel12 = f2<int>; // error
// ^
//
// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:71:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
// - 'Function' is from 'dart:core'.
// Try changing the operand or remove the type arguments.
// var topLevel13 = f3<int>; // error
// ^
//
import self as self;
import "dart:core" as core;
@ -107,6 +171,69 @@ extension Ambiguous2 on core::String {
method call = self::Ambiguous2|call;
tearoff call = self::Ambiguous2|get#call;
}
static field self::Class c1 = new self::Class::•();
static field self::Class? c2;
static field self::GetterCall c3 = new self::GetterCall::•();
static field core::int i1 = 0;
static field core::int? i2 = null;
static field <T extends core::Object? = dynamic>() →? void f1 = null;
static field Never n = throw "";
static field dynamic d = null;
static field core::String a = "";
static field core::double b = 0.5;
static field core::bool c = true;
static field FutureOr<self::Class>f2 = new self::Class::•();
static field core::Function f3 = () → Null {};
static field () → dynamic topLevel1 = self::c1.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
static field () → dynamic topLevel2 = self::Extension|get#call(self::i1)<core::int>;
static field invalid-type topLevel3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:61:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
- 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
Try changing the operand or remove the type arguments.
var topLevel3 = c2<int>; // error
^";
static field invalid-type topLevel4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:62:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
- 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
Try changing the operand or remove the type arguments.
var topLevel4 = c3<int>; // error
^";
static field invalid-type topLevel5 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:63:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
Try changing the operand or remove the type arguments.
var topLevel5 = i2<int>; // error
^";
static field invalid-type topLevel6 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:64:19: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
Try changing the operand or remove the type arguments.
var topLevel6 = f1<int>; // error
^";
static field invalid-type topLevel7 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:65:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
Try changing the operand or remove the type arguments.
var topLevel7 = n<int>; // error
^";
static field invalid-type topLevel8 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:66:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
Try changing the operand or remove the type arguments.
var topLevel8 = d<int>; // error
^";
static field invalid-type topLevel9 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:67:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
Try changing the operand or remove the type arguments.
var topLevel9 = a<int>; // error
^";
static field invalid-type topLevel10 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:68:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
Try changing the operand or remove the type arguments.
var topLevel10 = b<int>; // error
^";
static field invalid-type topLevel11 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:69:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
Try changing the operand or remove the type arguments.
var topLevel11 = c<int>; // error
^";
static field invalid-type topLevel12 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:70:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
- 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
Try changing the operand or remove the type arguments.
var topLevel12 = f2<int>; // error
^";
static field invalid-type topLevel13 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:71:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
- 'Function' is from 'dart:core'.
Try changing the operand or remove the type arguments.
var topLevel13 = f3<int>; // error
^";
static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic {
c.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
self::Extension|get#call(i)<core::int>;
@ -140,7 +267,10 @@ Try changing the operand or remove the type arguments.
Try changing the operand or remove the type arguments.
s<int>; // error
^";
f1<core::int>;
invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:35:5: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
Try changing the operand or remove the type arguments.
f1<int>; // error
^";
invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
Try changing the operand or remove the type arguments.
n<int>; // error