blob: 9f0c53c271864e81f61160161f2efea6373f5c94 [file] [log] [blame]
// 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.
import "package:expect/expect.dart";
// Test that `super == x` is properly type checked against the target
// `operator==` method. That is, the special allowance in the following spec
// text (from accepted/future-releases/nnbd/feature-specification.md) allows `x`
// to be nullable, but still requires that the type otherwise matches:
//
// Similarly, consider an expression `e` of the form `super == e2` that
// occurs in a class whose superclass is `C`, where the static type of `e2`
// is `T2`. Let `S` be the formal parameter type of the concrete declaration
// of `operator ==` found by method lookup in `C` (_if that search succeeds,
// otherwise it is a compile-time error_). It is a compile-time error
// unless `T2` is assignable to `S?`.
class Base {
bool operator ==(covariant num other) => false;
}
class Derived extends Base {
void test() {
String string = 'foo';
var stringQuestion = 'foo' as String?;
super == string;
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
// [cfe] The argument type 'String' can't be assigned to the parameter type 'num?'.
super == stringQuestion;
// ^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
// [cfe] The argument type 'String?' can't be assigned to the parameter type 'num?'.
}
}