[cfe] Report error when using a class as a mixin when sealed-class is enabled.

From the changes in dart-lang/language#2674 that specify from a certain language version, we would like classes to not be used as mixins unless specified as a 'mixin class'.

Currently, this behaviour is under the sealed-class flag. May be subject to change as the other modifiers are added, but I'd at least like to make sure this works for sealed classes.

Change-Id: I5754b383327dde06d49175fe2d05c8ba7462145f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/273082
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Kallen Tu <kallentu@google.com>
This commit is contained in:
Kallen Tu 2022-12-02 22:31:58 +00:00 committed by Commit Queue
parent 70b994e54f
commit 6c9873bf42
22 changed files with 1096 additions and 42 deletions

View file

@ -905,6 +905,27 @@ Message _withArgumentsCantReadFile(Uri uri_, String string) {
arguments: {'uri': uri_, 'string': string});
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String name)> templateCantUseClassAsMixin =
const Template<Message Function(String name)>(
problemMessageTemplate: r"""Class '#name' can't be used as a mixin.""",
withArguments: _withArgumentsCantUseClassAsMixin);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Message Function(String name)> codeCantUseClassAsMixin =
const Code<Message Function(String name)>(
"CantUseClassAsMixin",
);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
Message _withArgumentsCantUseClassAsMixin(String name) {
if (name.isEmpty) throw 'No name provided';
name = demangleMixinApplicationName(name);
return new Message(codeCantUseClassAsMixin,
problemMessage: """Class '${name}' can't be used as a mixin.""",
arguments: {'name': name});
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(Token token)>
templateCantUseControlFlowOrSpreadAsConstant =

View file

@ -2069,44 +2069,60 @@ severity: $severity
noLength);
}
} else if (supertype is ClassBuilder &&
supertype.isSealed &&
supertype.libraryBuilder.origin != cls.libraryBuilder.origin) {
// If the class is a mixin declaration with an `on` clause which is the
// supertype we are evaluating right now, we want to avoid reporting an
// error.
bool superTypeIsOnClause = false;
if (cls.cls.isAnonymousMixin && !cls.cls.isEliminatedMixin) {
// The class has multiple 'on' clauses.
List<TypeBuilder>? classInterfaces = cls.interfaceBuilders;
if (classInterfaces != null) {
for (TypeBuilder interface in classInterfaces) {
if (interface.declaration == supertype) {
superTypeIsOnClause = true;
break;
cls.libraryBuilder.libraryFeatures.sealedClass.isEnabled) {
// Check for implicit class mixins.
TypeBuilder? mixedInType = cls.mixedInTypeBuilder;
if (cls.isMixinApplication &&
mixedInType != null &&
mixedInType.declaration == supertype &&
!supertype.isMixinDeclaration) {
cls.addProblem(
templateCantUseClassAsMixin
.withArguments(supertype.fullNameForErrors),
cls.charOffset,
noLength);
}
// Report error for subtyping outside of sealed supertype's library.
if (supertype.isSealed &&
supertype.libraryBuilder.origin != cls.libraryBuilder.origin) {
// If the class is a mixin declaration with an `on` clause which is
// the supertype we are evaluating right now, we want to avoid
// reporting an error.
bool superTypeIsOnClause = false;
if (cls.cls.isAnonymousMixin && !cls.cls.isEliminatedMixin) {
// The class has multiple 'on' clauses.
List<TypeBuilder>? classInterfaces = cls.interfaceBuilders;
if (classInterfaces != null) {
for (TypeBuilder interface in classInterfaces) {
if (interface.declaration == supertype) {
superTypeIsOnClause = true;
break;
}
}
}
} else if (cls.isMixinDeclaration) {
// The class has up to one 'on' clause.
TypeBuilder? classSuperType = cls.supertypeBuilder;
if (classSuperType != null &&
classSuperType.declaration == supertype) {
superTypeIsOnClause = true;
}
}
} else if (cls.isMixinDeclaration) {
// The class has up to one 'on' clause.
TypeBuilder? classSuperType = cls.supertypeBuilder;
if (classSuperType != null &&
classSuperType.declaration == supertype) {
superTypeIsOnClause = true;
}
}
if (!superTypeIsOnClause) {
if (supertype.isMixinDeclaration) {
cls.addProblem(
templateSealedMixinSubtypeOutsideOfLibrary
.withArguments(supertype.fullNameForErrors),
cls.charOffset,
noLength);
} else {
cls.addProblem(
templateSealedClassSubtypeOutsideOfLibrary
.withArguments(supertype.fullNameForErrors),
cls.charOffset,
noLength);
if (!superTypeIsOnClause) {
if (supertype.isMixinDeclaration) {
cls.addProblem(
templateSealedMixinSubtypeOutsideOfLibrary
.withArguments(supertype.fullNameForErrors),
cls.charOffset,
noLength);
} else {
cls.addProblem(
templateSealedClassSubtypeOutsideOfLibrary
.withArguments(supertype.fullNameForErrors),
cls.charOffset,
noLength);
}
}
}
}

View file

@ -64,6 +64,7 @@ CantInferPackagesFromPackageUri/analyzerCode: Fail
CantInferPackagesFromPackageUri/example: Fail
CantInferTypeDueToCircularity/example: Fail
CantReadFile/part_wrapped_script: Fail # Importing file in the (now) part.
CantUseClassAsMixin/analyzerCode: Fail
CantUseControlFlowOrSpreadAsConstant/example: Fail
CantUseDeferredPrefixAsConstant/part_wrapped_script: Fail # Importing file in the (now) part.
CantUsePrefixAsExpression/part_wrapped_script: Fail # Importing file in the (now) part.

View file

@ -6021,3 +6021,10 @@ SealedMixinSubtypeOutsideOfLibrary:
class B with M {}
lib.dart:
sealed mixin M {}
CantUseClassAsMixin:
problemMessage: "Class '#name' can't be used as a mixin."
experiments: sealed-class
script: |
class A {}
class B with A {}

View file

@ -10,6 +10,10 @@ library /*isNonNullableByDefault*/;
// class Class2 implements Sealed {}
// ^
//
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Class 'Sealed' can't be used as a mixin.
// class Class3 with Sealed {}
// ^
//
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Sealed class 'Sealed' can't be extended, implemented, or mixed in outside of its library.
// class Class3 with Sealed {}
// ^

View file

@ -10,6 +10,10 @@ library /*isNonNullableByDefault*/;
// class Class2 implements Sealed {}
// ^
//
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Class 'Sealed' can't be used as a mixin.
// class Class3 with Sealed {}
// ^
//
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Sealed class 'Sealed' can't be extended, implemented, or mixed in outside of its library.
// class Class3 with Sealed {}
// ^

View file

@ -10,6 +10,10 @@ library /*isNonNullableByDefault*/;
// class Class2 implements Sealed {}
// ^
//
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Class 'Sealed' can't be used as a mixin.
// class Class3 with Sealed {}
// ^
//
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Sealed class 'Sealed' can't be extended, implemented, or mixed in outside of its library.
// class Class3 with Sealed {}
// ^

View file

@ -10,6 +10,10 @@ library /*isNonNullableByDefault*/;
// class Class2 implements Sealed {}
// ^
//
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Class 'Sealed' can't be used as a mixin.
// class Class3 with Sealed {}
// ^
//
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Sealed class 'Sealed' can't be extended, implemented, or mixed in outside of its library.
// class Class3 with Sealed {}
// ^

View file

@ -10,6 +10,10 @@ library /*isNonNullableByDefault*/;
// class Class2 implements Sealed {}
// ^
//
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Class 'Sealed' can't be used as a mixin.
// class Class3 with Sealed {}
// ^
//
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Sealed class 'Sealed' can't be extended, implemented, or mixed in outside of its library.
// class Class3 with Sealed {}
// ^

View file

@ -10,6 +10,10 @@ library /*isNonNullableByDefault*/;
// class Class2 implements Sealed {}
// ^
//
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Class 'Sealed' can't be used as a mixin.
// class Class3 with Sealed {}
// ^
//
// pkg/front_end/testcases/sealed_class/extends_implements_with/main.dart:11:7: Error: Sealed class 'Sealed' can't be extended, implemented, or mixed in outside of its library.
// class Class3 with Sealed {}
// ^

View file

@ -0,0 +1,20 @@
// 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.
sealed class SealedClass {}
class A with SealedClass {}
sealed mixin SealedMixin {}
class B with SealedClass, SealedMixin {}
class Class {}
class C with Class, SealedClass {}
class D with Class, SealedMixin {}
mixin Mixin {}
class E with Mixin, SealedClass {}
class F with Mixin, SealedMixin {}
// TODO(kallentu): Move this to a more generic test.
class G with Class, Mixin {}

View file

@ -0,0 +1,149 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:6:7: Error: Class 'SealedClass' can't be used as a mixin.
// class A with SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:9:7: Error: Class 'SealedClass' can't be used as a mixin.
// class B with SealedClass, SealedMixin {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'Class' can't be used as a mixin.
// class C with Class, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'SealedClass' can't be used as a mixin.
// class C with Class, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:13:7: Error: Class 'Class' can't be used as a mixin.
// class D with Class, SealedMixin {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:16:7: Error: Class 'SealedClass' can't be used as a mixin.
// class E with Mixin, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:20:7: Error: Class 'Class' can't be used as a mixin.
// class G with Class, Mixin {}
// ^
//
import self as self;
import "dart:core" as core;
abstract sealed class SealedClass extends core::Object {
synthetic constructor •() → self::SealedClass
: super core::Object::•()
;
}
abstract class _A&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_A&Object&SealedClass
: super core::Object::•()
;
}
class A extends self::_A&Object&SealedClass {
synthetic constructor •() → self::A
: super self::_A&Object&SealedClass::•()
;
}
abstract sealed class SealedMixin extends core::Object /*isMixinDeclaration*/ {
}
abstract class _B&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_B&Object&SealedClass
: super core::Object::•()
;
}
abstract class _B&Object&SealedClass&SealedMixin = self::_B&Object&SealedClass with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_B&Object&SealedClass&SealedMixin
: super self::_B&Object&SealedClass::•()
;
}
class B extends self::_B&Object&SealedClass&SealedMixin {
synthetic constructor •() → self::B
: super self::_B&Object&SealedClass&SealedMixin::•()
;
}
class Class extends core::Object {
synthetic constructor •() → self::Class
: super core::Object::•()
;
}
abstract class _C&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&Class
: super core::Object::•()
;
}
abstract class _C&Object&Class&SealedClass = self::_C&Object&Class with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&Class&SealedClass
: super self::_C&Object&Class::•()
;
}
class C extends self::_C&Object&Class&SealedClass {
synthetic constructor •() → self::C
: super self::_C&Object&Class&SealedClass::•()
;
}
abstract class _D&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_D&Object&Class
: super core::Object::•()
;
}
abstract class _D&Object&Class&SealedMixin = self::_D&Object&Class with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_D&Object&Class&SealedMixin
: super self::_D&Object&Class::•()
;
}
class D extends self::_D&Object&Class&SealedMixin {
synthetic constructor •() → self::D
: super self::_D&Object&Class&SealedMixin::•()
;
}
abstract class Mixin extends core::Object /*isMixinDeclaration*/ {
}
abstract class _E&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&Mixin
: super core::Object::•()
;
}
abstract class _E&Object&Mixin&SealedClass = self::_E&Object&Mixin with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&Mixin&SealedClass
: super self::_E&Object&Mixin::•()
;
}
class E extends self::_E&Object&Mixin&SealedClass {
synthetic constructor •() → self::E
: super self::_E&Object&Mixin&SealedClass::•()
;
}
abstract class _F&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_F&Object&Mixin
: super core::Object::•()
;
}
abstract class _F&Object&Mixin&SealedMixin = self::_F&Object&Mixin with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_F&Object&Mixin&SealedMixin
: super self::_F&Object&Mixin::•()
;
}
class F extends self::_F&Object&Mixin&SealedMixin {
synthetic constructor •() → self::F
: super self::_F&Object&Mixin&SealedMixin::•()
;
}
abstract class _G&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_G&Object&Class
: super core::Object::•()
;
}
abstract class _G&Object&Class&Mixin = self::_G&Object&Class with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_G&Object&Class&Mixin
: super self::_G&Object&Class::•()
;
}
class G extends self::_G&Object&Class&Mixin {
synthetic constructor •() → self::G
: super self::_G&Object&Class&Mixin::•()
;
}

View file

@ -0,0 +1,149 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:6:7: Error: Class 'SealedClass' can't be used as a mixin.
// class A with SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:9:7: Error: Class 'SealedClass' can't be used as a mixin.
// class B with SealedClass, SealedMixin {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'Class' can't be used as a mixin.
// class C with Class, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'SealedClass' can't be used as a mixin.
// class C with Class, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:13:7: Error: Class 'Class' can't be used as a mixin.
// class D with Class, SealedMixin {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:16:7: Error: Class 'SealedClass' can't be used as a mixin.
// class E with Mixin, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:20:7: Error: Class 'Class' can't be used as a mixin.
// class G with Class, Mixin {}
// ^
//
import self as self;
import "dart:core" as core;
abstract sealed class SealedClass extends core::Object {
synthetic constructor •() → self::SealedClass
: super core::Object::•()
;
}
abstract class _A&Object&SealedClass extends core::Object implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_A&Object&SealedClass
: super core::Object::•()
;
}
class A extends self::_A&Object&SealedClass {
synthetic constructor •() → self::A
: super self::_A&Object&SealedClass::•()
;
}
abstract sealed class SealedMixin extends core::Object /*isMixinDeclaration*/ {
}
abstract class _B&Object&SealedClass extends core::Object implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_B&Object&SealedClass
: super core::Object::•()
;
}
abstract class _B&Object&SealedClass&SealedMixin extends self::_B&Object&SealedClass implements self::SealedMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_B&Object&SealedClass&SealedMixin
: super self::_B&Object&SealedClass::•()
;
}
class B extends self::_B&Object&SealedClass&SealedMixin {
synthetic constructor •() → self::B
: super self::_B&Object&SealedClass&SealedMixin::•()
;
}
class Class extends core::Object {
synthetic constructor •() → self::Class
: super core::Object::•()
;
}
abstract class _C&Object&Class extends core::Object implements self::Class /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&Class
: super core::Object::•()
;
}
abstract class _C&Object&Class&SealedClass extends self::_C&Object&Class implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&Class&SealedClass
: super self::_C&Object&Class::•()
;
}
class C extends self::_C&Object&Class&SealedClass {
synthetic constructor •() → self::C
: super self::_C&Object&Class&SealedClass::•()
;
}
abstract class _D&Object&Class extends core::Object implements self::Class /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_D&Object&Class
: super core::Object::•()
;
}
abstract class _D&Object&Class&SealedMixin extends self::_D&Object&Class implements self::SealedMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_D&Object&Class&SealedMixin
: super self::_D&Object&Class::•()
;
}
class D extends self::_D&Object&Class&SealedMixin {
synthetic constructor •() → self::D
: super self::_D&Object&Class&SealedMixin::•()
;
}
abstract class Mixin extends core::Object /*isMixinDeclaration*/ {
}
abstract class _E&Object&Mixin extends core::Object implements self::Mixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&Mixin
: super core::Object::•()
;
}
abstract class _E&Object&Mixin&SealedClass extends self::_E&Object&Mixin implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&Mixin&SealedClass
: super self::_E&Object&Mixin::•()
;
}
class E extends self::_E&Object&Mixin&SealedClass {
synthetic constructor •() → self::E
: super self::_E&Object&Mixin&SealedClass::•()
;
}
abstract class _F&Object&Mixin extends core::Object implements self::Mixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_F&Object&Mixin
: super core::Object::•()
;
}
abstract class _F&Object&Mixin&SealedMixin extends self::_F&Object&Mixin implements self::SealedMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_F&Object&Mixin&SealedMixin
: super self::_F&Object&Mixin::•()
;
}
class F extends self::_F&Object&Mixin&SealedMixin {
synthetic constructor •() → self::F
: super self::_F&Object&Mixin&SealedMixin::•()
;
}
abstract class _G&Object&Class extends core::Object implements self::Class /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_G&Object&Class
: super core::Object::•()
;
}
abstract class _G&Object&Class&Mixin extends self::_G&Object&Class implements self::Mixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_G&Object&Class&Mixin
: super self::_G&Object&Class::•()
;
}
class G extends self::_G&Object&Class&Mixin {
synthetic constructor •() → self::G
: super self::_G&Object&Class&Mixin::•()
;
}

View file

@ -0,0 +1,13 @@
sealed
class SealedClass {}
class A with SealedClass {}
sealed
mixin SealedMixin {}
class B with SealedClass, SealedMixin {}
class Class {}
class C with Class, SealedClass {}
class D with Class, SealedMixin {}
mixin Mixin {}
class E with Mixin, SealedClass {}
class F with Mixin, SealedMixin {}
class G with Class, Mixin {}

View file

@ -0,0 +1,149 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:6:7: Error: Class 'SealedClass' can't be used as a mixin.
// class A with SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:9:7: Error: Class 'SealedClass' can't be used as a mixin.
// class B with SealedClass, SealedMixin {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'Class' can't be used as a mixin.
// class C with Class, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'SealedClass' can't be used as a mixin.
// class C with Class, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:13:7: Error: Class 'Class' can't be used as a mixin.
// class D with Class, SealedMixin {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:16:7: Error: Class 'SealedClass' can't be used as a mixin.
// class E with Mixin, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:20:7: Error: Class 'Class' can't be used as a mixin.
// class G with Class, Mixin {}
// ^
//
import self as self;
import "dart:core" as core;
abstract sealed class SealedClass extends core::Object {
synthetic constructor •() → self::SealedClass
: super core::Object::•()
;
}
abstract class _A&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_A&Object&SealedClass
: super core::Object::•()
;
}
class A extends self::_A&Object&SealedClass {
synthetic constructor •() → self::A
: super self::_A&Object&SealedClass::•()
;
}
abstract sealed class SealedMixin extends core::Object /*isMixinDeclaration*/ {
}
abstract class _B&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_B&Object&SealedClass
: super core::Object::•()
;
}
abstract class _B&Object&SealedClass&SealedMixin = self::_B&Object&SealedClass with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_B&Object&SealedClass&SealedMixin
: super self::_B&Object&SealedClass::•()
;
}
class B extends self::_B&Object&SealedClass&SealedMixin {
synthetic constructor •() → self::B
: super self::_B&Object&SealedClass&SealedMixin::•()
;
}
class Class extends core::Object {
synthetic constructor •() → self::Class
: super core::Object::•()
;
}
abstract class _C&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&Class
: super core::Object::•()
;
}
abstract class _C&Object&Class&SealedClass = self::_C&Object&Class with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&Class&SealedClass
: super self::_C&Object&Class::•()
;
}
class C extends self::_C&Object&Class&SealedClass {
synthetic constructor •() → self::C
: super self::_C&Object&Class&SealedClass::•()
;
}
abstract class _D&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_D&Object&Class
: super core::Object::•()
;
}
abstract class _D&Object&Class&SealedMixin = self::_D&Object&Class with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_D&Object&Class&SealedMixin
: super self::_D&Object&Class::•()
;
}
class D extends self::_D&Object&Class&SealedMixin {
synthetic constructor •() → self::D
: super self::_D&Object&Class&SealedMixin::•()
;
}
abstract class Mixin extends core::Object /*isMixinDeclaration*/ {
}
abstract class _E&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&Mixin
: super core::Object::•()
;
}
abstract class _E&Object&Mixin&SealedClass = self::_E&Object&Mixin with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&Mixin&SealedClass
: super self::_E&Object&Mixin::•()
;
}
class E extends self::_E&Object&Mixin&SealedClass {
synthetic constructor •() → self::E
: super self::_E&Object&Mixin&SealedClass::•()
;
}
abstract class _F&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_F&Object&Mixin
: super core::Object::•()
;
}
abstract class _F&Object&Mixin&SealedMixin = self::_F&Object&Mixin with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_F&Object&Mixin&SealedMixin
: super self::_F&Object&Mixin::•()
;
}
class F extends self::_F&Object&Mixin&SealedMixin {
synthetic constructor •() → self::F
: super self::_F&Object&Mixin&SealedMixin::•()
;
}
abstract class _G&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_G&Object&Class
: super core::Object::•()
;
}
abstract class _G&Object&Class&Mixin = self::_G&Object&Class with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_G&Object&Class&Mixin
: super self::_G&Object&Class::•()
;
}
class G extends self::_G&Object&Class&Mixin {
synthetic constructor •() → self::G
: super self::_G&Object&Class&Mixin::•()
;
}

View file

@ -0,0 +1,149 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:6:7: Error: Class 'SealedClass' can't be used as a mixin.
// class A with SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:9:7: Error: Class 'SealedClass' can't be used as a mixin.
// class B with SealedClass, SealedMixin {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'Class' can't be used as a mixin.
// class C with Class, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'SealedClass' can't be used as a mixin.
// class C with Class, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:13:7: Error: Class 'Class' can't be used as a mixin.
// class D with Class, SealedMixin {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:16:7: Error: Class 'SealedClass' can't be used as a mixin.
// class E with Mixin, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:20:7: Error: Class 'Class' can't be used as a mixin.
// class G with Class, Mixin {}
// ^
//
import self as self;
import "dart:core" as core;
abstract sealed class SealedClass extends core::Object {
synthetic constructor •() → self::SealedClass
: super core::Object::•()
;
}
abstract class _A&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_A&Object&SealedClass
: super core::Object::•()
;
}
class A extends self::_A&Object&SealedClass {
synthetic constructor •() → self::A
: super self::_A&Object&SealedClass::•()
;
}
abstract sealed class SealedMixin extends core::Object /*isMixinDeclaration*/ {
}
abstract class _B&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_B&Object&SealedClass
: super core::Object::•()
;
}
abstract class _B&Object&SealedClass&SealedMixin = self::_B&Object&SealedClass with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_B&Object&SealedClass&SealedMixin
: super self::_B&Object&SealedClass::•()
;
}
class B extends self::_B&Object&SealedClass&SealedMixin {
synthetic constructor •() → self::B
: super self::_B&Object&SealedClass&SealedMixin::•()
;
}
class Class extends core::Object {
synthetic constructor •() → self::Class
: super core::Object::•()
;
}
abstract class _C&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&Class
: super core::Object::•()
;
}
abstract class _C&Object&Class&SealedClass = self::_C&Object&Class with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&Class&SealedClass
: super self::_C&Object&Class::•()
;
}
class C extends self::_C&Object&Class&SealedClass {
synthetic constructor •() → self::C
: super self::_C&Object&Class&SealedClass::•()
;
}
abstract class _D&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_D&Object&Class
: super core::Object::•()
;
}
abstract class _D&Object&Class&SealedMixin = self::_D&Object&Class with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_D&Object&Class&SealedMixin
: super self::_D&Object&Class::•()
;
}
class D extends self::_D&Object&Class&SealedMixin {
synthetic constructor •() → self::D
: super self::_D&Object&Class&SealedMixin::•()
;
}
abstract class Mixin extends core::Object /*isMixinDeclaration*/ {
}
abstract class _E&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&Mixin
: super core::Object::•()
;
}
abstract class _E&Object&Mixin&SealedClass = self::_E&Object&Mixin with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&Mixin&SealedClass
: super self::_E&Object&Mixin::•()
;
}
class E extends self::_E&Object&Mixin&SealedClass {
synthetic constructor •() → self::E
: super self::_E&Object&Mixin&SealedClass::•()
;
}
abstract class _F&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_F&Object&Mixin
: super core::Object::•()
;
}
abstract class _F&Object&Mixin&SealedMixin = self::_F&Object&Mixin with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_F&Object&Mixin&SealedMixin
: super self::_F&Object&Mixin::•()
;
}
class F extends self::_F&Object&Mixin&SealedMixin {
synthetic constructor •() → self::F
: super self::_F&Object&Mixin&SealedMixin::•()
;
}
abstract class _G&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_G&Object&Class
: super core::Object::•()
;
}
abstract class _G&Object&Class&Mixin = self::_G&Object&Class with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_G&Object&Class&Mixin
: super self::_G&Object&Class::•()
;
}
class G extends self::_G&Object&Class&Mixin {
synthetic constructor •() → self::G
: super self::_G&Object&Class&Mixin::•()
;
}

View file

@ -0,0 +1,140 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:6:7: Error: Class 'SealedClass' can't be used as a mixin.
// class A with SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:9:7: Error: Class 'SealedClass' can't be used as a mixin.
// class B with SealedClass, SealedMixin {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'Class' can't be used as a mixin.
// class C with Class, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'SealedClass' can't be used as a mixin.
// class C with Class, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:13:7: Error: Class 'Class' can't be used as a mixin.
// class D with Class, SealedMixin {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:16:7: Error: Class 'SealedClass' can't be used as a mixin.
// class E with Mixin, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:20:7: Error: Class 'Class' can't be used as a mixin.
// class G with Class, Mixin {}
// ^
//
import self as self;
import "dart:core" as core;
abstract sealed class SealedClass extends core::Object {
synthetic constructor •() → self::SealedClass
;
}
abstract class _A&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_A&Object&SealedClass
: super core::Object::•()
;
}
class A extends self::_A&Object&SealedClass {
synthetic constructor •() → self::A
;
}
abstract sealed class SealedMixin extends core::Object /*isMixinDeclaration*/ {
}
abstract class _B&Object&SealedClass = core::Object with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_B&Object&SealedClass
: super core::Object::•()
;
}
abstract class _B&Object&SealedClass&SealedMixin = self::_B&Object&SealedClass with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_B&Object&SealedClass&SealedMixin
: super self::_B&Object&SealedClass::•()
;
}
class B extends self::_B&Object&SealedClass&SealedMixin {
synthetic constructor •() → self::B
;
}
class Class extends core::Object {
synthetic constructor •() → self::Class
;
}
abstract class _C&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&Class
: super core::Object::•()
;
}
abstract class _C&Object&Class&SealedClass = self::_C&Object&Class with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&Class&SealedClass
: super self::_C&Object&Class::•()
;
}
class C extends self::_C&Object&Class&SealedClass {
synthetic constructor •() → self::C
;
}
abstract class _D&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_D&Object&Class
: super core::Object::•()
;
}
abstract class _D&Object&Class&SealedMixin = self::_D&Object&Class with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_D&Object&Class&SealedMixin
: super self::_D&Object&Class::•()
;
}
class D extends self::_D&Object&Class&SealedMixin {
synthetic constructor •() → self::D
;
}
abstract class Mixin extends core::Object /*isMixinDeclaration*/ {
}
abstract class _E&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&Mixin
: super core::Object::•()
;
}
abstract class _E&Object&Mixin&SealedClass = self::_E&Object&Mixin with self::SealedClass /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&Mixin&SealedClass
: super self::_E&Object&Mixin::•()
;
}
class E extends self::_E&Object&Mixin&SealedClass {
synthetic constructor •() → self::E
;
}
abstract class _F&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_F&Object&Mixin
: super core::Object::•()
;
}
abstract class _F&Object&Mixin&SealedMixin = self::_F&Object&Mixin with self::SealedMixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_F&Object&Mixin&SealedMixin
: super self::_F&Object&Mixin::•()
;
}
class F extends self::_F&Object&Mixin&SealedMixin {
synthetic constructor •() → self::F
;
}
abstract class _G&Object&Class = core::Object with self::Class /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_G&Object&Class
: super core::Object::•()
;
}
abstract class _G&Object&Class&Mixin = self::_G&Object&Class with self::Mixin /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_G&Object&Class&Mixin
: super self::_G&Object&Class::•()
;
}
class G extends self::_G&Object&Class&Mixin {
synthetic constructor •() → self::G
;
}

