Closed iarkh closed 4 years ago
Reading the spec, I believe the analyzer is correct if the code is null-safe. (I'm not so sure if it's legacy code, though).
The check for having the same instantiation of an interface uses NORM
and NNBD_TOP_MERGE
:
If a class
C
in an opted-in library implements the same generic classI
more than once asI0
, ..,In
, and at least one of theIi
is not syntactically equal to the others, then it is an error ifNNBD_TOP_MERGE(S0, ..., Sn)
is not defined whereSi
isNORM(Ii)
. Otherwise, for the purposes of runtime subtyping checks,C
is considered to implement the canonical interface given byNNBD_TOP_MERGE(S0, ..., Sn)
.
The type NORM(FutureOr)
is dynamic
, as is NORM(FutureOr<FutureOr<FutureOr>>)
.
The NNBD_TOP_MERGE(Object?, dynamic)
is Object?
, which means it's defined and there is no error.
The same problem is reproducible for the dynamic
vs FutureOr
case.
Agreeing that there is no error here, note that dart-lang/language#824 aims to make an adjustment to the definition of NNBD_TOP_MERGE
. This will not change the ability of an opted-it class to have superinterfaces that differ in the ways that NNBD_TOP_MERGE
eliminates, but it will make them implement a superinterface that has type argument Object?
or dynamic
in some situations where the current rules would yield void
.
Proposed fix: https://dart-review.googlesource.com/c/sdk/+/134842
Dart VM version: 2.8.0-edge.40f23c735f04433e4fc334fbd674474bd3de0f8b (Tue Jan 28 01:14:48 2020 +0000) on "linux_x64"
This issue is similar with #40453, but dart and analyzer behave in the different ways here.
The following source code declares classes X1 and X2 which inherit classes with incompatible type arguments:
This code throws two compile errors with dart and passes with analyzer. Seems like error should be thrown in both cases.
Sample output is: