diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AlternativeSignatureData.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AlternativeSignatureData.java
index 4c7d42e0681..e84ce3b18c9 100644
--- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AlternativeSignatureData.java
+++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AlternativeSignatureData.java
@@ -296,14 +296,18 @@ class AlternativeSignatureData {
else {
JetTypeConstraint constraint =
findTypeParameterConstraint(altFunDeclaration, pd.getName(), upperBoundIndex);
- assert constraint != null; // TODO fail more properly
- JetTypeReference boundTypeReference = constraint.getBoundTypeReference();
- assert boundTypeReference != null;
- altTypeElement = boundTypeReference.getTypeElement();
+ if (constraint == null) {
+ fail("Upper bound #%d for type parameter %s is missing", upperBoundIndex, pd.getName());
+ }
+ //noinspection ConstantConditions
+ altTypeElement = constraint.getBoundTypeReference().getTypeElement();
}
altParamDescriptor.addUpperBound(computeType(altTypeElement, upperBound));
upperBoundIndex++;
}
+ if (findTypeParameterConstraint(altFunDeclaration, pd.getName(), upperBoundIndex) != null) {
+ fail("Extra upper bound #%d for type parameter %s", upperBoundIndex, pd.getName());
+ }
altParamDescriptor.setInitialized();
altTypeParameters.add(altParamDescriptor);
diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.java b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.java
new file mode 100644
index 00000000000..d9155efb6a0
--- /dev/null
+++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.java
@@ -0,0 +1,10 @@
+package test;
+
+import jet.runtime.typeinfo.KotlinSignature;
+
+public class ExtraUpperBound {
+ @KotlinSignature("fun foo() : String where A : Cloneable")
+ public String foo() {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.kt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.kt
new file mode 100644
index 00000000000..f254cca20bd
--- /dev/null
+++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.kt
@@ -0,0 +1,9 @@
+package test
+
+import java.util.*
+
+public open class ExtraUpperBound : Object() {
+ public open fun foo() : String? {
+ throw UnsupportedOperationException()
+ }
+}
diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.txt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.txt
new file mode 100644
index 00000000000..9ab08656259
--- /dev/null
+++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.txt
@@ -0,0 +1,6 @@
+namespace test
+
+public open class test.ExtraUpperBound : java.lang.Object {
+ public final /*constructor*/ fun (): test.ExtraUpperBound
+ public open fun *0*/ A : java.lang.Runnable?>foo(): jet.String?
+}
diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.java b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.java
new file mode 100644
index 00000000000..a32c5b2a4f4
--- /dev/null
+++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.java
@@ -0,0 +1,10 @@
+package test;
+
+import jet.runtime.typeinfo.KotlinSignature;
+
+public class MissingUpperBound {
+ @KotlinSignature("fun foo() : String")
+ public String foo() {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.kt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.kt
new file mode 100644
index 00000000000..60b9a7b62ab
--- /dev/null
+++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.kt
@@ -0,0 +1,9 @@
+package test
+
+import java.util.*
+
+public open class MissingUpperBound : Object() {
+ public open fun foo() : String? where A : Cloneable? {
+ throw UnsupportedOperationException()
+ }
+}
diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.txt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.txt
new file mode 100644
index 00000000000..9fab2b1afde
--- /dev/null
+++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.txt
@@ -0,0 +1,6 @@
+namespace test
+
+public open class test.MissingUpperBound : java.lang.Object {
+ public final /*constructor*/ fun (): test.MissingUpperBound
+ public open fun *0*/ A : java.lang.Cloneable? & java.lang.Runnable?>foo(): jet.String?
+}