View file

@ -0,0 +1,149 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:6:7: Error: Class 'SealedClass' can't be used as a mixin.
// class A with SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:9:7: Error: Class 'SealedClass' can't be used as a mixin.
// class B with SealedClass, SealedMixin {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'Class' can't be used as a mixin.
// class C with Class, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:12:7: Error: Class 'SealedClass' can't be used as a mixin.
// class C with Class, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:13:7: Error: Class 'Class' can't be used as a mixin.
// class D with Class, SealedMixin {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:16:7: Error: Class 'SealedClass' can't be used as a mixin.
// class E with Mixin, SealedClass {}
// ^
//
// pkg/front_end/testcases/sealed_class/sealed_class_as_mixin.dart:20:7: Error: Class 'Class' can't be used as a mixin.
// class G with Class, Mixin {}
// ^
//
import self as self;
import "dart:core" as core;
abstract sealed class SealedClass extends core::Object {
synthetic constructor •() → self::SealedClass
: super core::Object::•()
;
}
abstract class _A&Object&SealedClass extends core::Object implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_A&Object&SealedClass
: super core::Object::•()
;
}
class A extends self::_A&Object&SealedClass {
synthetic constructor •() → self::A
: super self::_A&Object&SealedClass::•()
;
}
abstract sealed class SealedMixin extends core::Object /*isMixinDeclaration*/ {
}
abstract class _B&Object&SealedClass extends core::Object implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_B&Object&SealedClass
: super core::Object::•()
;
}
abstract class _B&Object&SealedClass&SealedMixin extends self::_B&Object&SealedClass implements self::SealedMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_B&Object&SealedClass&SealedMixin
: super self::_B&Object&SealedClass::•()
;
}
class B extends self::_B&Object&SealedClass&SealedMixin {
synthetic constructor •() → self::B
: super self::_B&Object&SealedClass&SealedMixin::•()
;
}
class Class extends core::Object {
synthetic constructor •() → self::Class
: super core::Object::•()
;
}
abstract class _C&Object&Class extends core::Object implements self::Class /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&Class
: super core::Object::•()
;
}
abstract class _C&Object&Class&SealedClass extends self::_C&Object&Class implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&Class&SealedClass
: super self::_C&Object&Class::•()
;
}
class C extends self::_C&Object&Class&SealedClass {
synthetic constructor •() → self::C
: super self::_C&Object&Class&SealedClass::•()
;
}
abstract class _D&Object&Class extends core::Object implements self::Class /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_D&Object&Class
: super core::Object::•()
;
}
abstract class _D&Object&Class&SealedMixin extends self::_D&Object&Class implements self::SealedMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_D&Object&Class&SealedMixin
: super self::_D&Object&Class::•()
;
}
class D extends self::_D&Object&Class&SealedMixin {
synthetic constructor •() → self::D
: super self::_D&Object&Class&SealedMixin::•()
;
}
abstract class Mixin extends core::Object /*isMixinDeclaration*/ {
}
abstract class _E&Object&Mixin extends core::Object implements self::Mixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&Mixin
: super core::Object::•()
;
}
abstract class _E&Object&Mixin&SealedClass extends self::_E&Object&Mixin implements self::SealedClass /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&Mixin&SealedClass
: super self::_E&Object&Mixin::•()
;
}
class E extends self::_E&Object&Mixin&SealedClass {
synthetic constructor •() → self::E
: super self::_E&Object&Mixin&SealedClass::•()
;
}
abstract class _F&Object&Mixin extends core::Object implements self::Mixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_F&Object&Mixin
: super core::Object::•()
;
}
abstract class _F&Object&Mixin&SealedMixin extends self::_F&Object&Mixin implements self::SealedMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_F&Object&Mixin&SealedMixin
: super self::_F&Object&Mixin::•()
;
}
class F extends self::_F&Object&Mixin&SealedMixin {
synthetic constructor •() → self::F
: super self::_F&Object&Mixin&SealedMixin::•()
;
}
abstract class _G&Object&Class extends core::Object implements self::Class /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_G&Object&Class
: super core::Object::•()
;
}
abstract class _G&Object&Class&Mixin extends self::_G&Object&Class implements self::Mixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_G&Object&Class&Mixin
: super self::_G&Object&Class::•()
;
}
class G extends self::_G&Object&Class&Mixin {
synthetic constructor •() → self::G
: super self::_G&Object&Class&Mixin::•()
;
}

