From 0d16ff6d86ae20d209d3495ea7ca256b5a734ffc Mon Sep 17 00:00:00 2001 From: Johnni Winther Date: Wed, 8 Apr 2020 08:46:02 +0000 Subject: [PATCH] [cfe] Handle static type of access on Never Closes #41273 Change-Id: Ia236481ab47033198d7952086cdf5c9c8f5a34b7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/142366 Commit-Queue: Johnni Winther Reviewed-by: Dmitry Stefantsov --- .../fasta/type_inference/type_inferrer.dart | 32 +++---- .../test/spell_checking_list_code.txt | 1 + ...e41210_lib1.dart.strong.transformed.expect | 63 ++++++++++++++ ...sue41210_lib1.dart.weak.transformed.expect | 63 ++++++++++++++ ...issue41210b.dart.strong.transformed.expect | 62 ++++++++++++++ .../issue41210b.dart.weak.transformed.expect | 62 ++++++++++++++ pkg/front_end/testcases/nnbd/issue41273.dart | 32 +++++++ .../nnbd/issue41273.dart.outline.expect | 7 ++ .../nnbd/issue41273.dart.strong.expect | 31 +++++++ .../issue41273.dart.strong.transformed.expect | 31 +++++++ .../nnbd/issue41273.dart.weak.expect | 31 +++++++ .../issue41273.dart.weak.transformed.expect | 31 +++++++ .../testcases/nnbd/never_receiver.dart | 6 ++ .../nnbd/never_receiver.dart.strong.expect | 85 ++++++++++++------- ...er_receiver.dart.strong.transformed.expect | 85 ++++++++++++------- .../nnbd/never_receiver.dart.weak.expect | 85 ++++++++++++------- ...ever_receiver.dart.weak.transformed.expect | 85 ++++++++++++------- pkg/front_end/testcases/outline.status | 2 - pkg/front_end/testcases/strong.status | 2 - .../testcases/text_serialization.status | 5 +- pkg/front_end/testcases/weak.status | 2 - pkg/kernel/lib/naive_type_checker.dart | 7 ++ 22 files changed, 667 insertions(+), 143 deletions(-) create mode 100644 pkg/front_end/testcases/nnbd/issue41210a/issue41210_lib1.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/nnbd/issue41210a/issue41210_lib1.dart.weak.transformed.expect create mode 100644 pkg/front_end/testcases/nnbd/issue41210b.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/nnbd/issue41210b.dart.weak.transformed.expect create mode 100644 pkg/front_end/testcases/nnbd/issue41273.dart create mode 100644 pkg/front_end/testcases/nnbd/issue41273.dart.outline.expect create mode 100644 pkg/front_end/testcases/nnbd/issue41273.dart.strong.expect create mode 100644 pkg/front_end/testcases/nnbd/issue41273.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/nnbd/issue41273.dart.weak.expect create mode 100644 pkg/front_end/testcases/nnbd/issue41273.dart.weak.transformed.expect diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart index 0f991a85aaa..c8b7fa40cf2 100644 --- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart +++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart @@ -1036,23 +1036,10 @@ class TypeInferrerImpl implements TypeInferrer { if (receiverType is FunctionType && name == callName) { return const ObjectAccessTarget.callFunction(); - } - - Class classNode = receiverType is InterfaceType - ? receiverType.classNode - : coreTypes.objectClass; - Member interfaceMember = - _getInterfaceMember(classNode, name, setter, fileOffset); - ObjectAccessTarget target; - if (interfaceMember != null) { - target = new ObjectAccessTarget.interfaceMember(interfaceMember); - } else if (receiverType is DynamicType) { - target = const ObjectAccessTarget.dynamic(); } else if (receiverType is NeverType) { switch (receiverType.nullability) { case Nullability.nonNullable: - target = const ObjectAccessTarget.never(); - break; + return const ObjectAccessTarget.never(); case Nullability.nullable: case Nullability.legacy: // Never? and Never* are equivalent to Null. @@ -1066,6 +1053,17 @@ class TypeInferrerImpl implements TypeInferrer { fileOffset, library.fileUri); } + } + Class classNode = receiverType is InterfaceType + ? receiverType.classNode + : coreTypes.objectClass; + Member interfaceMember = + _getInterfaceMember(classNode, name, setter, fileOffset); + ObjectAccessTarget target; + if (interfaceMember != null) { + target = new ObjectAccessTarget.interfaceMember(interfaceMember); + } else if (receiverType is DynamicType) { + target = const ObjectAccessTarget.dynamic(); } else if (receiverType is InvalidType) { target = const ObjectAccessTarget.invalid(); } else if (receiverType is InterfaceType && @@ -1940,6 +1938,10 @@ class TypeInferrerImpl implements TypeInferrer { Member equalsMember = findInterfaceMember(variable.type, equalsName, variable.fileOffset) .member; + // Ensure operator == member even for `Never`. + equalsMember ??= findInterfaceMember(const DynamicType(), equalsName, -1, + instrumented: false) + .member; return new NullAwareGuard( variable, variable.fileOffset, equalsMember, this); } @@ -2736,7 +2738,7 @@ class TypeInferrerImpl implements TypeInferrer { isImplicitCall: isImplicitCall); assert(name != equalsName); return createNullAwareExpressionInferenceResult( - result.inferredType, + const NeverType(Nullability.nonNullable), result.applyResult(new MethodInvocation(receiver, name, arguments) ..fileOffset = fileOffset), nullAwareGuards); diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt index 7df75c6ab23..93a442339a0 100644 --- a/pkg/front_end/test/spell_checking_list_code.txt +++ b/pkg/front_end/test/spell_checking_list_code.txt @@ -689,6 +689,7 @@ nulls o oauth obj +obligated observatory observe obstruct diff --git a/pkg/front_end/testcases/nnbd/issue41210a/issue41210_lib1.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41210a/issue41210_lib1.dart.strong.transformed.expect new file mode 100644 index 00000000000..a170b13371a --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41210a/issue41210_lib1.dart.strong.transformed.expect @@ -0,0 +1,63 @@ +library; +import self as self; +import "dart:core" as core; +import "issue41210_lib1.dart" as iss; + +import "org-dartlang-testcase:///issue41210_lib1.dart"; + +abstract class _C&Object&A extends core::Object implements iss::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ { + const synthetic constructor •() → self::_C&Object&A* + : super core::Object::•() + ; + method /* from org-dartlang-testcase:///issue41210_lib1.dart */ method({core::String* s = #C1}) → core::String* + return s; +} +abstract class _C&Object&A&B extends self::_C&Object&A implements iss::B /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ { + const synthetic constructor •() → self::_C&Object&A&B* + : super self::_C&Object&A::•() + ; + abstract forwarding-stub method method({core::String* s = #C1}) → core::String*; +} +class C extends self::_C&Object&A&B { + synthetic constructor •() → self::C* + : super self::_C&Object&A&B::•() + ; + abstract forwarding-stub method method({core::String* s = #C1}) → core::String*; +} +static method main() → dynamic { + core::print(new self::C::•().{self::C::method}()); +} + +library; +import self as iss; +import "dart:core" as core; +import "issue41210_lib2.dart" as iss2; + +import "org-dartlang-testcase:///issue41210_lib2.dart"; + +abstract class A extends core::Object implements iss2::Interface /*isMixinDeclaration*/ { + method method({core::String* s = #C1}) → core::String* + return s; +} +abstract class B extends core::Object implements iss2::Interface { + synthetic constructor •() → iss::B* + : super core::Object::•() + ; + abstract member-signature method method() → core::String*; +} +static method main() → void {} + +library /*isNonNullableByDefault*/; +import self as iss2; +import "dart:core" as core; + +abstract class Interface extends core::Object { + synthetic constructor •() → iss2::Interface + : super core::Object::•() + ; + abstract method method() → core::String; +} + +constants { + #C1 = "hello" +} diff --git a/pkg/front_end/testcases/nnbd/issue41210a/issue41210_lib1.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41210a/issue41210_lib1.dart.weak.transformed.expect new file mode 100644 index 00000000000..a170b13371a --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41210a/issue41210_lib1.dart.weak.transformed.expect @@ -0,0 +1,63 @@ +library; +import self as self; +import "dart:core" as core; +import "issue41210_lib1.dart" as iss; + +import "org-dartlang-testcase:///issue41210_lib1.dart"; + +abstract class _C&Object&A extends core::Object implements iss::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ { + const synthetic constructor •() → self::_C&Object&A* + : super core::Object::•() + ; + method /* from org-dartlang-testcase:///issue41210_lib1.dart */ method({core::String* s = #C1}) → core::String* + return s; +} +abstract class _C&Object&A&B extends self::_C&Object&A implements iss::B /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ { + const synthetic constructor •() → self::_C&Object&A&B* + : super self::_C&Object&A::•() + ; + abstract forwarding-stub method method({core::String* s = #C1}) → core::String*; +} +class C extends self::_C&Object&A&B { + synthetic constructor •() → self::C* + : super self::_C&Object&A&B::•() + ; + abstract forwarding-stub method method({core::String* s = #C1}) → core::String*; +} +static method main() → dynamic { + core::print(new self::C::•().{self::C::method}()); +} + +library; +import self as iss; +import "dart:core" as core; +import "issue41210_lib2.dart" as iss2; + +import "org-dartlang-testcase:///issue41210_lib2.dart"; + +abstract class A extends core::Object implements iss2::Interface /*isMixinDeclaration*/ { + method method({core::String* s = #C1}) → core::String* + return s; +} +abstract class B extends core::Object implements iss2::Interface { + synthetic constructor •() → iss::B* + : super core::Object::•() + ; + abstract member-signature method method() → core::String*; +} +static method main() → void {} + +library /*isNonNullableByDefault*/; +import self as iss2; +import "dart:core" as core; + +abstract class Interface extends core::Object { + synthetic constructor •() → iss2::Interface + : super core::Object::•() + ; + abstract method method() → core::String; +} + +constants { + #C1 = "hello" +} diff --git a/pkg/front_end/testcases/nnbd/issue41210b.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41210b.dart.strong.transformed.expect new file mode 100644 index 00000000000..8f2efe49e6f --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41210b.dart.strong.transformed.expect @@ -0,0 +1,62 @@ +library; +import self as self; +import "dart:core" as core; +import "issue41210b_lib1.dart" as iss; + +import "org-dartlang-testcase:///issue41210b_lib1.dart"; + +abstract class _C&Object&A extends core::Object implements iss::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ { + const synthetic constructor •() → self::_C&Object&A* + : super core::Object::•() + ; + method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ method({core::String* s = #C1}) → core::String* + return s; +} +abstract class _C&Object&A&B extends self::_C&Object&A implements iss::B /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ { + const synthetic constructor •() → self::_C&Object&A&B* + : super self::_C&Object&A::•() + ; + abstract member-signature method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ method() → core::String*; +} +class C extends self::_C&Object&A&B { + synthetic constructor •() → self::C* + : super self::_C&Object&A&B::•() + ; +} +static method main() → dynamic { + core::print(new self::C::•().{iss::A::method}()); +} + +library; +import self as iss; +import "dart:core" as core; +import "issue41210b_lib2.dart" as iss2; + +import "org-dartlang-testcase:///issue41210b_lib2.dart"; + +abstract class A extends core::Object implements iss2::Interface /*isMixinDeclaration*/ { + method method({core::String* s = #C1}) → core::String* + return s; +} +abstract class B extends core::Object implements iss2::Interface { + synthetic constructor •() → iss::B* + : super core::Object::•() + ; + abstract member-signature method method() → core::String*; +} +static method main() → void {} + +library /*isNonNullableByDefault*/; +import self as iss2; +import "dart:core" as core; + +abstract class Interface extends core::Object { + synthetic constructor •() → iss2::Interface + : super core::Object::•() + ; + abstract method method() → core::String; +} + +constants { + #C1 = "hello" +} diff --git a/pkg/front_end/testcases/nnbd/issue41210b.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41210b.dart.weak.transformed.expect new file mode 100644 index 00000000000..8f2efe49e6f --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41210b.dart.weak.transformed.expect @@ -0,0 +1,62 @@ +library; +import self as self; +import "dart:core" as core; +import "issue41210b_lib1.dart" as iss; + +import "org-dartlang-testcase:///issue41210b_lib1.dart"; + +abstract class _C&Object&A extends core::Object implements iss::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ { + const synthetic constructor •() → self::_C&Object&A* + : super core::Object::•() + ; + method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ method({core::String* s = #C1}) → core::String* + return s; +} +abstract class _C&Object&A&B extends self::_C&Object&A implements iss::B /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ { + const synthetic constructor •() → self::_C&Object&A&B* + : super self::_C&Object&A::•() + ; + abstract member-signature method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ method() → core::String*; +} +class C extends self::_C&Object&A&B { + synthetic constructor •() → self::C* + : super self::_C&Object&A&B::•() + ; +} +static method main() → dynamic { + core::print(new self::C::•().{iss::A::method}()); +} + +library; +import self as iss; +import "dart:core" as core; +import "issue41210b_lib2.dart" as iss2; + +import "org-dartlang-testcase:///issue41210b_lib2.dart"; + +abstract class A extends core::Object implements iss2::Interface /*isMixinDeclaration*/ { + method method({core::String* s = #C1}) → core::String* + return s; +} +abstract class B extends core::Object implements iss2::Interface { + synthetic constructor •() → iss::B* + : super core::Object::•() + ; + abstract member-signature method method() → core::String*; +} +static method main() → void {} + +library /*isNonNullableByDefault*/; +import self as iss2; +import "dart:core" as core; + +abstract class Interface extends core::Object { + synthetic constructor •() → iss2::Interface + : super core::Object::•() + ; + abstract method method() → core::String; +} + +constants { + #C1 = "hello" +} diff --git a/pkg/front_end/testcases/nnbd/issue41273.dart b/pkg/front_end/testcases/nnbd/issue41273.dart new file mode 100644 index 00000000000..f4909188e82 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41273.dart @@ -0,0 +1,32 @@ +// Copyright (c) 2020, 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. + +void test(var x) { + if (x is Never) { + Never n1 = x.toString(); + Never n2 = x.runtimeType; + Never n3 = x.someGetter; + Never n4 = x.someMethod(); + Never n5 = x + x; + Never n6 = x[x]; + Never n7 = x(); + Never n8 = x.runtimeType(); + Never n9 = x.toString; + x.runtimeType = Object; + x.toString = () => ''; + var v1 = x.toString(); + var v2 = x.runtimeType; + var v3 = x.someGetter; + var v4 = x.someMethod(); + var v5 = x + x; + var v6 = x[x]; + var v7 = x(); + var v8 = x.runtimeType(); + var v9 = x.toString; + } +} + +main() { + test(null); +} diff --git a/pkg/front_end/testcases/nnbd/issue41273.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41273.dart.outline.expect new file mode 100644 index 00000000000..a79e8194406 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41273.dart.outline.expect @@ -0,0 +1,7 @@ +library /*isNonNullableByDefault*/; +import self as self; + +static method test(dynamic x) → void + ; +static method main() → dynamic + ; diff --git a/pkg/front_end/testcases/nnbd/issue41273.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41273.dart.strong.expect new file mode 100644 index 00000000000..eff260bc634 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41273.dart.strong.expect @@ -0,0 +1,31 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +static method test(dynamic x) → void { + if(x is{ForNonNullableByDefault} Never) { + Never n1 = x{Never}.toString(); + Never n2 = x{Never}.runtimeType; + Never n3 = x{Never}.someGetter; + Never n4 = x{Never}.someMethod(); + Never n5 = x{Never}.+(x{Never}); + Never n6 = x{Never}.[](x{Never}); + Never n7 = x{Never}.call(); + Never n8 = x{Never}.runtimeType(); + Never n9 = x{Never}.toString; + x{Never}.runtimeType = core::Object; + x{Never}.toString = () → core::String => ""; + Never v1 = x{Never}.toString(); + Never v2 = x{Never}.runtimeType; + Never v3 = x{Never}.someGetter; + Never v4 = x{Never}.someMethod(); + Never v5 = x{Never}.+(x{Never}); + Never v6 = x{Never}.[](x{Never}); + Never v7 = x{Never}.call(); + Never v8 = x{Never}.runtimeType(); + Never v9 = x{Never}.toString; + } +} +static method main() → dynamic { + self::test(null); +} diff --git a/pkg/front_end/testcases/nnbd/issue41273.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41273.dart.strong.transformed.expect new file mode 100644 index 00000000000..eff260bc634 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41273.dart.strong.transformed.expect @@ -0,0 +1,31 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +static method test(dynamic x) → void { + if(x is{ForNonNullableByDefault} Never) { + Never n1 = x{Never}.toString(); + Never n2 = x{Never}.runtimeType; + Never n3 = x{Never}.someGetter; + Never n4 = x{Never}.someMethod(); + Never n5 = x{Never}.+(x{Never}); + Never n6 = x{Never}.[](x{Never}); + Never n7 = x{Never}.call(); + Never n8 = x{Never}.runtimeType(); + Never n9 = x{Never}.toString; + x{Never}.runtimeType = core::Object; + x{Never}.toString = () → core::String => ""; + Never v1 = x{Never}.toString(); + Never v2 = x{Never}.runtimeType; + Never v3 = x{Never}.someGetter; + Never v4 = x{Never}.someMethod(); + Never v5 = x{Never}.+(x{Never}); + Never v6 = x{Never}.[](x{Never}); + Never v7 = x{Never}.call(); + Never v8 = x{Never}.runtimeType(); + Never v9 = x{Never}.toString; + } +} +static method main() → dynamic { + self::test(null); +} diff --git a/pkg/front_end/testcases/nnbd/issue41273.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41273.dart.weak.expect new file mode 100644 index 00000000000..eff260bc634 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41273.dart.weak.expect @@ -0,0 +1,31 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +static method test(dynamic x) → void { + if(x is{ForNonNullableByDefault} Never) { + Never n1 = x{Never}.toString(); + Never n2 = x{Never}.runtimeType; + Never n3 = x{Never}.someGetter; + Never n4 = x{Never}.someMethod(); + Never n5 = x{Never}.+(x{Never}); + Never n6 = x{Never}.[](x{Never}); + Never n7 = x{Never}.call(); + Never n8 = x{Never}.runtimeType(); + Never n9 = x{Never}.toString; + x{Never}.runtimeType = core::Object; + x{Never}.toString = () → core::String => ""; + Never v1 = x{Never}.toString(); + Never v2 = x{Never}.runtimeType; + Never v3 = x{Never}.someGetter; + Never v4 = x{Never}.someMethod(); + Never v5 = x{Never}.+(x{Never}); + Never v6 = x{Never}.[](x{Never}); + Never v7 = x{Never}.call(); + Never v8 = x{Never}.runtimeType(); + Never v9 = x{Never}.toString; + } +} +static method main() → dynamic { + self::test(null); +} diff --git a/pkg/front_end/testcases/nnbd/issue41273.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41273.dart.weak.transformed.expect new file mode 100644 index 00000000000..eff260bc634 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue41273.dart.weak.transformed.expect @@ -0,0 +1,31 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +static method test(dynamic x) → void { + if(x is{ForNonNullableByDefault} Never) { + Never n1 = x{Never}.toString(); + Never n2 = x{Never}.runtimeType; + Never n3 = x{Never}.someGetter; + Never n4 = x{Never}.someMethod(); + Never n5 = x{Never}.+(x{Never}); + Never n6 = x{Never}.[](x{Never}); + Never n7 = x{Never}.call(); + Never n8 = x{Never}.runtimeType(); + Never n9 = x{Never}.toString; + x{Never}.runtimeType = core::Object; + x{Never}.toString = () → core::String => ""; + Never v1 = x{Never}.toString(); + Never v2 = x{Never}.runtimeType; + Never v3 = x{Never}.someGetter; + Never v4 = x{Never}.someMethod(); + Never v5 = x{Never}.+(x{Never}); + Never v6 = x{Never}.[](x{Never}); + Never v7 = x{Never}.call(); + Never v8 = x{Never}.runtimeType(); + Never v9 = x{Never}.toString; + } +} +static method main() → dynamic { + self::test(null); +} diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart b/pkg/front_end/testcases/nnbd/never_receiver.dart index 61af20abbd8..caf301bff14 100644 --- a/pkg/front_end/testcases/nnbd/never_receiver.dart +++ b/pkg/front_end/testcases/nnbd/never_receiver.dart @@ -21,6 +21,12 @@ foo(Never x, Never? y) { y?.[42]; // Not an error. y?.[42] = 42; // Not an error. + x?.foo(); // Warning. + x?.bar; // Warning. + x?.baz = 42; // Warning. + x?.[42]; // Warning. + x?.[42] = 42; // Warning. + y.foo(); // Error. y.bar; // Error. y.baz = 42; // Error. diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect index 06d0203d3b5..5ef81756d3f 100644 --- a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect +++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect @@ -2,69 +2,89 @@ library /*isNonNullableByDefault*/; // // Problems in library: // -// pkg/front_end/testcases/nnbd/never_receiver.dart:24:5: Error: The method 'foo' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:24:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.foo(); // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:25:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.bar; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:26:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.baz = 42; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:27:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.[42]; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:28:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.[42] = 42; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing method, or defining a method named 'foo'. // y.foo(); // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'. // y.bar; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. // Try accessing using ?. instead. // y.bar; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'. // y.baz = 42; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. // Try accessing using ?. instead. // y.baz = 42; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing method, or defining a method named 'call'. // y(); // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '+' operator. // y++; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. // y++; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '+' operator. // y += 1; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. // y += 1; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '[]' operator. // y[42]; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. // y[42]; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '[]=' operator. // y[42] = 42; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. // y[42] = 42; // Error. // ^ // @@ -82,55 +102,60 @@ static method foo(Never x, Never? y) → dynamic { x.[]=(42, 42); x = x.+(1); x = x.+(1); - let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{dynamic} null : #t1{Never}.foo(); + let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{core::Null?} null : #t1{Never}.foo(); let final Never? #t2 = y in #t2.{core::Object::==}(null) ?{core::Null?} null : #t2{Never}.bar; let final Never? #t3 = y in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{Never}.baz = 42; - let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{dynamic} null : #t4{Never}.call(); + let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{core::Null?} null : #t4{Never}.call(); let final Never? #t5 = y in #t5.{core::Object::==}(null) ?{core::Null?} null : #t5{Never}.[](42); let final Never? #t6 = y in #t6.{core::Object::==}(null) ?{core::int?} null : #t6{Never}.[]=(42, 42); - invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:24:5: Error: The method 'foo' isn't defined for the class 'Never'. + let final Never #t7 = x in #t7.{core::Object::==}(null) ?{core::Null?} null : #t7.foo(); + let final Never #t8 = x in #t8.{core::Object::==}(null) ?{core::Null?} null : #t8.bar; + let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42; + let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42); + let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42); + invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'. Try correcting the name to the name of an existing method, or defining a method named 'foo'. y.foo(); // Error. ^^^"; - let final #t7 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. + let final #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. Try accessing using ?. instead. y.bar; // Error. - ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'. + ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'. Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'. y.bar; // Error. ^^^"; - let final #t8 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. + let final #t13 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. Try accessing using ?. instead. y.baz = 42; // Error. - ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'. + ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'. Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'. y.baz = 42; // Error. ^^^"; - invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'. + invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'. Try correcting the name to the name of an existing method, or defining a method named 'call'. y(); // Error. ^"; - y = (let final #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. + y = (let final #t14 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. y++; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '+' operator. y++; // Error. ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?; - y = (let final #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. + y = (let final #t15 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. y += 1; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '+' operator. y += 1; // Error. ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?; - let final #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. + let final #t16 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. y[42]; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '[]' operator. y[42]; // Error. ^"; - let final #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. + let final #t17 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. y[42] = 42; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '[]=' operator. y[42] = 42; // Error. ^"; diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect index 06d0203d3b5..5ef81756d3f 100644 --- a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect @@ -2,69 +2,89 @@ library /*isNonNullableByDefault*/; // // Problems in library: // -// pkg/front_end/testcases/nnbd/never_receiver.dart:24:5: Error: The method 'foo' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:24:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.foo(); // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:25:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.bar; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:26:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.baz = 42; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:27:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.[42]; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:28:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.[42] = 42; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing method, or defining a method named 'foo'. // y.foo(); // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'. // y.bar; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. // Try accessing using ?. instead. // y.bar; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'. // y.baz = 42; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. // Try accessing using ?. instead. // y.baz = 42; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing method, or defining a method named 'call'. // y(); // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '+' operator. // y++; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. // y++; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '+' operator. // y += 1; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. // y += 1; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '[]' operator. // y[42]; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. // y[42]; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '[]=' operator. // y[42] = 42; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. // y[42] = 42; // Error. // ^ // @@ -82,55 +102,60 @@ static method foo(Never x, Never? y) → dynamic { x.[]=(42, 42); x = x.+(1); x = x.+(1); - let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{dynamic} null : #t1{Never}.foo(); + let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{core::Null?} null : #t1{Never}.foo(); let final Never? #t2 = y in #t2.{core::Object::==}(null) ?{core::Null?} null : #t2{Never}.bar; let final Never? #t3 = y in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{Never}.baz = 42; - let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{dynamic} null : #t4{Never}.call(); + let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{core::Null?} null : #t4{Never}.call(); let final Never? #t5 = y in #t5.{core::Object::==}(null) ?{core::Null?} null : #t5{Never}.[](42); let final Never? #t6 = y in #t6.{core::Object::==}(null) ?{core::int?} null : #t6{Never}.[]=(42, 42); - invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:24:5: Error: The method 'foo' isn't defined for the class 'Never'. + let final Never #t7 = x in #t7.{core::Object::==}(null) ?{core::Null?} null : #t7.foo(); + let final Never #t8 = x in #t8.{core::Object::==}(null) ?{core::Null?} null : #t8.bar; + let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42; + let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42); + let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42); + invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'. Try correcting the name to the name of an existing method, or defining a method named 'foo'. y.foo(); // Error. ^^^"; - let final #t7 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. + let final #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. Try accessing using ?. instead. y.bar; // Error. - ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'. + ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'. Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'. y.bar; // Error. ^^^"; - let final #t8 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. + let final #t13 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. Try accessing using ?. instead. y.baz = 42; // Error. - ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'. + ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'. Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'. y.baz = 42; // Error. ^^^"; - invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'. + invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'. Try correcting the name to the name of an existing method, or defining a method named 'call'. y(); // Error. ^"; - y = (let final #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. + y = (let final #t14 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. y++; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '+' operator. y++; // Error. ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?; - y = (let final #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. + y = (let final #t15 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. y += 1; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '+' operator. y += 1; // Error. ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?; - let final #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. + let final #t16 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. y[42]; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '[]' operator. y[42]; // Error. ^"; - let final #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. + let final #t17 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. y[42] = 42; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '[]=' operator. y[42] = 42; // Error. ^"; diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect index 06d0203d3b5..5ef81756d3f 100644 --- a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect +++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect @@ -2,69 +2,89 @@ library /*isNonNullableByDefault*/; // // Problems in library: // -// pkg/front_end/testcases/nnbd/never_receiver.dart:24:5: Error: The method 'foo' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:24:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.foo(); // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:25:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.bar; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:26:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.baz = 42; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:27:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.[42]; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:28:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.[42] = 42; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing method, or defining a method named 'foo'. // y.foo(); // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'. // y.bar; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. // Try accessing using ?. instead. // y.bar; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'. // y.baz = 42; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. // Try accessing using ?. instead. // y.baz = 42; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing method, or defining a method named 'call'. // y(); // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '+' operator. // y++; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. // y++; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '+' operator. // y += 1; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. // y += 1; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '[]' operator. // y[42]; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. // y[42]; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '[]=' operator. // y[42] = 42; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. // y[42] = 42; // Error. // ^ // @@ -82,55 +102,60 @@ static method foo(Never x, Never? y) → dynamic { x.[]=(42, 42); x = x.+(1); x = x.+(1); - let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{dynamic} null : #t1{Never}.foo(); + let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{core::Null?} null : #t1{Never}.foo(); let final Never? #t2 = y in #t2.{core::Object::==}(null) ?{core::Null?} null : #t2{Never}.bar; let final Never? #t3 = y in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{Never}.baz = 42; - let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{dynamic} null : #t4{Never}.call(); + let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{core::Null?} null : #t4{Never}.call(); let final Never? #t5 = y in #t5.{core::Object::==}(null) ?{core::Null?} null : #t5{Never}.[](42); let final Never? #t6 = y in #t6.{core::Object::==}(null) ?{core::int?} null : #t6{Never}.[]=(42, 42); - invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:24:5: Error: The method 'foo' isn't defined for the class 'Never'. + let final Never #t7 = x in #t7.{core::Object::==}(null) ?{core::Null?} null : #t7.foo(); + let final Never #t8 = x in #t8.{core::Object::==}(null) ?{core::Null?} null : #t8.bar; + let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42; + let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42); + let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42); + invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'. Try correcting the name to the name of an existing method, or defining a method named 'foo'. y.foo(); // Error. ^^^"; - let final #t7 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. + let final #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. Try accessing using ?. instead. y.bar; // Error. - ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'. + ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'. Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'. y.bar; // Error. ^^^"; - let final #t8 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. + let final #t13 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. Try accessing using ?. instead. y.baz = 42; // Error. - ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'. + ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'. Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'. y.baz = 42; // Error. ^^^"; - invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'. + invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'. Try correcting the name to the name of an existing method, or defining a method named 'call'. y(); // Error. ^"; - y = (let final #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. + y = (let final #t14 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. y++; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '+' operator. y++; // Error. ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?; - y = (let final #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. + y = (let final #t15 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. y += 1; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '+' operator. y += 1; // Error. ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?; - let final #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. + let final #t16 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. y[42]; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '[]' operator. y[42]; // Error. ^"; - let final #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. + let final #t17 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. y[42] = 42; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '[]=' operator. y[42] = 42; // Error. ^"; diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect index 06d0203d3b5..5ef81756d3f 100644 --- a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect @@ -2,69 +2,89 @@ library /*isNonNullableByDefault*/; // // Problems in library: // -// pkg/front_end/testcases/nnbd/never_receiver.dart:24:5: Error: The method 'foo' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:24:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.foo(); // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:25:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.bar; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:26:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.baz = 42; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:27:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.[42]; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:28:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null. +// x?.[42] = 42; // Warning. +// ^ +// +// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing method, or defining a method named 'foo'. // y.foo(); // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'. // y.bar; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. // Try accessing using ?. instead. // y.bar; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'. // y.baz = 42; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. // Try accessing using ?. instead. // y.baz = 42; // Error. // ^^^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'. // Try correcting the name to the name of an existing method, or defining a method named 'call'. // y(); // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '+' operator. // y++; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. // y++; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '+' operator. // y += 1; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. // y += 1; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '[]' operator. // y[42]; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. // y[42]; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'. +// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'. // Try correcting the operator to an existing operator, or defining a '[]=' operator. // y[42] = 42; // Error. // ^ // -// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. +// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. // y[42] = 42; // Error. // ^ // @@ -82,55 +102,60 @@ static method foo(Never x, Never? y) → dynamic { x.[]=(42, 42); x = x.+(1); x = x.+(1); - let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{dynamic} null : #t1{Never}.foo(); + let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{core::Null?} null : #t1{Never}.foo(); let final Never? #t2 = y in #t2.{core::Object::==}(null) ?{core::Null?} null : #t2{Never}.bar; let final Never? #t3 = y in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{Never}.baz = 42; - let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{dynamic} null : #t4{Never}.call(); + let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{core::Null?} null : #t4{Never}.call(); let final Never? #t5 = y in #t5.{core::Object::==}(null) ?{core::Null?} null : #t5{Never}.[](42); let final Never? #t6 = y in #t6.{core::Object::==}(null) ?{core::int?} null : #t6{Never}.[]=(42, 42); - invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:24:5: Error: The method 'foo' isn't defined for the class 'Never'. + let final Never #t7 = x in #t7.{core::Object::==}(null) ?{core::Null?} null : #t7.foo(); + let final Never #t8 = x in #t8.{core::Object::==}(null) ?{core::Null?} null : #t8.bar; + let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42; + let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42); + let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42); + invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'. Try correcting the name to the name of an existing method, or defining a method named 'foo'. y.foo(); // Error. ^^^"; - let final #t7 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. + let final #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null. Try accessing using ?. instead. y.bar; // Error. - ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'. + ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'. Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'. y.bar; // Error. ^^^"; - let final #t8 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. + let final #t13 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null. Try accessing using ?. instead. y.baz = 42; // Error. - ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'. + ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'. Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'. y.baz = 42; // Error. ^^^"; - invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'. + invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'. Try correcting the name to the name of an existing method, or defining a method named 'call'. y(); // Error. ^"; - y = (let final #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. + y = (let final #t14 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null. y++; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '+' operator. y++; // Error. ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?; - y = (let final #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. + y = (let final #t15 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null. y += 1; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '+' operator. y += 1; // Error. ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?; - let final #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. + let final #t16 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null. y[42]; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '[]' operator. y[42]; // Error. ^"; - let final #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. + let final #t17 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null. y[42] = 42; // Error. - ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'. + ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'. Try correcting the operator to an existing operator, or defining a '[]=' operator. y[42] = 42; // Error. ^"; diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status index 41fb46b7285..ca35b47ab32 100644 --- a/pkg/front_end/testcases/outline.status +++ b/pkg/front_end/testcases/outline.status @@ -40,8 +40,6 @@ inference/mixin_inference_outwards_4: TypeCheckError inference/mixin_inference_unification_1: TypeCheckError inference/mixin_inference_unification_2: TypeCheckError nnbd/inheritance_from_opt_in: TypeCheckError -nnbd/issue41210a/issue41210: TypeCheckError -nnbd/issue41210b: TypeCheckError nnbd/messages_with_types_opt_in: TypeCheckError nnbd/messages_with_types_opt_out: TypeCheckError nnbd/never_opt_out: TypeCheckError diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status index a76a796a993..d6a567eaaf2 100644 --- a/pkg/front_end/testcases/strong.status +++ b/pkg/front_end/testcases/strong.status @@ -167,8 +167,6 @@ instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError # instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError # Expected nnbd/inheritance_from_opt_in: TypeCheckError nnbd/issue41180: RuntimeError # Strong mode runtime checking fails due to mixed strong mode. -nnbd/issue41210a/issue41210: TypeCheckError -nnbd/issue41210b: TypeCheckError nnbd/messages_with_types_opt_in: TypeCheckError nnbd/messages_with_types_opt_out: TypeCheckError nnbd/never_opt_out: TypeCheckError diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status index d40a90d9810..08f37b74d5f 100644 --- a/pkg/front_end/testcases/text_serialization.status +++ b/pkg/front_end/testcases/text_serialization.status @@ -1331,8 +1331,9 @@ nnbd/issue41102: TextSerializationFailure nnbd/issue41103: TextSerializationFailure nnbd/issue41156: TextSerializationFailure nnbd/issue41180: TextSerializationFailure -nnbd/issue41210a/issue41210: TypeCheckError -nnbd/issue41210b: TypeCheckError +nnbd/issue41210a/issue41210: TextSerializationFailure +nnbd/issue41210b: TextSerializationFailure +nnbd/issue41273: TextSerializationFailure nnbd/late: TextSerializationFailure nnbd/later: TextSerializationFailure nnbd/lhs_of_if_null: TextSerializationFailure diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status index 02301757340..5b3a8c99a97 100644 --- a/pkg/front_end/testcases/weak.status +++ b/pkg/front_end/testcases/weak.status @@ -59,8 +59,6 @@ general_nnbd_opt_out/type_variable_bound_access: TypeCheckError general_nnbd_opt_out/unsound_promotion: TypeCheckError general_nnbd_opt_out/void_methods: RuntimeError nnbd/inheritance_from_opt_in: TypeCheckError -nnbd/issue41210a/issue41210: TypeCheckError -nnbd/issue41210b: TypeCheckError nnbd/messages_with_types_opt_in: TypeCheckError nnbd/messages_with_types_opt_out: TypeCheckError nnbd/never_opt_out: TypeCheckError diff --git a/pkg/kernel/lib/naive_type_checker.dart b/pkg/kernel/lib/naive_type_checker.dart index e18a11255e0..ef93768e2db 100644 --- a/pkg/kernel/lib/naive_type_checker.dart +++ b/pkg/kernel/lib/naive_type_checker.dart @@ -131,6 +131,13 @@ ${ownType} is not a subtype of ${superType} /// but it additionally accounts for parameter covariance. String _checkFunctionOverride( Class host, Member ownMember, Member superMember) { + if (ownMember is Procedure && + (ownMember.isMemberSignature || + (ownMember.isForwardingStub && !ownMember.isForwardingSemiStub))) { + // Synthesized members are not obligated to override super members. + return null; + } + final FunctionNode ownFunction = ownMember.function; final FunctionNode superFunction = superMember.function; Substitution ownSubstitution = _makeSubstitutionForMember(host, ownMember);