Files
kotlin-fork/compiler/testData/diagnostics
Simon Ogorodnik 82611ad124 FIR. BI: Fix stub type leakage in builder inference
Previously, updateTypeInBuilderInference was calling
updateTypeFromSmartcast to actually perform type update in
implicit receiver after stub types was inferred
Such action results in creation of following FIR:

FirSmartCastExpression(
    original=FQAE(FirImplicitThisReference, typeRef=R|Inv<Stub>|)
    typeRef=R|Inv<String>|
)

in receiver position during completion of calls

However, it wasn't the case in general situation due to
action of FirStubTypeTransformer, which, in turn visits and updates
type ref inside original expression, but only if there was at
least one call (that was completed) using that implicit receiver
As after such type update updateTypeFromSmartcast function does
nothing

Yet in situation, when there was only partially resolved calls
referencing that implicit receiver we actually create smart-cast
expression and don't update type

The change just removes usage of updateTypeFromSmartcast and
replaces is with direct type update
We still mutate state of implicit receiver, potentially
improperly, it should be addressed in future

^KT-54708
^KT-58365 Fixed
2023-05-04 12:46:28 +00:00
..

Diagnostic tests format specification

Each diagnostic test consists of a single .kt file containing the code of one or several Kotlin or Java source files. Each diagnostic, be it a warning or an error, is marked in the following way:

<!DIAGNOSTIC_FACTORY_NAME!>element<!>

where DIAGNOSTIC_FACTORY_NAME is the name of the diagnostic which is usually one of the constants in one of Errors* classes.

To test not only the presence of the diagnostic but also the arguments which will be rendered to the user, provide string representations of all of them in the parentheses delimited with ; after the diagnostic name:

return <!TYPE_MISMATCH(String; Nothing)!>"OK"<!>

Note: if you're unsure what text should be added for the parameters, just leave the parentheses empty and the failed test will present the actual values in the assertion message.

Directives

Several directives can be added to the beginning of a test file with the following syntax:

// !DIRECTIVE

1. DIAGNOSTICS

This directive allows to exclude some irrelevant diagnostics (e.g. unused parameter) from a certain test or to include others.

The syntax is

'([ + - ] DIAGNOSTIC_FACTORY_NAME | ERROR | WARNING | INFO ) +'

where

  • + means 'include';

  • - means 'exclude'.

    Directives are applied in the order of appearance, i.e. +FOO -BAR means include FOO but not BAR.

Usage:

// !DIAGNOSTICS: -WARNING +CAST_NEVER_SUCCEEDS

// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE

2. CHECK_TYPE

The directive adds the following declarations to the file:

fun <T> checkSubtype(t: T) = t

class Inv<T>
fun <E> Inv<E>._() {}
infix fun <T> T.checkType(f: Inv<T>.() -> Unit) {}

With that, an exact type of an expression can be checked in the following way:

fun test(expr: A) {
   expr checkType { _<A>() }
}

CHECK_TYPE directive also disables UNDERSCORE_USAGE_WITHOUT_BACKTICKS diagnostics output.

Usage:

// !CHECK_TYPE

3. FILE

The directive lets you compose a test consisting of several files in one actual file.

Usage:

// FILE: A.java
/* Java code */

// FILE: B.kt
/* Kotlin code */

4. LANGUAGE

This directive lets you enable or disable certain language features. Language features are named as enum entries of the class LanguageFeature. Each feature can be enabled with +, disabled with -, or enabled with warning with warn:.

Usage:

// !LANGUAGE: -TopLevelSealedInheritance

// !LANGUAGE: +TypeAliases -LocalDelegatedProperties

// !LANGUAGE: warn:Coroutines

5. API_VERSION

This directive emulates the behavior of the -api-version command line option, disallowing to use declarations annotated with @SinceKotlin(X) where X is greater than the specified API version. Note that if this directive is present, the NEWER_VERSION_IN_SINCE_KOTLIN diagnostic is automatically disabled, unless the "!DIAGNOSTICS" directive is present.

Usage:

// !API_VERSION: 1.0

6. RENDER_DIAGNOSTICS_MESSAGES

This directive forces Diagnostic printer prints parametrized diagnostics with all parameters.

Usage:

// !RENDER_DIAGNOSTICS_MESSAGES