fabf3efda4
Change-Id: I8055552313786814bde6f66214a013a8bedb2078 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/177500 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
271 lines
8.5 KiB
Dart
271 lines
8.5 KiB
Dart
// Copyright (c) 2018, 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.
|
|
|
|
// Signature conformance test.
|
|
abstract class CII {
|
|
int id(int x);
|
|
}
|
|
|
|
class CSI {
|
|
String id(int x) => "$x";
|
|
}
|
|
|
|
class CIS {
|
|
int id(String x) => 0;
|
|
}
|
|
|
|
class CTT<T> {
|
|
T id(T x) => x;
|
|
}
|
|
|
|
// Wrong return type.
|
|
abstract class C1 = CII with CIS;
|
|
// ^
|
|
// [cfe] The mixin application class 'C1' introduces an erroneous override of 'id'.
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
abstract class C2 extends CII with CIS {}
|
|
// ^
|
|
// [cfe] Applying the mixin 'CIS' to 'CII' introduces an erroneous override of 'id'.
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
|
|
|
|
// Wrong argument type.
|
|
abstract class C3 = CII with CSI;
|
|
// ^
|
|
// [cfe] The mixin application class 'C3' introduces an erroneous override of 'id'.
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
abstract class C4 extends CII with CSI {}
|
|
// ^
|
|
// [cfe] Applying the mixin 'CSI' to 'CII' introduces an erroneous override of 'id'.
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
|
|
// Similar as the above but using an instantiated class instead.
|
|
abstract class C5 = CII with CTT<int>;
|
|
abstract class C6 extends CII with CTT<int> {}
|
|
abstract class C7 = CII with CTT<String>;
|
|
// ^
|
|
// [cfe] The mixin application class 'C7' introduces an erroneous override of 'id'.
|
|
// ^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
abstract class C8 extends CII with CTT<String> {}
|
|
// ^
|
|
// [cfe] Applying the mixin 'CTT' to 'CII' introduces an erroneous override of 'id'.
|
|
// ^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
|
|
// Named parameters
|
|
abstract class NIIx {
|
|
int? id({int? x}) => x;
|
|
}
|
|
|
|
class NIIxy {
|
|
int? id({int? x, int? y}) => y;
|
|
}
|
|
|
|
class NIIy {
|
|
int? id({int? y}) => y;
|
|
}
|
|
|
|
class NII {
|
|
int? id(int? x) => x;
|
|
}
|
|
|
|
// It's OK to introduce more named parameters.
|
|
abstract class N1 = NIIx with NIIxy;
|
|
abstract class N2 extends NIIx with NIIxy {}
|
|
// It's NOT OK to rename named parameters.
|
|
abstract class N3 = NIIx with NIIy;
|
|
// ^
|
|
// [cfe] The mixin application class 'N3' introduces an erroneous override of 'id'.
|
|
// ^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
abstract class N4 extends NIIx with NIIy {}
|
|
// ^
|
|
// [cfe] Applying the mixin 'NIIy' to 'NIIx' introduces an erroneous override of 'id'.
|
|
// ^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
|
|
|
|
// It's NOT OK to drop named parameters.
|
|
abstract class N5 = NIIx with NII;
|
|
// ^
|
|
// [cfe] The mixin application class 'N5' introduces an erroneous override of 'id'.
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
abstract class N6 extends NIIx with NII {}
|
|
// ^
|
|
// [cfe] Applying the mixin 'NII' to 'NIIx' introduces an erroneous override of 'id'.
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
|
|
class NBABxy<A, B> {
|
|
B? id ({A? x, B? y}) => y;
|
|
}
|
|
|
|
class NTTy<T> {
|
|
T? id({T? y}) => y;
|
|
}
|
|
|
|
class NTTx<T> {
|
|
T? id(T? x) => x;
|
|
}
|
|
|
|
// Same as above but with generic classes.
|
|
abstract class N7 = NIIx with NBABxy<int, int>;
|
|
abstract class N8 extends NIIx with NBABxy<int, int> {}
|
|
abstract class N9 = NIIx with NBABxy<String, int>;
|
|
// ^
|
|
// [cfe] The mixin application class 'N9' introduces an erroneous override of 'id'.
|
|
// ^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
abstract class N10 extends NIIx with NBABxy<String, int> {}
|
|
// ^
|
|
// [cfe] Applying the mixin 'NBABxy' to 'NIIx' introduces an erroneous override of 'id'.
|
|
// ^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
abstract class N11 = NIIx with NTTy<int>;
|
|
// ^
|
|
// [cfe] The mixin application class 'N11' introduces an erroneous override of 'id'.
|
|
// ^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
abstract class N12 extends NIIx with NTTy<int> {}
|
|
// ^
|
|
// [cfe] Applying the mixin 'NTTy' to 'NIIx' introduces an erroneous override of 'id'.
|
|
// ^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
abstract class N13 = NIIx with NTTx<int>;
|
|
// ^
|
|
// [cfe] The mixin application class 'N13' introduces an erroneous override of 'id'.
|
|
// ^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
abstract class N14 extends NIIx with NTTx<int> {}
|
|
// ^
|
|
// [cfe] Applying the mixin 'NTTx' to 'NIIx' introduces an erroneous override of 'id'.
|
|
// ^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
|
|
// Optional positional parameters
|
|
abstract class OII {
|
|
int? id([int? x]) => x;
|
|
}
|
|
|
|
class OIII {
|
|
int? id([int? x, int? y]) => y;
|
|
}
|
|
|
|
class OIIy {
|
|
int? id([int? y]) => y;
|
|
}
|
|
|
|
class PII {
|
|
int? id(int? x) => x;
|
|
}
|
|
|
|
// It's OK to introduce more optional parameters.
|
|
abstract class O1 = OII with OIII;
|
|
abstract class O2 extends OII with OIII {}
|
|
// It's OK to rename optional parameters.
|
|
abstract class O3 = OII with OIIy;
|
|
abstract class O4 extends OII with OIIy {}
|
|
// It's NOT OK to drop optional parameters.
|
|
abstract class O5 = OII with PII;
|
|
// ^
|
|
// [cfe] The mixin application class 'O5' introduces an erroneous override of 'id'.
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
abstract class O6 extends OII with PII {}
|
|
// ^
|
|
// [cfe] Applying the mixin 'PII' to 'OII' introduces an erroneous override of 'id'.
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
|
|
class OBAB<A, B> {
|
|
B? id ([A? x, B? y]) => y;
|
|
}
|
|
|
|
class OTTy<T> {
|
|
T? id([T? y]) => y;
|
|
}
|
|
|
|
class PTT<T> {
|
|
T? id(T? x) => x;
|
|
}
|
|
|
|
// Same as above but with generic classes.
|
|
abstract class O7 = OII with OBAB<int, int>;
|
|
abstract class O8 extends OII with OBAB<int, int> {}
|
|
abstract class O9 = OII with OBAB<String, int>;
|
|
// ^
|
|
// [cfe] The mixin application class 'O9' introduces an erroneous override of 'id'.
|
|
// ^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
abstract class O10 extends OII with OBAB<String, int> {}
|
|
// ^
|
|
// [cfe] Applying the mixin 'OBAB' to 'OII' introduces an erroneous override of 'id'.
|
|
// ^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
abstract class O11 = OII with OTTy<int>;
|
|
abstract class O12 extends OII with OTTy<int> {}
|
|
abstract class O13 = OII with PTT<int>;
|
|
// ^
|
|
// [cfe] The mixin application class 'O13' introduces an erroneous override of 'id'.
|
|
// ^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
abstract class O14 extends OII with PTT<int> {}
|
|
// ^
|
|
// [cfe] Applying the mixin 'PTT' to 'OII' introduces an erroneous override of 'id'.
|
|
// ^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
|
|
// More tests with generic classes.
|
|
abstract class GTTnum {
|
|
T id<T extends num>(x);
|
|
}
|
|
|
|
class MTTnum {
|
|
T id<T extends num>(x) => x;
|
|
}
|
|
|
|
class MTTint {
|
|
T id<T extends int>(x) => x;
|
|
}
|
|
|
|
class MTT {
|
|
T id<T>(x) => x;
|
|
}
|
|
|
|
class MTTnumR {
|
|
T id<T extends num, R>(x) => x;
|
|
}
|
|
class G1 = GTTnum with MTTnum;
|
|
class G2 = GTTnum with MTTint;
|
|
// ^
|
|
// [cfe] The mixin application class 'G2' introduces an erroneous override of 'id'.
|
|
// ^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
class G3 = GTTnum with MTT;
|
|
// ^
|
|
// [cfe] The mixin application class 'G3' introduces an erroneous override of 'id'.
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
class G4 = GTTnum with MTTnumR;
|
|
// ^
|
|
// [cfe] The mixin application class 'G4' introduces an erroneous override of 'id'.
|
|
// ^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
class G5 = GTTnum with CII;
|
|
// ^^
|
|
// [analyzer] COMPILE_TIME_ERROR.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER
|
|
// [cfe] The mixin application class 'G5' introduces an erroneous override of 'id'.
|
|
// ^
|
|
// [cfe] The non-abstract class 'G5' is missing implementations for these members:
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
|
|
void main() {}
|