blob: d6b6713f17d639d532397ae187b91656549e8e42 [file] [log] [blame]
// Copyright (c) 2017, 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.
library covariant_override_test;
// This test contains cases where `covariant` is used as intended.
abstract class A {
A(this.f1, this.f2, this.f3);
// Normal usage, "by design": superclass requests covariance.
void m1(covariant Object o);
// Normal usage, "ad hoc": subclass requests covariance.
void m2(Object o);
// Syntactic special case: omit the type in subclass.
void m3(Object o);
// Positional optional arguments.
void m4([covariant Object o]);
void m5([Object o]);
void m6([Object o]);
// Named arguments.
void m7({covariant Object arg});
void m8({Object arg});
void m9({Object arg});
// Normal usage on field, "by design": superclass requests covariance.
covariant Object f1;
// Normal usage on field, "ad hoc": subclass requests covariance.
Object f2;
// Syntactic special case.
Object f3;
abstract class B extends A {
B(num f1, num f2, num f3) : super(f1, f2, f3);
void m1(num n);
void m2(covariant num n);
void m3(covariant n);
void m4([num n]);
void m5([covariant num n]);
void m6([covariant n]);
void m7({num arg});
void m8({covariant num arg});
void m9({covariant arg});
void set f1(num n);
void set f2(covariant num n);
void set f3(covariant n);
class C extends B {
C(int f1, int f2, int f3) : super(f1, f2, f3);
void m1(int i) {}
void m2(int i) {}
void m3(int i) {}
void m4([int i]) {}
void m5([int i]) {}
void m6([int i]) {}
void m7({int arg}) {}
void m8({int arg}) {}
void m9({int arg}) {}
void set f1(covariant int i) {}
void set f2(covariant int i) {}
void set f3(int i) {}
main() {
// For Dart 1.x, `covariant` has no runtime semantics; we just ensure
// that the code is not unused, such that we know it will be parsed.
A a = new C(39, 40, 41);
a.m7(arg: 42);
a.m8(arg: 42);
a.m9(arg: 42);
a.f1 = 42;
a.f2 = 42;
a.f3 = 42;