diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java index 1a5a6affdb7..513e99235bb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java @@ -212,11 +212,10 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase public void addSupertype(@NotNull JetType supertype) { - if (!ErrorUtils.isErrorType(supertype)) { - if (TypeUtils.getClassDescriptor(supertype) != null) { - // See the Errors.SUPERTYPE_NOT_A_CLASS_OR_TRAIT - supertypes.add(supertype); - } + assert !ErrorUtils.isErrorType(supertype) : "Error types must be filtered out in DescriptorResolver"; + if (TypeUtils.getClassDescriptor(supertype) != null) { + // See the Errors.SUPERTYPE_NOT_A_CLASS_OR_TRAIT + supertypes.add(supertype); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index 863b22e4edd..ff1147696d2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -130,25 +130,33 @@ public class DescriptorResolver { ) { List supertypes = Lists.newArrayList(); List delegationSpecifiers = jetClass.getDelegationSpecifiers(); - boolean isEnum = classDescriptor.getKind() == ClassKind.ENUM_CLASS; - if (delegationSpecifiers.isEmpty()) { - if (!isEnum) { - supertypes.add(getDefaultSupertype(jetClass, trace)); - } + Collection declaredSupertypes = resolveDelegationSpecifiers( + scope, + delegationSpecifiers, + typeResolver, trace, false); + + for (JetType declaredSupertype : declaredSupertypes) { + addValidSupertype(supertypes, declaredSupertype); } - else { - Collection declaredSupertypes = resolveDelegationSpecifiers( - scope, - delegationSpecifiers, - typeResolver, trace, false); - supertypes.addAll(declaredSupertypes); - } - if (isEnum && !containsClass(supertypes)) { + + if (classDescriptor.getKind() == ClassKind.ENUM_CLASS && !containsClass(supertypes)) { supertypes.add(0, JetStandardLibrary.getInstance().getEnumType(classDescriptor.getDefaultType())); } + + if (supertypes.isEmpty()) { + JetType defaultSupertype = getDefaultSupertype(jetClass, trace); + addValidSupertype(supertypes, defaultSupertype); + } + return supertypes; } + private static void addValidSupertype(List supertypes, JetType declaredSupertype) { + if (!ErrorUtils.isErrorType(declaredSupertype)) { + supertypes.add(declaredSupertype); + } + } + private boolean containsClass(Collection result) { for (JetType type : result) { ClassifierDescriptor descriptor = type.getConstructor().getDeclarationDescriptor(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java index b482f56421c..f223213dbee 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java @@ -54,7 +54,8 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes private static final Predicate VALID_SUPERTYPE = new Predicate() { @Override public boolean apply(JetType type) { - return !ErrorUtils.isErrorType(type) && (TypeUtils.getClassDescriptor(type) != null); + assert !ErrorUtils.isErrorType(type) : "Error types must be filtered out in DescriptorResolver"; + return TypeUtils.getClassDescriptor(type) != null; } }; private final ResolveSession resolveSession; diff --git a/compiler/testData/diagnostics/tests/subtyping/kt2744.kt b/compiler/testData/diagnostics/tests/subtyping/kt2744.kt new file mode 100644 index 00000000000..83030b96456 --- /dev/null +++ b/compiler/testData/diagnostics/tests/subtyping/kt2744.kt @@ -0,0 +1,3 @@ +class X : S + +fun f(l: List) {} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index b7127f17a24..a01e4041bbe 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -15,13 +15,16 @@ */ package org.jetbrains.jet.checkers; +import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestSuite; + +import java.io.File; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.TestMetadata; -import java.io.File; +import org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve; /** This class is generated by {@link org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve}. DO NOT MODIFY MANUALLY */ @InnerTestClasses({JetDiagnosticsTestGenerated.Tests.class, JetDiagnosticsTestGenerated.Script.class}) @@ -3220,6 +3223,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/subtyping/kt2069.kt"); } + @TestMetadata("kt2744.kt") + public void testKt2744() throws Exception { + doTest("compiler/testData/diagnostics/tests/subtyping/kt2744.kt"); + } + @TestMetadata("kt304.kt") public void testKt304() throws Exception { doTest("compiler/testData/diagnostics/tests/subtyping/kt304.kt");