Skip to content

Commit

Permalink
[FE 1.0] Check callable reference return type safety during resolution
Browse files Browse the repository at this point in the history
^KT-51844
^KT-52503 Fixed
  • Loading branch information
petukhovv authored and Space committed May 26, 2022
1 parent 1adc50b commit 9aef691
Show file tree
Hide file tree
Showing 20 changed files with 140 additions and 33 deletions.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.types.error.LazyWrappedTypeComputationException;

public class ReenteringLazyValueComputationException extends RuntimeException {
public class ReenteringLazyValueComputationException extends LazyWrappedTypeComputationException {
public ReenteringLazyValueComputationException() {
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.error.ErrorScopeKind
import org.jetbrains.kotlin.types.error.ErrorUtils
import org.jetbrains.kotlin.types.error.ErrorTypeKind
import org.jetbrains.kotlin.types.error.LazyWrappedTypeComputationException
import org.jetbrains.kotlin.types.expressions.CoercionStrategy
import org.jetbrains.kotlin.types.typeUtil.isUnit
import org.jetbrains.kotlin.utils.SmartList
Expand Down Expand Up @@ -239,8 +240,15 @@ class CallableReferencesCandidateFactory(
// lower(Unit!) = Unit
val returnExpectedType = inputOutputTypes.outputType

fun isReturnTypeNonUnitSafe(): Boolean =
try {
descriptor.returnType?.isUnit() == false
} catch (e: LazyWrappedTypeComputationException) {
false
}

val coercion =
if (returnExpectedType.isUnit() && descriptor.returnType?.isUnit() == false)
if (returnExpectedType.isUnit() && isReturnTypeNonUnitSafe())
CoercionStrategy.COERCION_TO_UNIT
else
CoercionStrategy.NO_COERCION
Expand Down
15 changes: 15 additions & 0 deletions compiler/testData/codegen/box/callableReference/kt51844.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// WITH_STDLIB

abstract class Foo {
abstract fun contains(x: Int);
}

// ERROR: Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly
fun Foo.contains(vararg xs: Int) = xs.forEach(this::contains)

fun box(): String {
object : Foo() {
override fun contains(x: Int) {}
}.contains(1)
return "OK"
}
16 changes: 16 additions & 0 deletions compiler/testData/diagnostics/tests/callableReference/kt52503.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// FIR_IDENTICAL
// WITH_STDLIB

abstract class Foo

object A {
fun Foo.contains(vararg xs: Int) = // 1
xs.forEach(this::<!EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED!>contains<!>) // resolved to (2) in 1.7.0-RC, should be error "Type checking has run into a recursive problem"
}

fun Any.contains(vararg xs: Int) {} // 2

fun box(): String {
object : Foo() {}.contains(1)
return "OK"
}
19 changes: 19 additions & 0 deletions compiler/testData/diagnostics/tests/callableReference/kt52503.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package

public fun box(): kotlin.String
public fun kotlin.Any.contains(/*0*/ vararg xs: kotlin.Int /*kotlin.IntArray*/): kotlin.Unit

public object A {
private constructor A()
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
public final fun Foo.contains(/*0*/ vararg xs: kotlin.Int /*kotlin.IntArray*/): kotlin.Unit
}

public abstract class Foo {
public constructor Foo()
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
}
31 changes: 0 additions & 31 deletions compiler/testData/diagnostics/tests/platformTypes/kt50877.fir.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// FULL_JDK
// WITH_STDLIB

Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/

package org.jetbrains.kotlin.types.error

abstract class LazyWrappedTypeComputationException : RuntimeException()

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 9aef691

Please sign in to comment.