Fix crash when non-class is given as supertype
Before this CL this code would crash fasta:
```
class A extends Function() {}
```
Now it produces a compile time error instead:
```
t.dart:1:7: Error: Can't use a function type as supertype.
class A extends Function() {}
^
```
(technically it already issued it, but crashed before doing so).
Bug: #36824
Change-Id: Iaeb9dc8390d4a9ab7b473848c3311f08a4dbba6d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/101283
Commit-Queue: Jens Johansen <jensj@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 28b8b90..09cd1c9 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -166,9 +166,16 @@
fileUri);
actualCls.supertype = null;
}
+ if (actualCls.supertype == null && supertype is! KernelNamedTypeBuilder) {
+ supertype = null;
+ }
mixedInType = checkSupertype(mixedInType);
actualCls.mixedInType =
mixedInType?.buildMixedInType(library, charOffset, fileUri);
+ if (actualCls.mixedInType == null &&
+ mixedInType is! KernelNamedTypeBuilder) {
+ mixedInType = null;
+ }
actualCls.isMixinDeclaration = isMixinDeclaration;
// TODO(ahe): If `cls.supertype` is null, and this isn't Object, report a
// compile-time error.
@@ -305,7 +312,7 @@
List<Declaration> computeDirectSupertypes(ClassBuilder objectClass) {
final List<Declaration> result = <Declaration>[];
- final KernelNamedTypeBuilder supertype = this.supertype;
+ final KernelTypeBuilder supertype = this.supertype;
if (supertype != null) {
result.add(supertype.declaration);
} else if (objectClass != this) {
@@ -314,11 +321,11 @@
final List<KernelTypeBuilder> interfaces = this.interfaces;
if (interfaces != null) {
for (int i = 0; i < interfaces.length; i++) {
- KernelNamedTypeBuilder interface = interfaces[i];
+ KernelTypeBuilder interface = interfaces[i];
result.add(interface.declaration);
}
}
- final KernelNamedTypeBuilder mixedInType = this.mixedInType;
+ final KernelTypeBuilder mixedInType = this.mixedInType;
if (mixedInType != null) {
result.add(mixedInType.declaration);
}