View file

@ -202,6 +202,7 @@ regress/issue_39091_1: FormatterCrash
regress/issue_41265.crash: Crash
regress/issue_41265.crash: FormatterCrash
sealed_class/sealed_abstract_class_declaration: FormatterCrash
sealed_class/sealed_class_as_mixin: FormatterCrash
sealed_class/sealed_class_declaration: FormatterCrash
sealed_class/sealed_mixin_declaration: FormatterCrash
super_parameters/issue47741: FormatterCrash

View file

@ -6,16 +6,18 @@
// Error when attempting to mix in a sealed class outside of library.
import 'sealed_class_as_mixin_in_lib_error_test.dart';
import 'sealed_class_as_mixin_lib.dart';
abstract class OutsideA with SealedClass {}
// ^
// [analyzer] unspecified
// [cfe] Class 'SealedClass' can't be used as a mixin.
// [cfe] Sealed class 'SealedClass' can't be extended, implemented, or mixed in outside of its library.
class OutsideB with SealedClass {
// ^
// [analyzer] unspecified
// [cfe] Class 'SealedClass' can't be used as a mixin.
// [cfe] Sealed class 'SealedClass' can't be extended, implemented, or mixed in outside of its library.
@override
int foo = 2;
@ -27,4 +29,29 @@ class OutsideB with SealedClass {
abstract class OutsideC = Object with SealedClass;
// ^
// [analyzer] unspecified
// [cfe] Class 'SealedClass' can't be used as a mixin.
// [cfe] Sealed class 'SealedClass' can't be extended, implemented, or mixed in outside of its library.
abstract class OutsideD with SealedClass, Class {}
// ^
// [analyzer] unspecified
// [cfe] Class 'Class' can't be used as a mixin.
// [cfe] Class 'SealedClass' can't be used as a mixin.
// [cfe] Sealed class 'SealedClass' can't be extended, implemented, or mixed in outside of its library.
class OutsideE with Class, SealedMixin {}
// ^
// [analyzer] unspecified
// [cfe] Class 'Class' can't be used as a mixin.
// [cfe] Sealed mixin 'SealedMixin' can't be mixed in outside of its library.
abstract class OutsideF with Mixin, SealedClass {}
// ^
// [analyzer] unspecified
// [cfe] Class 'SealedClass' can't be used as a mixin.
// [cfe] Sealed class 'SealedClass' can't be extended, implemented, or mixed in outside of its library.
class OutsideG with Mixin, Class {}
// ^
// [analyzer] unspecified
// [cfe] Class 'Class' can't be used as a mixin.

View file

@ -12,16 +12,19 @@ sealed class SealedClass {
int nonAbstractBar(int value) => value + 100;
int bar(int value);
}
sealed mixin SealedMixin {}
class Class {}
mixin Mixin {}
abstract class A with SealedClass {}
// ^
// ^
// [analyzer] unspecified
// [cfe] unspecified
// [cfe] Class 'SealedClass' can't be used as a mixin.
class B with SealedClass {
// ^
// ^
// [analyzer] unspecified
// [cfe] unspecified
// [cfe] Class 'SealedClass' can't be used as a mixin.
@override
int nonAbstractFoo = 100;
@ -33,6 +36,27 @@ class B with SealedClass {
}
abstract class C = Object with SealedClass;
// ^
// ^
// [analyzer] unspecified
// [cfe] unspecified
// [cfe] Class 'SealedClass' can't be used as a mixin.
abstract class D with SealedClass, Class {}
// ^
// [analyzer] unspecified
// [cfe] Class 'Class' can't be used as a mixin.
// [cfe] Class 'SealedClass' can't be used as a mixin.
class E with Class, SealedMixin {}
// ^
// [analyzer] unspecified
// [cfe] Class 'Class' can't be used as a mixin.
abstract class F with Mixin, SealedClass {}
// ^
// [analyzer] unspecified
// [cfe] Class 'SealedClass' can't be used as a mixin.
class G with Mixin, Class {}
// ^
// [analyzer] unspecified
// [cfe] Class 'Class' can't be used as a mixin.

View file

@ -0,0 +1,15 @@
// 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.
// SharedOptions=--enable-experiment=sealed-class
sealed class SealedClass {
int nonAbstractFoo = 0;
abstract int foo;
int nonAbstractBar(int value) => value + 100;
int bar(int value);
}
sealed mixin SealedMixin {}
class Class {}
mixin Mixin {}