mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 04:27:17 +00:00
e25e532900
Additionally, add some missing compile-time errors and adjust error text expectations. Closes https://github.com/dart-lang/sdk/issues/49327 TEST=Covered by existing tests. Change-Id: Ie62211650633beb26abdf735e0dd36c4de4e24c4 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/266740 Commit-Queue: Chloe Stefantsova <cstefantsova@google.com> Reviewed-by: Stephen Adams <sra@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com> Reviewed-by: Slava Egorov <vegorov@google.com>
683 lines
21 KiB
Dart
683 lines
21 KiB
Dart
// Copyright (c) 2022, 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.
|
|
|
|
// Test errors required by new enhanced enum syntax.
|
|
|
|
// Enums must satisfy the same requirements as their induced class.
|
|
// That means no name conflicts, no static/instance member conflicts,
|
|
// and no type errors.
|
|
// Enum classes must implement their interface.
|
|
// They cannot override `Enum.index` or have any instance member named
|
|
// `values` or declare any name which will conflicts with a static
|
|
// constant getter named `values`.
|
|
//
|
|
// An enum declaration's generative constructors can never be referenced
|
|
// other than implicitly in creating the values and as target of redirecting
|
|
// generative constructors. All generative constructors must be const.
|
|
//
|
|
// An enum class cannot override `index` or implement anything named `values`.
|
|
|
|
// Helper mixins and also used as interfaces.
|
|
mixin GetFoo {
|
|
int get foo => 42;
|
|
}
|
|
|
|
mixin SetFoo {
|
|
void set foo(int _) {}
|
|
}
|
|
|
|
mixin MethodFoo {
|
|
int foo() => 42;
|
|
}
|
|
|
|
mixin ValuesGetter {
|
|
int get values => 42;
|
|
}
|
|
|
|
mixin IndexGetter {
|
|
int get index => 42;
|
|
}
|
|
|
|
mixin NeverIndexGetter {
|
|
Never get index => throw "Never!";
|
|
}
|
|
|
|
// "You cannot have two members with the same name in the same class---be
|
|
// they declared or inherited"
|
|
|
|
// Enums inherit members of `Object` and `index`.
|
|
// Enums implicitly declare `values` and their enum values (as static const
|
|
// getters.)
|
|
|
|
enum ConflictInstanceMembers {
|
|
e1;
|
|
int get foo => 42;
|
|
int foo() => 37;
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
|
|
// [cfe] 'foo' is already declared in this scope.
|
|
}
|
|
|
|
// "It is an error if you have a static member named $m$ in your class
|
|
// and an instance member of the same basename"
|
|
enum ConflictStaticGetterInstanceMembers {
|
|
e1;
|
|
static int get foo => 42;
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
|
|
int foo() => 37;
|
|
// ^
|
|
// [cfe] 'foo' is already declared in this scope.
|
|
}
|
|
|
|
enum ConflictStaticSetterInstanceMembers {
|
|
e1;
|
|
static void set foo(int _) {}
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
|
|
// [cfe] This static member conflicts with an instance member.
|
|
int foo() => 37;
|
|
}
|
|
|
|
enum ConflictStaticInstanceProperty2 {
|
|
e1;
|
|
int get foo => 42;
|
|
static void set foo(int _) {}
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
|
|
// [cfe] This static member conflicts with an instance member.
|
|
}
|
|
|
|
// "It is an error if you have a static getter $v$
|
|
// and an instance setter \code{$v$=}"
|
|
enum ConflictStaticInstanceProperty {
|
|
e1;
|
|
static int get foo => 42;
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
|
|
// [cfe] This static member conflicts with an instance member.
|
|
void set foo(int _) {}
|
|
}
|
|
|
|
|
|
enum ConflictStaticInheritedFoo with MethodFoo {
|
|
e1;
|
|
static int get foo => 42;
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
|
|
// [cfe] Can't declare a member that conflicts with an inherited one.
|
|
}
|
|
|
|
enum ConflictInheritedEnumValue with MethodFoo {
|
|
foo;
|
|
//^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
|
|
// [cfe] Can't declare a member that conflicts with an inherited one.
|
|
}
|
|
|
|
enum ConflictStaticEnumValues {
|
|
e1,
|
|
e1,
|
|
//^^
|
|
// [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
|
|
// [cfe] 'e1' is already declared in this scope.
|
|
;
|
|
}
|
|
|
|
enum ConflictStaticEnumValuesLooksDifferent {
|
|
e1(),
|
|
e1.value(42),
|
|
//^^
|
|
// [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
|
|
// [cfe] 'e1' is already declared in this scope.
|
|
;
|
|
const ConflictStaticEnumValuesLooksDifferent();
|
|
const ConflictStaticEnumValuesLooksDifferent.value( dynamic_);
|
|
}
|
|
|
|
enum ConflictInstanceGetterInheritedFooMethod with MethodFoo {
|
|
e1;
|
|
int get foo => 42;
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_FIELD_AND_METHOD
|
|
// [cfe] Can't declare a member that conflicts with an inherited one.
|
|
}
|
|
|
|
enum ConflictStaticInstanceImplicitValues {
|
|
e1;
|
|
int get values => 42;
|
|
// ^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.VALUES_DECLARATION_IN_ENUM
|
|
// [cfe] An enum can't declare a member named 'values'.
|
|
}
|
|
|
|
enum ConflictStaticInstanceEnumValue {
|
|
e1;
|
|
//^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
|
|
int get e1 => 42;
|
|
// ^
|
|
// [cfe] 'e1' is already declared in this scope.
|
|
}
|
|
|
|
enum ConflictEnumValueInheritedIndex {
|
|
index;
|
|
//^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
|
|
// [cfe] Can't declare a member that conflicts with an inherited one.
|
|
}
|
|
|
|
enum ConflictEnumValueInheritedToString {
|
|
toString;
|
|
//^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
|
|
// [cfe] 'toString' is already declared in this scope.
|
|
}
|
|
|
|
enum ConflictEnumValueImplicitValues {
|
|
values;
|
|
//^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.VALUES_DECLARATION_IN_ENUM
|
|
// [cfe] 'values' is already declared in this scope.
|
|
}
|
|
|
|
enum ConflictEnumValueInheritedFoo with MethodFoo {
|
|
foo;
|
|
//^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
|
|
// [cfe] Can't declare a member that conflicts with an inherited one.
|
|
}
|
|
|
|
enum ConflictClassGetterSetterTypeInstance {
|
|
e1;
|
|
num get foo => 42;
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.GETTER_NOT_SUBTYPE_SETTER_TYPES
|
|
// [cfe] The type 'num' of the getter 'ConflictClassGetterSetterTypeInstance.foo' is not a subtype of the type 'int' of the setter 'ConflictClassGetterSetterTypeInstance.foo'.
|
|
|
|
// Type of setter parameter must be subtype of type of getter.
|
|
void set foo(int _) {}
|
|
}
|
|
|
|
enum ConflictClassGetterSetterTypeStatic {
|
|
e1;
|
|
static num get foo => 42;
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.GETTER_NOT_SUBTYPE_SETTER_TYPES
|
|
// [cfe] The type 'num' of the getter 'ConflictClassGetterSetterTypeStatic.foo' is not a subtype of the type 'int' of the setter 'ConflictClassGetterSetterTypeStatic.foo'.
|
|
|
|
// Type of setter parameter must be subtype of type of getter.
|
|
static void set foo(int _) {}
|
|
}
|
|
|
|
enum NoConflictClassEnumValueStaticSetter {
|
|
e1;
|
|
|
|
static void set e1(NoConflictClassEnumValueStaticSetter _) {}
|
|
}
|
|
|
|
enum ConflictClassEnumValueStaticSetterType {
|
|
e1;
|
|
//^^
|
|
// [analyzer] COMPILE_TIME_ERROR.GETTER_NOT_SUBTYPE_SETTER_TYPES
|
|
// [cfe] The type 'ConflictClassEnumValueStaticSetterType' of the getter 'ConflictClassEnumValueStaticSetterType.e1' is not a subtype of the type 'int' of the setter 'ConflictClassEnumValueStaticSetterType.e1'.
|
|
|
|
// Type of setter parameter must be subtype of type of getter.
|
|
static void set e1(int _) {}
|
|
}
|
|
|
|
enum ConflictTypeParameterMember<foo> {
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_TYPE_VARIABLE_AND_MEMBER
|
|
e1;
|
|
int get foo => 42;
|
|
// ^
|
|
// [cfe] Conflicts with type variable 'foo'.
|
|
}
|
|
|
|
enum ConflictTypeParameterValues<values> {
|
|
// ^
|
|
// [cfe] Conflicts with type variable 'values'.
|
|
// ^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_TYPE_VARIABLE_AND_MEMBER
|
|
e1;
|
|
}
|
|
|
|
enum ConflictTypeParameterEnumValue<e1> {
|
|
// ^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_TYPE_VARIABLE_AND_MEMBER
|
|
e1;
|
|
//^
|
|
// [cfe] Conflicts with type variable 'e1'.
|
|
}
|
|
|
|
enum ConflictTypeParameters<T, T> {
|
|
// ^
|
|
// [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
|
|
// [cfe] A type variable can't have the same name as another.
|
|
e1;
|
|
}
|
|
|
|
enum ConflictClassTypeParameter<ConflictClassTypeParameter> {
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_TYPE_VARIABLE_AND_CONTAINER
|
|
// [cfe] A type variable can't have the same name as its enclosing declaration.
|
|
e1;
|
|
//^
|
|
// [cfe] Couldn't find constructor 'ConflictClassTypeParameter'.
|
|
}
|
|
|
|
// "If you define an instance member named $m$,
|
|
// and your superclass has an instance member of the same name,
|
|
// they override each other."
|
|
|
|
enum OverrideInheritedMemberOverride with MethodFoo {
|
|
e1;
|
|
int foo(int x) => x; // super.foo is nullary.
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
// [cfe] The method 'OverrideInheritedMemberOverride.foo' has more required arguments than those of overridden method '_Enum with MethodFoo.foo'.
|
|
}
|
|
|
|
enum OverrideInheritedMemberDifferentType with GetFoo {
|
|
e1;
|
|
int foo(int x) => x;
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_METHOD_AND_FIELD
|
|
// [cfe] Can't declare a member that conflicts with an inherited one.
|
|
}
|
|
|
|
enum ImplementInheritedMemberDifferentType implements GetFoo {
|
|
e1;
|
|
int foo(int x) => x;
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_METHOD_AND_FIELD
|
|
// [cfe] Can't declare a member that conflicts with an inherited one.
|
|
}
|
|
|
|
enum OverrideInheritedParameterTypeOverride with SetFoo {
|
|
e1;
|
|
void set foo(Never n) {} // Invalid parameter override.
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
|
|
// ^
|
|
// [cfe] The parameter 'n' of the method 'OverrideInheritedParameterTypeOverride.foo' has type 'Never', which does not match the corresponding type, 'int', in the overridden method, '_Enum with SetFoo.foo'.
|
|
}
|
|
|
|
// "Setters, getters and operators never have
|
|
// optional parameters of any kind"
|
|
|
|
enum DeclareOperatorOptional {
|
|
e1;
|
|
int operator+([int? x]) => x ?? 0;
|
|
// ^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.OPTIONAL_PARAMETER_IN_OPERATOR
|
|
// ^
|
|
// [cfe] An operator can't have optional parameters.
|
|
}
|
|
|
|
enum DeclareSetterOptional {
|
|
e1;
|
|
void set foo([int? x]) {}
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
|
|
// ^
|
|
// [cfe] A setter should have exactly one formal parameter.
|
|
}
|
|
|
|
// "The identifier of a named constructor cannot be the same as
|
|
// the basename of a static member declared in the same class"
|
|
|
|
enum ConflictConstructorNameStatic {
|
|
e1.foo();
|
|
const ConflictConstructorNameStatic.foo();
|
|
// ^
|
|
// [cfe] Conflicts with member 'foo'.
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_CONSTRUCTOR_AND_STATIC_MEMBER
|
|
static int get foo => 42;
|
|
// ^
|
|
// [cfe] Conflicts with constructor 'ConflictConstructorNameStatic.foo'.
|
|
}
|
|
|
|
enum ConflictConstructorNameStaticEnumValue {
|
|
e1.e1();
|
|
//^
|
|
// [cfe] Conflicts with constructor 'ConflictConstructorNameStaticEnumValue.e1'.
|
|
const ConflictConstructorNameStaticEnumValue.e1();
|
|
// ^
|
|
// [cfe] Conflicts with member 'e1'.
|
|
// ^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_CONSTRUCTOR_AND_STATIC_MEMBER
|
|
}
|
|
|
|
// "It is an error if a member has the same name as its enclosing class"
|
|
|
|
enum ConflictClassStatic {
|
|
e1;
|
|
//^
|
|
// [cfe] Cannot invoke a non-'const' constructor where a const expression is expected.
|
|
static int ConflictClassStatic() => 37;
|
|
//^^^^^^
|
|
// [analyzer] SYNTACTIC_ERROR.STATIC_CONSTRUCTOR
|
|
// [cfe] Constructors can't be static.
|
|
// ^^^
|
|
// [analyzer] SYNTACTIC_ERROR.CONSTRUCTOR_WITH_RETURN_TYPE
|
|
// [cfe] Constructors can't have a return type.
|
|
// ^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.NON_CONST_GENERATIVE_ENUM_CONSTRUCTOR
|
|
// [cfe] Generative enum constructors must be marked as 'const'.
|
|
// ^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.RETURN_IN_GENERATIVE_CONSTRUCTOR
|
|
// ^^
|
|
// [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
|
|
// [cfe] Constructors can't have a return type.
|
|
}
|
|
|
|
enum ConflictClassInstance {
|
|
e1;
|
|
//^
|
|
// [cfe] Cannot invoke a non-'const' constructor where a const expression is expected.
|
|
int ConflictClassInstance() => 37;
|
|
//^^^
|
|
// [analyzer] SYNTACTIC_ERROR.CONSTRUCTOR_WITH_RETURN_TYPE
|
|
// [cfe] Constructors can't have a return type.
|
|
// ^^^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.NON_CONST_GENERATIVE_ENUM_CONSTRUCTOR
|
|
// [cfe] Generative enum constructors must be marked as 'const'.
|
|
// ^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.RETURN_IN_GENERATIVE_CONSTRUCTOR
|
|
// ^^
|
|
// [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
|
|
// [cfe] Constructors can't have a return type.
|
|
}
|
|
|
|
enum ConflictClassEnumValue {
|
|
ConflictClassEnumValue;
|
|
//^^^^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.ENUM_CONSTANT_SAME_NAME_AS_ENCLOSING
|
|
// [cfe] Name of enum constant 'ConflictClassEnumValue' can't be the same as the enum's own name.
|
|
// ^
|
|
// [cfe] Couldn't find constructor 'ConflictClassEnumValue'.
|
|
}
|
|
|
|
// Has conflict with implicitly inserted `values` member.
|
|
enum values {
|
|
// ^^^^^^
|
|
// [analyzer] unspecified
|
|
// [cfe] The name 'values' is not a valid name for an enum. Try using a different name.
|
|
e1;
|
|
//^
|
|
// [cfe] Couldn't find constructor 'values'.
|
|
}
|
|
|
|
// "It is an error if a concrete class does not implement some member
|
|
// of its interface, and there is no non-trivial \code{noSuchMethod}"
|
|
|
|
enum UnimplementedInterface {
|
|
e1;
|
|
int foo();
|
|
//^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.ENUM_WITH_ABSTRACT_MEMBER
|
|
// ^
|
|
// [cfe] Enums can't declare abstract members.
|
|
}
|
|
|
|
enum UnimplementedInterfaceInherited implements MethodFoo {
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER
|
|
// [cfe] The non-abstract class 'UnimplementedInterfaceInherited' is missing implementations for these members:
|
|
e1;
|
|
}
|
|
|
|
enum ImplementedInterface with MethodFoo {
|
|
e1;
|
|
int foo(); // Abstract members are allowed.
|
|
}
|
|
|
|
enum ImplementedInterfaceNSM {
|
|
e1;
|
|
int foo(); // Abstract members are allowed.
|
|
dynamic noSuchMethod(i) => 42;
|
|
}
|
|
|
|
// Primitive Equality/HashCode.
|
|
// Enums must not override `==` or `hashCode`.
|
|
|
|
enum OverridesEquals {
|
|
e1;
|
|
|
|
bool operator==(Object other) => identical(e1, other);
|
|
// ^^^^^^^^
|
|
// [analyzer] unspecified
|
|
// ^
|
|
// [cfe] An enum can't declare a non-abstract member named '=='.
|
|
}
|
|
|
|
enum OverridesHashCode {
|
|
e1;
|
|
|
|
int get hashCode => 42;
|
|
// ^^^^^^^^
|
|
// [analyzer] unspecified
|
|
// [cfe] An enum can't declare a non-abstract member named 'hashCode'.
|
|
}
|
|
|
|
// Invalid syntax that the compiled *should* recover from.
|
|
abstract enum CannotBeAbstract {
|
|
// [error column 1, length 8]
|
|
// [analyzer] SYNTACTIC_ERROR.EXTRANEOUS_MODIFIER
|
|
// [cfe] Can't have modifier 'abstract' here.
|
|
e1;
|
|
}
|
|
|
|
// Cannot reference generative constructors of enum classes.
|
|
// Never allowed to reference by ClassName[.name],
|
|
// only implicitly in value declarations and `this`[.name] in
|
|
// redirecting generative constructors.
|
|
// All ClassName[.name] references are errors.
|
|
enum NoConstructorCalls {
|
|
e1(42),
|
|
e2.ignore(NoConstructorCalls(1)),
|
|
// ^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
|
|
// [cfe] Enums can't be instantiated.
|
|
;
|
|
|
|
final int x;
|
|
|
|
const NoConstructorCalls(this.x);
|
|
const NoConstructorCalls.ignore(dynamic _) : x = 0;
|
|
|
|
// Only valid use, as target of redirecting generative constructor.
|
|
const NoConstructorCalls.redirect() : this(1);
|
|
const NoConstructorCalls.redirectNamed() : this.ignore(0);
|
|
|
|
const NoConstructorCalls.invalidRedirect()
|
|
: this.ignore(NoConstructorCalls(1));
|
|
// ^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
|
|
// ^^^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
|
|
// [cfe] Enums can't be instantiated.
|
|
|
|
// Generative constructors must be const.
|
|
NoConstructorCalls.notConst(this.x);
|
|
//^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.NON_CONST_GENERATIVE_ENUM_CONSTRUCTOR
|
|
// [cfe] Generative enum constructors must be marked as 'const'.
|
|
|
|
// As usual, redirecting generative constructors must redirect to
|
|
// generative constructors.
|
|
const NoConstructorCalls.badRedirect() : this.factory();
|
|
// ^
|
|
// [cfe] Final field 'x' is not initialized by this constructor.
|
|
// ^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR
|
|
// [cfe] Couldn't find constructor 'NoConstructorCalls.factory'.
|
|
// ^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.REDIRECT_TO_NON_CONST_CONSTRUCTOR
|
|
|
|
factory NoConstructorCalls.factory() => e1; // Valid.
|
|
|
|
// Cannot reference generative constructors from factory constructors.
|
|
factory NoConstructorCalls.badFactory() => NoConstructorCalls(2);
|
|
// ^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
|
|
// [cfe] Enums can't be instantiated.
|
|
|
|
factory NoConstructorCalls.badFactoryRedirect(int x) = NoConstructorCalls;
|
|
// ^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
|
|
// [cfe] Enum factory constructors can't redirect to generative constructors.
|
|
|
|
static const NoConstructorCalls e3 = NoConstructorCalls(3);
|
|
// ^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
|
|
// [cfe] Enums can't be instantiated.
|
|
|
|
static void uses() {
|
|
Function f = NoConstructorCalls.new; // No tearoffs.
|
|
// ^^^^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
|
|
// ^
|
|
// [cfe] Enum constructors can't be torn off.
|
|
|
|
Function g = NoConstructorCalls.ignore; // No tearoffs.
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
|
|
// ^
|
|
// [cfe] Enum constructors can't be torn off.
|
|
|
|
const c1 = NoConstructorCalls(0);
|
|
// ^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
|
|
// [cfe] Enums can't be instantiated.
|
|
|
|
var v1 = new NoConstructorCalls(0);
|
|
// ^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
|
|
// [cfe] Enums can't be instantiated.
|
|
}
|
|
}
|
|
|
|
enum DeclaresInstanceValues {
|
|
e1;
|
|
int get values => 42;
|
|
// ^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.VALUES_DECLARATION_IN_ENUM
|
|
// [cfe] An enum can't declare a member named 'values'.
|
|
}
|
|
|
|
enum DeclaresStaticValues {
|
|
e1;
|
|
static int get values => 42;
|
|
// ^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.VALUES_DECLARATION_IN_ENUM
|
|
// [cfe] An enum can't declare a member named 'values'.
|
|
}
|
|
|
|
enum InheritsValues with ValuesGetter {
|
|
// ^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.ILLEGAL_ENUM_VALUES
|
|
// [cfe] An enum can't inherit a member named 'values'.
|
|
// [cfe] Can't declare a member that conflicts with an inherited one.
|
|
e1;
|
|
}
|
|
|
|
enum ImplementsValues implements ValuesGetter {
|
|
// ^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.ILLEGAL_ENUM_VALUES
|
|
// [cfe] Can't declare a member that conflicts with an inherited one.
|
|
e1;
|
|
|
|
noSuchMethod(i) => 42;
|
|
}
|
|
|
|
enum DeclaresInstanceIndex {
|
|
e1;
|
|
int get index => 42;
|
|
// ^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER
|
|
// [cfe] An enum can't declare a non-abstract member named 'index'.
|
|
}
|
|
|
|
enum DeclaresStaticIndex {
|
|
e1;
|
|
static int get index => 42; // Conflicts with inherited instance member.
|
|
// ^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
|
|
// [cfe] An enum can't declare a non-abstract member named 'index'.
|
|
// [cfe] Can't declare a member that conflicts with an inherited one.
|
|
}
|
|
|
|
enum InheritsIndex with IndexGetter {
|
|
// ^^^^^^^^^^^^^
|
|
// [analyzer] unspecified
|
|
// [cfe] An enum can't inherit a member named 'index'.
|
|
e1;
|
|
}
|
|
|
|
// No problem, implementation is not overridden.
|
|
enum ImplementsIndex implements IndexGetter {
|
|
e1;
|
|
}
|
|
|
|
enum DeclaresNeverIndex {
|
|
// ^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.INVALID_IMPLEMENTATION_OVERRIDE
|
|
// [cfe] The implementation of 'index' in the non-abstract class 'DeclaresNeverIndex' does not conform to its interface.
|
|
e1;
|
|
|
|
Never get index;
|
|
}
|
|
|
|
enum ImplementsNeverIndex {
|
|
e1;
|
|
|
|
Never get index => throw "Never!";
|
|
// ^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER
|
|
// [cfe] An enum can't declare a non-abstract member named 'index'.
|
|
}
|
|
|
|
enum NSMImplementsNeverIndex implements NeverIndexGetter {
|
|
// ^^^^^^
|
|
// [analyzer] unspecified
|
|
// [cfe] The implementation of 'index' in the non-abstract class 'NSMImplementsNeverIndex' does not conform to its interface.
|
|
e1;
|
|
|
|
noSuchMethod(i) => throw "Never!";
|
|
}
|
|
|
|
// Cannot have cyclic references between constants.
|
|
enum CyclicReference {
|
|
// ^
|
|
// [cfe] Constant evaluation error:
|
|
e1(e2),
|
|
//^^
|
|
// [analyzer] COMPILE_TIME_ERROR.RECURSIVE_COMPILE_TIME_CONSTANT
|
|
// [cfe] Can't infer the type of 'e1': circularity found during type inference.
|
|
// [cfe] Constant evaluation error:
|
|
e2(e1);
|
|
//^^
|
|
// [analyzer] COMPILE_TIME_ERROR.RECURSIVE_COMPILE_TIME_CONSTANT
|
|
final CyclicReference other;
|
|
const CyclicReference(this.other);
|
|
}
|
|
|
|
// Since `values` contains `e1`,
|
|
// we can't have a reference in the other direction.
|
|
enum CyclicReferenceValues {
|
|
// ^
|
|
// [cfe] Constant evaluation error:
|
|
e1(values);
|
|
//^^
|
|
// [analyzer] COMPILE_TIME_ERROR.RECURSIVE_COMPILE_TIME_CONSTANT
|
|
final List<CyclicReferenceValues> list;
|
|
const CyclicReferenceValues(this.list);
|
|
}
|
|
|
|
void main() {}
|