mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 11:31:57 +00:00
[cfe] Add test for forwarding stub targets
The added test show that we generate a super call to the wrong target in some forwarding stubs. The target should have been the mixed in member but is instead the super member that it overrides. Change-Id: If7536628370ba69405cbedef969e727a5d220058 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/170684 Reviewed-by: Dmitry Stefantsov <dmitryas@google.com> Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
parent
54cd996b77
commit
1876c6751b
53
pkg/front_end/testcases/general/mixin_covariant2.dart
Normal file
53
pkg/front_end/testcases/general/mixin_covariant2.dart
Normal file
|
@ -0,0 +1,53 @@
|
|||
// 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.
|
||||
|
||||
class Superclass {
|
||||
String method1(num argument1, num argument2) => "Superclass";
|
||||
String method2(num argument1, num argument2) => "Superclass";
|
||||
String method3(num argument1, covariant int argument2) => "Superclass";
|
||||
String method4(num argument1, covariant num argument2) => "Superclass";
|
||||
}
|
||||
|
||||
class Mixin {
|
||||
String method1(num argument1, num argument2) => "Mixin";
|
||||
String method2(covariant int argument1, num argument2) => "Mixin";
|
||||
String method3(num argument1, num argument2) => "Mixin";
|
||||
String method4(covariant int argument1, int argument2) => "Mixin";
|
||||
}
|
||||
|
||||
class Class extends Superclass with Mixin {}
|
||||
|
||||
main() {
|
||||
Class c = new Class();
|
||||
expect("Mixin", c.method1(0, 1));
|
||||
expect("Mixin", c.method2(0, 1));
|
||||
expect("Mixin", c.method3(0, 1));
|
||||
expect("Mixin", c.method4(0, 1));
|
||||
|
||||
Superclass s = c;
|
||||
expect("Mixin", s.method1(0.5, 1.5));
|
||||
throws(() => s.method2(0.5, 1.5));
|
||||
expect("Mixin", s.method3(0.5, 1));
|
||||
throws(() => s.method4(0.5, 1));
|
||||
expect("Mixin", s.method4(1, 0.5));
|
||||
|
||||
Mixin m = c;
|
||||
expect("Mixin", m.method1(0, 1));
|
||||
expect("Mixin", m.method2(0, 1));
|
||||
expect("Mixin", m.method3(0, 1));
|
||||
expect("Mixin", m.method4(0, 1));
|
||||
}
|
||||
|
||||
void expect(expected, actual) {
|
||||
if (expected != actual) throw 'Expected $expected, actual $actual';
|
||||
}
|
||||
|
||||
void throws(void Function() f) {
|
||||
try {
|
||||
f();
|
||||
} catch (_) {
|
||||
return;
|
||||
}
|
||||
throw 'Expected exception';
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class Superclass extends core::Object {
|
||||
synthetic constructor •() → self::Superclass*
|
||||
;
|
||||
method method1(core::num* argument1, core::num* argument2) → core::String*
|
||||
;
|
||||
method method2(core::num* argument1, core::num* argument2) → core::String*
|
||||
;
|
||||
method method3(core::num* argument1, covariant core::int* argument2) → core::String*
|
||||
;
|
||||
method method4(core::num* argument1, covariant core::num* argument2) → core::String*
|
||||
;
|
||||
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
|
||||
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
|
||||
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
|
||||
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
|
||||
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
|
||||
abstract member-signature method toString() → core::String*; -> core::Object::toString
|
||||
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
|
||||
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
|
||||
}
|
||||
class Mixin extends core::Object {
|
||||
synthetic constructor •() → self::Mixin*
|
||||
;
|
||||
method method1(core::num* argument1, core::num* argument2) → core::String*
|
||||
;
|
||||
method method2(covariant core::int* argument1, core::num* argument2) → core::String*
|
||||
;
|
||||
method method3(core::num* argument1, core::num* argument2) → core::String*
|
||||
;
|
||||
method method4(covariant core::int* argument1, core::int* argument2) → core::String*
|
||||
;
|
||||
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
|
||||
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
|
||||
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
|
||||
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
|
||||
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
|
||||
abstract member-signature method toString() → core::String*; -> core::Object::toString
|
||||
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
|
||||
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
|
||||
}
|
||||
abstract class _Class&Superclass&Mixin = self::Superclass with self::Mixin /*isAnonymousMixin*/ {
|
||||
synthetic constructor •() → self::_Class&Superclass&Mixin*
|
||||
: super self::Superclass::•()
|
||||
;
|
||||
abstract forwarding-stub method method2(covariant core::num* argument1, core::num* argument2) → core::String*;
|
||||
forwarding-stub method method3(core::num* argument1, covariant core::num* argument2) → core::String*
|
||||
return super.{self::Superclass::method3}(argument1, argument2);
|
||||
forwarding-stub method method4(covariant core::num* argument1, covariant core::num* argument2) → core::String*
|
||||
return super.{self::Superclass::method4}(argument1, argument2);
|
||||
}
|
||||
class Class extends self::_Class&Superclass&Mixin {
|
||||
synthetic constructor •() → self::Class*
|
||||
;
|
||||
}
|
||||
static method main() → dynamic
|
||||
;
|
||||
static method expect(dynamic expected, dynamic actual) → void
|
||||
;
|
||||
static method throws(() →* void f) → void
|
||||
;
|
|
@ -0,0 +1,96 @@
|
|||
library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class Superclass extends core::Object {
|
||||
synthetic constructor •() → self::Superclass*
|
||||
: super core::Object::•()
|
||||
;
|
||||
method method1(core::num* argument1, core::num* argument2) → core::String*
|
||||
return "Superclass";
|
||||
method method2(core::num* argument1, core::num* argument2) → core::String*
|
||||
return "Superclass";
|
||||
method method3(core::num* argument1, covariant core::int* argument2) → core::String*
|
||||
return "Superclass";
|
||||
method method4(core::num* argument1, covariant core::num* argument2) → core::String*
|
||||
return "Superclass";
|
||||
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
|
||||
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
|
||||
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
|
||||
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
|
||||
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
|
||||
abstract member-signature method toString() → core::String*; -> core::Object::toString
|
||||
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
|
||||
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
|
||||
}
|
||||
class Mixin extends core::Object {
|
||||
synthetic constructor •() → self::Mixin*
|
||||
: super core::Object::•()
|
||||
;
|
||||
method method1(core::num* argument1, core::num* argument2) → core::String*
|
||||
return "Mixin";
|
||||
method method2(covariant core::int* argument1, core::num* argument2) → core::String*
|
||||
return "Mixin";
|
||||
method method3(core::num* argument1, core::num* argument2) → core::String*
|
||||
return "Mixin";
|
||||
method method4(covariant core::int* argument1, core::int* argument2) → core::String*
|
||||
return "Mixin";
|
||||
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
|
||||
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
|
||||
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
|
||||
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
|
||||
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
|
||||
abstract member-signature method toString() → core::String*; -> core::Object::toString
|
||||
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
|
||||
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
|
||||
}
|
||||
abstract class _Class&Superclass&Mixin = self::Superclass with self::Mixin /*isAnonymousMixin*/ {
|
||||
synthetic constructor •() → self::_Class&Superclass&Mixin*
|
||||
: super self::Superclass::•()
|
||||
;
|
||||
abstract forwarding-stub method method2(covariant core::num* argument1, core::num* argument2) → core::String*;
|
||||
forwarding-stub method method3(core::num* argument1, covariant core::num* argument2) → core::String*
|
||||
return super.{self::Superclass::method3}(argument1, argument2);
|
||||
forwarding-stub method method4(covariant core::num* argument1, covariant core::num* argument2) → core::String*
|
||||
return super.{self::Superclass::method4}(argument1, argument2);
|
||||
}
|
||||
class Class extends self::_Class&Superclass&Mixin {
|
||||
synthetic constructor •() → self::Class*
|
||||
: super self::_Class&Superclass&Mixin::•()
|
||||
;
|
||||
}
|
||||
static method main() → dynamic {
|
||||
self::Class* c = new self::Class::•();
|
||||
self::expect("Mixin", c.{self::Mixin::method1}(0, 1));
|
||||
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1));
|
||||
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1));
|
||||
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1));
|
||||
self::Superclass* s = c;
|
||||
self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5));
|
||||
self::throws(() → core::String* => s.{self::Superclass::method2}(0.5, 1.5));
|
||||
self::expect("Mixin", s.{self::Superclass::method3}(0.5, 1));
|
||||
self::throws(() → core::String* => s.{self::Superclass::method4}(0.5, 1));
|
||||
self::expect("Mixin", s.{self::Superclass::method4}(1, 0.5));
|
||||
self::Mixin* m = c;
|
||||
self::expect("Mixin", m.{self::Mixin::method1}(0, 1));
|
||||
self::expect("Mixin", m.{self::Mixin::method2}(0, 1));
|
||||
self::expect("Mixin", m.{self::Mixin::method3}(0, 1));
|
||||
self::expect("Mixin", m.{self::Mixin::method4}(0, 1));
|
||||
}
|
||||
static method expect(dynamic expected, dynamic actual) → void {
|
||||
if(!expected.{core::Object::==}(actual))
|
||||
throw "Expected ${expected}, actual ${actual}";
|
||||
}
|
||||
static method throws(() →* void f) → void {
|
||||
try {
|
||||
f.call();
|
||||
}
|
||||
on dynamic catch(final dynamic _) {
|
||||
return;
|
||||
}
|
||||
throw "Expected exception";
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
class Superclass {
|
||||
String method1(num argument1, num argument2) => "Superclass";
|
||||
String method2(num argument1, num argument2) => "Superclass";
|
||||
String method3(num argument1, covariant int argument2) => "Superclass";
|
||||
String method4(num argument1, covariant num argument2) => "Superclass";
|
||||
}
|
||||
|
||||
class Mixin {
|
||||
String method1(num argument1, num argument2) => "Mixin";
|
||||
String method2(covariant int argument1, num argument2) => "Mixin";
|
||||
String method3(num argument1, num argument2) => "Mixin";
|
||||
String method4(covariant int argument1, int argument2) => "Mixin";
|
||||
}
|
||||
|
||||
class Class extends Superclass with Mixin {}
|
||||
|
||||
main() {}
|
||||
void expect(expected, actual) {}
|
||||
void throws(void Function() f) {}
|
|
@ -0,0 +1,19 @@
|
|||
class Class extends Superclass with Mixin {}
|
||||
|
||||
class Mixin {
|
||||
String method1(num argument1, num argument2) => "Mixin";
|
||||
String method2(covariant int argument1, num argument2) => "Mixin";
|
||||
String method3(num argument1, num argument2) => "Mixin";
|
||||
String method4(covariant int argument1, int argument2) => "Mixin";
|
||||
}
|
||||
|
||||
class Superclass {
|
||||
String method1(num argument1, num argument2) => "Superclass";
|
||||
String method2(num argument1, num argument2) => "Superclass";
|
||||
String method3(num argument1, covariant int argument2) => "Superclass";
|
||||
String method4(num argument1, covariant num argument2) => "Superclass";
|
||||
}
|
||||
|
||||
main() {}
|
||||
void expect(expected, actual) {}
|
||||
void throws(void Function() f) {}
|
53
pkg/front_end/testcases/none/mixin_covariant.dart
Normal file
53
pkg/front_end/testcases/none/mixin_covariant.dart
Normal file
|
@ -0,0 +1,53 @@
|
|||
// 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.
|
||||
|
||||
class Superclass {
|
||||
String method1(num argument1, num argument2) => "Superclass";
|
||||
String method2(num argument1, num argument2) => "Superclass";
|
||||
String method3(num argument1, covariant int argument2) => "Superclass";
|
||||
String method4(num argument1, covariant num argument2) => "Superclass";
|
||||
}
|
||||
|
||||
class Mixin {
|
||||
String method1(num argument1, num argument2) => "Mixin";
|
||||
String method2(covariant int argument1, num argument2) => "Mixin";
|
||||
String method3(num argument1, num argument2) => "Mixin";
|
||||
String method4(covariant int argument1, int argument2) => "Mixin";
|
||||
}
|
||||
|
||||
class Class extends Superclass with Mixin {}
|
||||
|
||||
main() {
|
||||
Class c = new Class();
|
||||
expect("Mixin", c.method1(0, 1));
|
||||
expect("Mixin", c.method2(0, 1));
|
||||
expect("Mixin", c.method3(0, 1));
|
||||
expect("Mixin", c.method4(0, 1));
|
||||
|
||||
Superclass s = c;
|
||||
expect("Mixin", s.method1(0.5, 1.5));
|
||||
throws(() => s.method2(0.5, 1.5));
|
||||
expect("Mixin", s.method3(0.5, 1));
|
||||
throws(() => s.method4(0.5, 1));
|
||||
expect("Mixin", s.method4(1, 0.5));
|
||||
|
||||
Mixin m = c;
|
||||
expect("Mixin", m.method1(0, 1));
|
||||
expect("Mixin", m.method2(0, 1));
|
||||
expect("Mixin", m.method3(0, 1));
|
||||
expect("Mixin", m.method4(0, 1));
|
||||
}
|
||||
|
||||
void expect(expected, actual) {
|
||||
if (expected != actual) throw 'Expected $expected, actual $actual';
|
||||
}
|
||||
|
||||
void throws(void Function() f) {
|
||||
try {
|
||||
f();
|
||||
} catch (_) {
|
||||
return;
|
||||
}
|
||||
throw 'Expected exception';
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class Superclass extends core::Object {
|
||||
synthetic constructor •() → self::Superclass
|
||||
;
|
||||
method method1(core::num argument1, core::num argument2) → core::String
|
||||
;
|
||||
method method2(core::num argument1, core::num argument2) → core::String
|
||||
;
|
||||
method method3(core::num argument1, covariant core::int argument2) → core::String
|
||||
;
|
||||
method method4(core::num argument1, covariant core::num argument2) → core::String
|
||||
;
|
||||
}
|
||||
class Mixin extends core::Object {
|
||||
synthetic constructor •() → self::Mixin
|
||||
;
|
||||
method method1(core::num argument1, core::num argument2) → core::String
|
||||
;
|
||||
method method2(covariant core::int argument1, core::num argument2) → core::String
|
||||
;
|
||||
method method3(core::num argument1, core::num argument2) → core::String
|
||||
;
|
||||
method method4(covariant core::int argument1, core::int argument2) → core::String
|
||||
;
|
||||
}
|
||||
abstract class _Class&Superclass&Mixin = self::Superclass with self::Mixin /*isAnonymousMixin*/ {
|
||||
synthetic constructor •() → self::_Class&Superclass&Mixin
|
||||
: super self::Superclass::•()
|
||||
;
|
||||
abstract forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String;
|
||||
forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
|
||||
return super.{self::Superclass::method3}(argument1, argument2);
|
||||
forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
|
||||
return super.{self::Superclass::method4}(argument1, argument2);
|
||||
}
|
||||
class Class extends self::_Class&Superclass&Mixin {
|
||||
synthetic constructor •() → self::Class
|
||||
;
|
||||
}
|
||||
static method main() → dynamic
|
||||
;
|
||||
static method expect(dynamic expected, dynamic actual) → void
|
||||
;
|
||||
static method throws(() → void f) → void
|
||||
;
|
|
@ -0,0 +1,76 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class Superclass extends core::Object {
|
||||
synthetic constructor •() → self::Superclass
|
||||
: super core::Object::•()
|
||||
;
|
||||
method method1(core::num argument1, core::num argument2) → core::String
|
||||
return "Superclass";
|
||||
method method2(core::num argument1, core::num argument2) → core::String
|
||||
return "Superclass";
|
||||
method method3(core::num argument1, covariant core::int argument2) → core::String
|
||||
return "Superclass";
|
||||
method method4(core::num argument1, covariant core::num argument2) → core::String
|
||||
return "Superclass";
|
||||
}
|
||||
class Mixin extends core::Object {
|
||||
synthetic constructor •() → self::Mixin
|
||||
: super core::Object::•()
|
||||
;
|
||||
method method1(core::num argument1, core::num argument2) → core::String
|
||||
return "Mixin";
|
||||
method method2(covariant core::int argument1, core::num argument2) → core::String
|
||||
return "Mixin";
|
||||
method method3(core::num argument1, core::num argument2) → core::String
|
||||
return "Mixin";
|
||||
method method4(covariant core::int argument1, core::int argument2) → core::String
|
||||
return "Mixin";
|
||||
}
|
||||
abstract class _Class&Superclass&Mixin = self::Superclass with self::Mixin /*isAnonymousMixin*/ {
|
||||
synthetic constructor •() → self::_Class&Superclass&Mixin
|
||||
: super self::Superclass::•()
|
||||
;
|
||||
abstract forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String;
|
||||
forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
|
||||
return super.{self::Superclass::method3}(argument1, argument2);
|
||||
forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
|
||||
return super.{self::Superclass::method4}(argument1, argument2);
|
||||
}
|
||||
class Class extends self::_Class&Superclass&Mixin {
|
||||
synthetic constructor •() → self::Class
|
||||
: super self::_Class&Superclass&Mixin::•()
|
||||
;
|
||||
}
|
||||
static method main() → dynamic {
|
||||
self::Class c = new self::Class::•();
|
||||
self::expect("Mixin", c.{self::Mixin::method1}(0, 1));
|
||||
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1));
|
||||
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1));
|
||||
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1));
|
||||
self::Superclass s = c;
|
||||
self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5));
|
||||
self::throws(() → void => s.{self::Superclass::method2}(0.5, 1.5));
|
||||
self::expect("Mixin", s.{self::Superclass::method3}(0.5, 1));
|
||||
self::throws(() → void => s.{self::Superclass::method4}(0.5, 1));
|
||||
self::expect("Mixin", s.{self::Superclass::method4}(1, 0.5));
|
||||
self::Mixin m = c;
|
||||
self::expect("Mixin", m.{self::Mixin::method1}(0, 1));
|
||||
self::expect("Mixin", m.{self::Mixin::method2}(0, 1));
|
||||
self::expect("Mixin", m.{self::Mixin::method3}(0, 1));
|
||||
self::expect("Mixin", m.{self::Mixin::method4}(0, 1));
|
||||
}
|
||||
static method expect(dynamic expected, dynamic actual) → void {
|
||||
if(!expected.{core::Object::==}(actual))
|
||||
throw "Expected ${expected}, actual ${actual}";
|
||||
}
|
||||
static method throws(() → void f) → void {
|
||||
try {
|
||||
f.call();
|
||||
}
|
||||
on core::Object catch(final core::Object _) {
|
||||
return;
|
||||
}
|
||||
throw "Expected exception";
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
class Superclass {
|
||||
String method1(num argument1, num argument2) => "Superclass";
|
||||
String method2(num argument1, num argument2) => "Superclass";
|
||||
String method3(num argument1, covariant int argument2) => "Superclass";
|
||||
String method4(num argument1, covariant num argument2) => "Superclass";
|
||||
}
|
||||
|
||||
class Mixin {
|
||||
String method1(num argument1, num argument2) => "Mixin";
|
||||
String method2(covariant int argument1, num argument2) => "Mixin";
|
||||
String method3(num argument1, num argument2) => "Mixin";
|
||||
String method4(covariant int argument1, int argument2) => "Mixin";
|
||||
}
|
||||
|
||||
class Class extends Superclass with Mixin {}
|
||||
|
||||
main() {}
|
||||
void expect(expected, actual) {}
|
||||
void throws(void Function() f) {}
|
|
@ -0,0 +1,19 @@
|
|||
class Class extends Superclass with Mixin {}
|
||||
|
||||
class Mixin {
|
||||
String method1(num argument1, num argument2) => "Mixin";
|
||||
String method2(covariant int argument1, num argument2) => "Mixin";
|
||||
String method3(num argument1, num argument2) => "Mixin";
|
||||
String method4(covariant int argument1, int argument2) => "Mixin";
|
||||
}
|
||||
|
||||
class Superclass {
|
||||
String method1(num argument1, num argument2) => "Superclass";
|
||||
String method2(num argument1, num argument2) => "Superclass";
|
||||
String method3(num argument1, covariant int argument2) => "Superclass";
|
||||
String method4(num argument1, covariant num argument2) => "Superclass";
|
||||
}
|
||||
|
||||
main() {}
|
||||
void expect(expected, actual) {}
|
||||
void throws(void Function() f) {}
|
|
@ -0,0 +1,76 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class Superclass extends core::Object {
|
||||
synthetic constructor •() → self::Superclass
|
||||
: super core::Object::•()
|
||||
;
|
||||
method method1(core::num argument1, core::num argument2) → core::String
|
||||
return "Superclass";
|
||||
method method2(core::num argument1, core::num argument2) → core::String
|
||||
return "Superclass";
|
||||
method method3(core::num argument1, covariant core::int argument2) → core::String
|
||||
return "Superclass";
|
||||
method method4(core::num argument1, covariant core::num argument2) → core::String
|
||||
return "Superclass";
|
||||
}
|
||||
class Mixin extends core::Object {
|
||||
synthetic constructor •() → self::Mixin
|
||||
: super core::Object::•()
|
||||
;
|
||||
method method1(core::num argument1, core::num argument2) → core::String
|
||||
return "Mixin";
|
||||
method method2(covariant core::int argument1, core::num argument2) → core::String
|
||||
return "Mixin";
|
||||
method method3(core::num argument1, core::num argument2) → core::String
|
||||
return "Mixin";
|
||||
method method4(covariant core::int argument1, core::int argument2) → core::String
|
||||
return "Mixin";
|
||||
}
|
||||
abstract class _Class&Superclass&Mixin = self::Superclass with self::Mixin /*isAnonymousMixin*/ {
|
||||
synthetic constructor •() → self::_Class&Superclass&Mixin
|
||||
: super self::Superclass::•()
|
||||
;
|
||||
abstract forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String;
|
||||
forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
|
||||
return super.{self::Superclass::method3}(argument1, argument2);
|
||||
forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
|
||||
return super.{self::Superclass::method4}(argument1, argument2);
|
||||
}
|
||||
class Class extends self::_Class&Superclass&Mixin {
|
||||
synthetic constructor •() → self::Class
|
||||
: super self::_Class&Superclass&Mixin::•()
|
||||
;
|
||||
}
|
||||
static method main() → dynamic {
|
||||
self::Class c = new self::Class::•();
|
||||
self::expect("Mixin", c.{self::Mixin::method1}(0, 1));
|
||||
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1));
|
||||
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1));
|
||||
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1));
|
||||
self::Superclass s = c;
|
||||
self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5));
|
||||
self::throws(() → void => s.{self::Superclass::method2}(0.5, 1.5));
|
||||
self::expect("Mixin", s.{self::Superclass::method3}(0.5, 1));
|
||||
self::throws(() → void => s.{self::Superclass::method4}(0.5, 1));
|
||||
self::expect("Mixin", s.{self::Superclass::method4}(1, 0.5));
|
||||
self::Mixin m = c;
|
||||
self::expect("Mixin", m.{self::Mixin::method1}(0, 1));
|
||||
self::expect("Mixin", m.{self::Mixin::method2}(0, 1));
|
||||
self::expect("Mixin", m.{self::Mixin::method3}(0, 1));
|
||||
self::expect("Mixin", m.{self::Mixin::method4}(0, 1));
|
||||
}
|
||||
static method expect(dynamic expected, dynamic actual) → void {
|
||||
if(!expected.{core::Object::==}(actual))
|
||||
throw "Expected ${expected}, actual ${actual}";
|
||||
}
|
||||
static method throws(() → void f) → void {
|
||||
try {
|
||||
f.call();
|
||||
}
|
||||
on core::Object catch(final core::Object _) {
|
||||
return;
|
||||
}
|
||||
throw "Expected exception";
|
||||
}
|
|
@ -23,6 +23,7 @@ general/invalid_operator_override: TypeCheckError
|
|||
general/issue41210a: TypeCheckError
|
||||
general/issue41210b/issue41210: TypeCheckError
|
||||
general/mixin_application_override: TypeCheckError
|
||||
general/mixin_covariant2: TypeCheckError
|
||||
general/override_check_accessor_after_inference: TypeCheckError
|
||||
general/override_check_accessor_basic: TypeCheckError
|
||||
general/override_check_accessor_with_covariant_modifier: TypeCheckError
|
||||
|
@ -47,6 +48,7 @@ late_lowering/covariant_late_field: TypeCheckError
|
|||
nnbd/covariant_late_field: TypeCheckError
|
||||
nnbd/getter_vs_setter_type: TypeCheckError
|
||||
nnbd/issue42603: TypeCheckError
|
||||
none/mixin_covariant: TypeCheckError
|
||||
rasta/native_is_illegal: Pass # Issue 29763
|
||||
runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
|
||||
runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
|
||||
|
|
|
@ -78,6 +78,7 @@ general/micro: RuntimeError
|
|||
general/mixin_application_override: ExpectationFileMismatch # Too many errors.
|
||||
general/mixin_application_override: TypeCheckError
|
||||
general/mixin_constructors_with_default_values: RuntimeError # Expected
|
||||
general/mixin_covariant2: TypeCheckError
|
||||
general/operator_method_not_found: RuntimeError # Expected
|
||||
general/optional: TypeCheckError
|
||||
general/override_check_accessor_after_inference: TypeCheckError # Issue #31620
|
||||
|
@ -174,6 +175,7 @@ nnbd/no_support_for_old_null_aware_index_access_syntax: RuntimeError # Expected.
|
|||
nnbd/nullable_object_access: TypeCheckError
|
||||
nnbd/nullable_receiver: TypeCheckError
|
||||
nnbd/potentially_nullable_access: TypeCheckError
|
||||
none/mixin_covariant: TypeCheckError
|
||||
rasta/abstract_constructor: RuntimeError
|
||||
rasta/bad_constructor_redirection: RuntimeError
|
||||
rasta/bad_continue: RuntimeError
|
||||
|
|
|
@ -81,6 +81,7 @@ general/issue41210b/issue41210: TypeCheckError
|
|||
general/micro: RuntimeError
|
||||
general/mixin_application_override: TypeCheckError
|
||||
general/mixin_constructors_with_default_values: RuntimeError
|
||||
general/mixin_covariant2: TypeCheckError
|
||||
general/operator_method_not_found: RuntimeError
|
||||
general/optional: TypeCheckError
|
||||
general/override_check_accessor_after_inference: TypeCheckError # Issue #31620
|
||||
|
@ -176,6 +177,7 @@ nnbd/no_support_for_old_null_aware_index_access_syntax: RuntimeError # Expected.
|
|||
nnbd/nullable_object_access: TypeCheckError
|
||||
nnbd/nullable_receiver: TypeCheckError
|
||||
nnbd/potentially_nullable_access: TypeCheckError
|
||||
none/mixin_covariant: TypeCheckError
|
||||
rasta/abstract_constructor: RuntimeError
|
||||
rasta/bad_constructor_redirection: RuntimeError
|
||||
rasta/bad_continue: RuntimeError
|
||||
|
|
|
@ -72,6 +72,7 @@ nnbd_mixed/messages_with_types_opt_in: TypeCheckError
|
|||
nnbd_mixed/messages_with_types_opt_out: TypeCheckError
|
||||
nnbd_mixed/super_access/main: Crash # Issue 43864
|
||||
nnbd_mixed/super_access/main.no_link: Crash # Issue 43864
|
||||
none/mixin_covariant: TypeCheckError
|
||||
value_class/simple: RuntimeError # Expected
|
||||
value_class/value_extends_non_value: RuntimeError # Expected
|
||||
value_class/value_implements_non_value: RuntimeError # Expected
|
||||
|
|
Loading…
Reference in a new issue