diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 1db48c9188c..f2fa84c13c3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -385,7 +385,7 @@ public interface Errors { DiagnosticFactory0 DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED = DiagnosticFactory0.create(WARNING); DiagnosticFactory1 TYPE_PARAMETER_AS_REIFIED = DiagnosticFactory1.create(ERROR); - DiagnosticFactory1 REIFIED_TYPE_NOTHING_SUBSTITUTION = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 REIFIED_TYPE_FORBIDDEN_SUBSTITUTION = DiagnosticFactory1.create(ERROR); // Type inference diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index 85c0a8050c1..39b1fd562c5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -486,7 +486,7 @@ public class DefaultErrorMessages { MAP.put(TYPE_PARAMETER_AS_REIFIED, "Cannot use ''{0}'' as reified type parameter. Use a class instead.", NAME); MAP.put(REIFIED_TYPE_PARAMETER_NO_INLINE, "Only type parameters of inline functions can be reified"); - MAP.put(REIFIED_TYPE_NOTHING_SUBSTITUTION, "Cannot use ''{0}'' as reified type parameter", RENDER_TYPE); + MAP.put(REIFIED_TYPE_FORBIDDEN_SUBSTITUTION, "Cannot use ''{0}'' as reified type parameter", RENDER_TYPE); MAP.put(SUPERTYPES_FOR_ANNOTATION_CLASS, "Annotation class cannot have supertypes"); MAP.put(MISSING_VAL_ON_ANNOTATION_PARAMETER, "'val' keyword is missing on annotation parameter"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ReifiedTypeParameterSubstitutionCheck.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ReifiedTypeParameterSubstitutionCheck.java index 4079392d62d..7668e3a1f63 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ReifiedTypeParameterSubstitutionCheck.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ReifiedTypeParameterSubstitutionCheck.java @@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.resolve.calls.context.BasicCallResolutionContext; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.TypesPackage; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.util.Map; @@ -49,8 +50,8 @@ public class ReifiedTypeParameterSubstitutionCheck implements CallResolverExtens Errors.TYPE_PARAMETER_AS_REIFIED.on(getCallElement(context), parameter) ); } - else if (KotlinBuiltIns.getInstance().isNothingOrNullableNothing(argument)) { - context.trace.report(Errors.REIFIED_TYPE_NOTHING_SUBSTITUTION.on(getCallElement(context), argument)); + else if (KotlinBuiltIns.getInstance().isNothingOrNullableNothing(argument) || TypesPackage.isDynamic(argument)) { + context.trace.report(Errors.REIFIED_TYPE_FORBIDDEN_SUBSTITUTION.on(getCallElement(context), argument)); } } } diff --git a/compiler/testData/diagnostics/tests/dynamicTypes/reified.kt b/compiler/testData/diagnostics/tests/dynamicTypes/reified.kt new file mode 100644 index 00000000000..2bdb3feb1a8 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dynamicTypes/reified.kt @@ -0,0 +1,15 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER + +// MODULE[js]: m1 +// FILE: k.kt + +fun foo(t: T) {} +class C(t: T) + +fun test(d: dynamic) { + foo(d) + foo(d) + + C(d) + C(d) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/dynamicTypes/reified.txt b/compiler/testData/diagnostics/tests/dynamicTypes/reified.txt new file mode 100644 index 00000000000..017c9b122a2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dynamicTypes/reified.txt @@ -0,0 +1,11 @@ +package + +internal fun foo(/*0*/ t: T): kotlin.Unit +internal fun test(/*0*/ d: dynamic): kotlin.Unit + +internal final class C { + public constructor C(/*0*/ t: T) + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/reified/reifiedNothingSubstitution.kt b/compiler/testData/diagnostics/testsWithStdLib/reified/reifiedNothingSubstitution.kt index 13751a433b8..076a03f79cf 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/reified/reifiedNothingSubstitution.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/reified/reifiedNothingSubstitution.kt @@ -3,12 +3,12 @@ inline fun foo(block: () -> T): String = block().toString() fun box() { - val a = array(null!!) - val b = Array(5) { null!! } - val c = foo() { null!! } + val a = array(null!!) + val b = Array(5) { null!! } + val c = foo() { null!! } val d = foo { null!! } - val e = foo { "1" as Nothing } - val e1 = foo { "1" as Nothing? } + val e = foo { "1" as Nothing } + val e1 = foo { "1" as Nothing? } - val f = javaClass() + val f = javaClass() } diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 4c6661c1687..b1952205fa8 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -3836,6 +3836,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("reified.kt") + public void testReified() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dynamicTypes/reified.kt"); + doTest(fileName); + } + @TestMetadata("smartCast.kt") public void testSmartCast() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dynamicTypes/smartCast.kt");