blob: e1f286ac6aff1059ed93b56f102ccdb302df1adc [file] [log] [blame]
// 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.
// This test contains a test case for each condition that can lead to the front
// end's `NullableExpressionCallError`, for which we wish to report "why not
// promoted" context information.
class C1 {
C2? bad;
// ^^^
// [context 3] 'bad' refers to a property so it couldn't be promoted. See http://dart.dev/go/non-promo-property
// [context 7] 'bad' refers to a property so it couldn't be promoted.
}
class C2 {
void call() {}
}
instance_method_invocation(C1 c) {
if (c.bad == null) return;
c.bad();
//^^^^^
// [analyzer 3] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
// ^
// [cfe 7] Can't use an expression of type 'C2?' as a function because it's potentially null.
}
class C3 {
C4? ok;
C5? bad;
// ^^^
// [context 1] 'bad' refers to a property so it couldn't be promoted. See http://dart.dev/go/non-promo-property
// [context 8] 'bad' refers to a property so it couldn't be promoted.
}
class C4 {}
class C5 {}
extension on C4? {
void call() {}
}
extension on C5 {
void call() {}
}
extension_invocation_method(C3 c) {
if (c.ok == null) return;
c.ok();
if (c.bad == null) return;
c.bad();
//^^^^^
// [analyzer 1] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
// ^
// [cfe 8] Can't use an expression of type 'C5?' as a function because it's potentially null.
}
class C6 {
C7? bad;
// ^^^
// [context 6] 'bad' refers to a property so it couldn't be promoted. See http://dart.dev/go/non-promo-property
// [context 9] 'bad' refers to a property so it couldn't be promoted.
}
class C7 {
void Function() get call => () {};
}
instance_getter_invocation(C6 c) {
if (c.bad == null) return;
c.bad();
//^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// [analyzer 6] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
// ^
// [cfe 9] Can't use an expression of type 'C7?' as a function because it's potentially null.
}
class C8 {
C9? ok;
C10? bad;
// ^^^
// [context 4] 'bad' refers to a property so it couldn't be promoted. See http://dart.dev/go/non-promo-property
// [context 10] 'bad' refers to a property so it couldn't be promoted.
}
class C9 {}
class C10 {}
extension on C9? {
void Function() get call => () {};
}
extension on C10 {
void Function() get call => () {};
}
extension_invocation_getter(C8 c) {
if (c.ok == null) return;
// Note: the analyzer produces an extraneous error on the line below due to
// https://github.com/dart-lang/sdk/issues/45551
c.ok();
//^^^^
// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
if (c.bad == null) return;
c.bad();
//^^^^^
// [analyzer 4] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
// ^
// [cfe 10] Can't use an expression of type 'C10?' as a function because it's potentially null.
}
class C11 {
void Function()? bad;
// ^^^
// [context 5] 'bad' refers to a property so it couldn't be promoted. See http://dart.dev/go/non-promo-property
// [context 11] 'bad' refers to a property so it couldn't be promoted.
}
function_invocation(C11 c) {
if (c.bad == null) return;
c.bad();
//^^^^^
// [analyzer 5] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
// ^
// [cfe 11] Can't use an expression of type 'void Function()?' as a function because it's potentially null.
}
class C12 {
C13? bad;
// ^^^
// [context 2] 'bad' refers to a property so it couldn't be promoted. See http://dart.dev/go/non-promo-property
// [context 12] 'bad' refers to a property so it couldn't be promoted.
}
class C13 {
void Function() foo;
C13(this.foo);
}
instance_field_invocation(C12 c) {
if (c.bad == null) return;
// Note: the CFE error message is misleading here. See
// https://github.com/dart-lang/sdk/issues/45552
c.bad.foo();
// ^^^
// [analyzer 2] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
// [cfe 12] Can't use an expression of type 'C13?' as a function because it's potentially null.
}