dart-sdk/tests/language/mixin_super_bound2_test.dart
Paul Berry afc2c880a6 Restore old supermixin functionality to shared language tests.
In 451eaab718 the "--supermixin" flag was
removed from the VM and from the shared language tests.  This caused
those language tests to fail on analyzer (because analyzer still
requires the flag).

Also some tests that validated the non-supermixin behavior were deleted.

It looks like we are going to keep requiring the flag in analyzer until
the feature is implemented in dart2js (see
https://github.com/dart-lang/sdk/issues/24478#issuecomment-170054303).
So in order to ensure that the analyzer implementation continues to be
tested, we still need the flags in the tests.  We also need the old
tests that validate the non-supermixin behavior, since the analyzer
continues to implement that behavior when the "--supermixin" flag is
absent.

This CL does not introduce any new VM failures, because (a) the VM
ignores the "--supermixin" flag, so the tests in which the flag is being
reintroduced will still behave the same way on the VM, and (b) the tests
that validate non-supermixin behavior are disabled on the VM.

R=brianwilkerson@google.com, regis@google.com

Review URL: https://codereview.chromium.org/1635763003 .
2016-01-26 08:50:21 -08:00

77 lines
2.2 KiB
Dart

// Copyright (c) 2015, 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.
// SharedOptions=--supermixin
import "package:expect/expect.dart";
bool inCheckedMode() {
try {
var i = 42;
String s = i;
} on TypeError catch (e) {
return true;
}
return false;
}
class MS<U, V
extends U /// 01: static type warning
> { }
class M<U
extends V /// 01: continued
, V> extends MS<V, U> { }
class NS<U
extends V /// 01: continued
, V> { }
class N<U, V
extends U /// 01: continued
> extends NS<V, U> { }
class S<T> { }
class MNA<U, V, W> extends S<List<U>>
with M<List<V>, List<U>>, N<List<W>, List<W>> { }
class MNA2<U, V, W> = S<List<U>>
with M<List<W>, List<W>>, N<List<U>, List<V>>;
class MNA3<U, V, W> extends S<List<U>>
with MNA<U, V, W>, MNA2<List<U>, List<V>, List<W>> { }
class MNA4<U, V, W> = S<List<U>>
with MNA<U, V, W>, MNA2<List<U>, List<V>, List<W>>;
main() {
new MNA<num, int, bool>();
new MNA2<num, int, bool>();
new MNA3<num, int, bool>();
new MNA4<num, int, bool>();
bool shouldThrow = false
|| inCheckedMode() /// 01: continued
;
if (shouldThrow) {
// Type parameter U of M must extend type parameter V, but
// type argument List<num> is not a subtype of List<int>.
Expect.throws(() => new MNA<int, num, bool>(), (e) => e is TypeError);
// Type parameter V of N must extend type parameter U, but
// type argument List<num> is not a subtype of List<int>.
Expect.throws(() => new MNA2<int, num, bool>(), (e) => e is TypeError);
// Type parameter V of N must extend type parameter U, but
// type argument List<List<num>> is not a subtype of List<List<int>>.
Expect.throws(() => new MNA3<int, num, bool>(), (e) => e is TypeError);
// Type parameter V of N must extend type parameter U, but
// type argument List<List<num>> is not a subtype of List<List<int>>.
Expect.throws(() => new MNA4<int, num, bool>(), (e) => e is TypeError);
} else {
new MNA<int, num, bool>();
new MNA2<int, num, bool>();
new MNA3<int, num, bool>();
new MNA4<int, num, bool>();
}
}