From 3bb2ea10b630aef21c477a31065ca73391247180 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 28 Feb 2024 15:55:34 +0100 Subject: [PATCH] K2: add inline JVM target version checker #KT-60777 Fixed --- .../diagnostics/KtFirDataClassConverters.kt | 8 ++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 6 ++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 7 ++ .../cli/common/FirSessionConstructionUtils.kt | 1 + .../diagnostics/FirJvmDiagnosticsList.kt | 7 ++ .../analysis/diagnostics/jvm/FirJvmErrors.kt | 3 + .../jvm/FirJvmErrorsDefaultMessages.kt | 7 ++ .../jvm/checkers/JvmExpressionCheckers.kt | 1 + ...irJvmInlineTargetQualifiedAccessChecker.kt | 85 +++++++++++++++++++ .../FirNonSuppressibleErrorNames.kt | 1 + .../fir/session/FirJvmSessionFactory.kt | 4 + .../fir/session/FirSessionFactoryHelper.kt | 1 + .../kotlin/fir/java/FirJvmTargetProvider.kt | 14 +++ .../wrongInlineTarget/library/a.kt | 10 ++- .../wrongInlineTarget/output.fir.txt | 64 ++++++++++++++ .../wrongInlineTarget/output.txt | 42 ++++++--- .../wrongInlineTarget/source.kt | 9 ++ .../test/frontend/fir/FirFrontendFacade.kt | 3 + ...tCompileKotlinAgainstCustomBinariesTest.kt | 3 +- 19 files changed, 260 insertions(+), 16 deletions(-) create mode 100644 compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJvmInlineTargetQualifiedAccessChecker.kt create mode 100644 compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJvmTargetProvider.kt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/output.fir.txt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 8faadc1c8da..940cfac4949 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -4884,6 +4884,14 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJvmErrors.INLINE_FROM_HIGHER_PLATFORM) { firDiagnostic -> + InlineFromHigherPlatformImpl( + firDiagnostic.a, + firDiagnostic.b, + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON) { firDiagnostic -> CannotAllUnderImportFromSingletonImpl( firDiagnostic.a, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 008f6ac53cb..df0e0243c62 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -3401,6 +3401,12 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val type: KtType } + interface InlineFromHigherPlatform : KtFirDiagnostic { + override val diagnosticClass get() = InlineFromHigherPlatform::class + val inlinedBytecodeVersion: String + val currentModuleBytecodeVersion: String + } + interface CannotAllUnderImportFromSingleton : KtFirDiagnostic { override val diagnosticClass get() = CannotAllUnderImportFromSingleton::class val objectName: Name diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 6ab5ea0c54d..bebc86343b8 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -4100,6 +4100,13 @@ internal class InefficientEqualsOverridingInValueClassImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.InefficientEqualsOverridingInValueClass +internal class InlineFromHigherPlatformImpl( + override val inlinedBytecodeVersion: String, + override val currentModuleBytecodeVersion: String, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.InlineFromHigherPlatform + internal class CannotAllUnderImportFromSingletonImpl( override val objectName: Name, firDiagnostic: KtPsiDiagnostic, diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt index ebca8bd952f..e0aae908932 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt @@ -115,6 +115,7 @@ fun prepareJvmSessions( }, extensionRegistrars, configuration.languageVersionSettings, + configuration.get(JVMConfigurationKeys.JVM_TARGET, JvmTarget.DEFAULT), configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER), configuration.get(CommonConfigurationKeys.ENUM_WHEN_TRACKER), configuration.get(CommonConfigurationKeys.IMPORT_TRACKER), diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt index ec0d161591b..5f7ea0707f8 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt @@ -193,6 +193,13 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { } } + val INLINE by object : DiagnosticGroup("Inline") { + val INLINE_FROM_HIGHER_PLATFORM by error { + parameter("inlinedBytecodeVersion") + parameter("currentModuleBytecodeVersion") + } + } + val MISC by object : DiagnosticGroup("Misc") { val INAPPLICABLE_JVM_FIELD by error { parameter("message") diff --git a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt index 026593a924c..b15147b21ec 100644 --- a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt +++ b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt @@ -127,6 +127,9 @@ object FirJvmErrors { // Suspension Point val SUSPENSION_POINT_INSIDE_CRITICAL_SECTION: KtDiagnosticFactory1> by error1>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) + // Inline + val INLINE_FROM_HIGHER_PLATFORM: KtDiagnosticFactory2 by error2() + // Misc val INAPPLICABLE_JVM_FIELD: KtDiagnosticFactory1 by error1() val INAPPLICABLE_JVM_FIELD_WARNING: KtDiagnosticFactory1 by warning1() diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt index 59006f945fd..f201803229b 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.ILLEGAL_JV import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.INAPPLICABLE_JVM_FIELD import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.INAPPLICABLE_JVM_FIELD_WARNING import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.INAPPLICABLE_JVM_NAME +import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.INLINE_FROM_HIGHER_PLATFORM import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.INNER_JVM_RECORD import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.INTERFACE_CANT_CALL_DEFAULT_METHOD_VIA_SUPER import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JAVA_MODULE_DOES_NOT_DEPEND_ON_MODULE @@ -303,6 +304,12 @@ object FirJvmErrorsDefaultMessages : BaseDiagnosticRendererFactory() { "The ''{0}'' suspension point is inside a critical section.", DECLARATION_NAME ) + map.put( + INLINE_FROM_HIGHER_PLATFORM, + "Cannot inline bytecode built with {0} into bytecode that is being built with {1}. Please specify proper ''-jvm-target'' option.", + STRING, + STRING + ) map.put( CONCURRENT_HASH_MAP_CONTAINS_OPERATOR, "Method 'contains' from ConcurrentHashMap might have unexpected semantics: it calls 'containsValue' instead of 'containsKey'. " + diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt index bf2c27c38c0..32ca1b4bf50 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt @@ -21,6 +21,7 @@ object JvmExpressionCheckers : ExpressionCheckers() { FirJavaSamInterfaceConstructorReferenceChecker, FirQualifiedAccessJavaNullabilityWarningChecker, FirJvmModuleAccessibilityQualifiedAccessChecker, + FirJvmInlineTargetQualifiedAccessChecker, ) override val propertyAccessExpressionCheckers: Set diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJvmInlineTargetQualifiedAccessChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJvmInlineTargetQualifiedAccessChecker.kt new file mode 100644 index 00000000000..4ad4339418c --- /dev/null +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJvmInlineTargetQualifiedAccessChecker.kt @@ -0,0 +1,85 @@ +/* + * Copyright 2010-2024 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.fir.analysis.jvm.checkers.expression + +import org.jetbrains.kotlin.config.JvmTarget +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirQualifiedAccessExpressionChecker +import org.jetbrains.kotlin.fir.analysis.checkers.isLhsOfAssignment +import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors +import org.jetbrains.kotlin.fir.containingClassLookupTag +import org.jetbrains.kotlin.fir.declarations.utils.isInline +import org.jetbrains.kotlin.fir.declarations.utils.sourceElement +import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression +import org.jetbrains.kotlin.fir.expressions.toReference +import org.jetbrains.kotlin.fir.java.jvmTargetProvider +import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol +import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol +import org.jetbrains.kotlin.fir.symbols.SymbolInternals +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol +import org.jetbrains.kotlin.load.kotlin.FileBasedKotlinClass +import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource +import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement + +object FirJvmInlineTargetQualifiedAccessChecker : FirQualifiedAccessExpressionChecker(MppCheckerKind.Common) { + override fun check(expression: FirQualifiedAccessExpression, context: CheckerContext, reporter: DiagnosticReporter) { + val callableSymbol = expression.calleeReference.toResolvedCallableSymbol() ?: return + if (callableSymbol.origin.fromSource) return + + val isInline = when (callableSymbol) { + is FirFunctionSymbol<*> -> callableSymbol.isInline + is FirPropertySymbol -> { + val accessor = if (expression.isLhsOfAssignment(context)) callableSymbol.setterSymbol else callableSymbol.getterSymbol + accessor != null && accessor.isInline + } + else -> false + } + + if (isInline) { + checkInlineTargetVersion(callableSymbol, context, reporter, expression) + } + } + + private fun checkInlineTargetVersion( + callableSymbol: FirCallableSymbol<*>, + context: CheckerContext, + reporter: DiagnosticReporter, + element: FirElement, + ) { + val currentJvmTarget = context.session.jvmTargetProvider?.jvmTarget ?: return + + val containingClass = callableSymbol.containingClassLookupTag() + val binaryClass = if (containingClass != null) { + val containingClassSymbol = containingClass.toFirRegularClassSymbol(context.session) ?: return + + @OptIn(SymbolInternals::class) + val sourceElement = containingClassSymbol.fir.sourceElement as? KotlinJvmBinarySourceElement ?: return + sourceElement.binaryClass + } else { + val containerSource = callableSymbol.containerSource as? JvmPackagePartSource ?: return + containerSource.knownJvmBinaryClass + } + + val inlinedVersion = (binaryClass as? FileBasedKotlinClass)?.classVersion ?: return + val currentVersion = currentJvmTarget.majorVersion + + if (currentVersion < inlinedVersion) { + reporter.reportOn( + element.toReference(context.session)?.source ?: element.source, + FirJvmErrors.INLINE_FROM_HIGHER_PLATFORM, + JvmTarget.getDescription(inlinedVersion), + JvmTarget.getDescription(currentVersion), + context, + ) + } + } +} diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt index b0290b04aa9..6595e511517 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt @@ -561,6 +561,7 @@ val FIR_NON_SUPPRESSIBLE_ERROR_NAMES: Set = setOf( "INLINE_PROPERTY_WITH_BACKING_FIELD", "ILLEGAL_INLINE_PARAMETER_MODIFIER", "INLINE_SUSPEND_FUNCTION_TYPE_UNSUPPORTED", + "INLINE_FROM_HIGHER_PLATFORM", "CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON", "PACKAGE_CANNOT_BE_IMPORTED", "CANNOT_BE_IMPORTED", diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt index b17c86961ed..6df9b0293d7 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.session +import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.fir.FirModuleData @@ -13,6 +14,7 @@ import org.jetbrains.kotlin.fir.SessionConfiguration import org.jetbrains.kotlin.fir.checkers.registerJvmCheckers import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar +import org.jetbrains.kotlin.fir.java.FirJvmTargetProvider import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.deserialization.JvmClassFileBasedSymbolProvider @@ -88,6 +90,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() { createIncrementalCompilationSymbolProviders: (FirSession) -> FirJvmIncrementalCompilationSymbolProviders?, extensionRegistrars: List, languageVersionSettings: LanguageVersionSettings, + jvmTarget: JvmTarget, lookupTracker: LookupTracker?, enumWhenTracker: EnumWhenTracker?, importTracker: ImportTracker?, @@ -108,6 +111,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() { registerExtraComponents = { it.registerDefaultComponents() it.registerJavaComponents(projectEnvironment.getJavaModuleResolver(), predefinedJavaComponents) + it.register(FirJvmTargetProvider::class, FirJvmTargetProvider(jvmTarget)) registerExtraComponents(it) }, registerExtraCheckers = { it.registerJvmCheckers() }, diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt index f61716b4f46..fbd82d74621 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt @@ -79,6 +79,7 @@ object FirSessionFactoryHelper { { incrementalCompilationContext?.createSymbolProviders(it, mainModuleData, projectEnvironment) }, extensionRegistrars, languageVersionSettings, + JvmTarget.DEFAULT, lookupTracker, enumWhenTracker, importTracker, diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJvmTargetProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJvmTargetProvider.kt new file mode 100644 index 00000000000..fd788f27c66 --- /dev/null +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJvmTargetProvider.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2010-2024 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.fir.java + +import org.jetbrains.kotlin.config.JvmTarget +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.FirSessionComponent + +class FirJvmTargetProvider(val jvmTarget: JvmTarget) : FirSessionComponent + +val FirSession.jvmTargetProvider: FirJvmTargetProvider? by FirSession.nullableSessionComponentAccessor() diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/library/a.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/library/a.kt index 0f4671de199..c0015a23112 100644 --- a/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/library/a.kt +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/library/a.kt @@ -17,7 +17,9 @@ var allInline: Int inline get() = 1 inline set(varue) { varue.hashCode() } - +inline var inlineProperty: Int + get() = 1 + set(varue) { varue.hashCode() } open class Base { inline fun inlineFunBase(p: () -> Unit) { @@ -35,4 +37,8 @@ open class Base { var allInlineBase: Int inline get() = 1 inline set(varue) { varue.hashCode() } -} \ No newline at end of file + + inline var inlinePropertyBase: Int + get() = 1 + set(varue) { varue.hashCode() } +} diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/output.fir.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/output.fir.txt new file mode 100644 index 00000000000..3c86d680ed1 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/output.fir.txt @@ -0,0 +1,64 @@ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:6:5: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + inlineFun {} + ^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:7:5: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + inlineGetter + ^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:11:5: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + inlineSetter = 1 + ^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:13:5: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + allInline + ^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:14:5: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + allInline = 1 + ^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:16:5: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + inlineProperty + ^^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:17:5: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + inlineProperty = 1 + ^^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:20:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + base.inlineFunBase {} + ^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:21:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + base.inlineGetterBase + ^^^^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:25:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + base.inlineSetterBase = 1 + ^^^^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:27:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + base.allInlineBase + ^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:28:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + base.allInlineBase = 1 + ^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:30:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + base.inlinePropertyBase + ^^^^^^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:31:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + base.inlinePropertyBase = 1 + ^^^^^^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:38:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + inlineFunBase {} + ^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:39:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + inlineGetterBase + ^^^^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:43:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + inlineSetterBase = 1 + ^^^^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:45:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + allInlineBase + ^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:46:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + allInlineBase = 1 + ^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:48:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + inlinePropertyBase + ^^^^^^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:49:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option. + inlinePropertyBase = 1 + ^^^^^^^^^^^^^^^^^^ +COMPILATION_ERROR diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/output.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/output.txt index 258ae328f93..80ac92a4e12 100644 --- a/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/output.txt +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/output.txt @@ -16,40 +16,58 @@ compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:14:5: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option allInline = 1 ^^^^^^^^^ -compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:17:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:16:5: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option + inlineProperty + ^^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:17:5: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option + inlineProperty = 1 + ^^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:20:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option base.inlineFunBase {} ^^^^^^^^^^^^^ -compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:18:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:21:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option base.inlineGetterBase ^^^^^^^^^^^^^^^^ -compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:19:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:22:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option base.inlineGetterBase = 1 ^^^^^^^^^^^^^^^^ -compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:22:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:25:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option base.inlineSetterBase = 1 ^^^^^^^^^^^^^^^^ -compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:24:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:27:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option base.allInlineBase ^^^^^^^^^^^^^ -compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:25:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:28:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option base.allInlineBase = 1 ^^^^^^^^^^^^^ -compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:32:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:30:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option + base.inlinePropertyBase + ^^^^^^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:31:10: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option + base.inlinePropertyBase = 1 + ^^^^^^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:38:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option inlineFunBase {} ^^^^^^^^^^^^^ -compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:33:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:39:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option inlineGetterBase ^^^^^^^^^^^^^^^^ -compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:34:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:40:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option inlineGetterBase = 1 ^^^^^^^^^^^^^^^^ -compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:37:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:43:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option inlineSetterBase = 1 ^^^^^^^^^^^^^^^^ -compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:39:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:45:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option allInlineBase ^^^^^^^^^^^^^ -compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:40:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:46:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option allInlineBase = 1 ^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:48:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option + inlinePropertyBase + ^^^^^^^^^^^^^^^^^^ +compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt:49:9: error: cannot inline bytecode built with JVM target 11 into bytecode that is being built with JVM target 1.8. Please specify proper '-jvm-target' option + inlinePropertyBase = 1 + ^^^^^^^^^^^^^^^^^^ COMPILATION_ERROR diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt index e1cbac9798a..1bf3a4823c7 100644 --- a/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/wrongInlineTarget/source.kt @@ -13,6 +13,9 @@ fun baz() { allInline allInline = 1 + inlineProperty + inlineProperty = 1 + val base = Base() base.inlineFunBase {} base.inlineGetterBase @@ -23,6 +26,9 @@ fun baz() { base.allInlineBase base.allInlineBase = 1 + + base.inlinePropertyBase + base.inlinePropertyBase = 1 } @@ -38,5 +44,8 @@ class Derived : Base() { allInlineBase allInlineBase = 1 + + inlinePropertyBase + inlinePropertyBase = 1 } } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt index 10c270deda0..204e1bdebdd 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots import org.jetbrains.kotlin.cli.jvm.config.jvmModularRoots import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.JVMConfigurationKeys +import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.container.topologicalSort import org.jetbrains.kotlin.fir.* @@ -367,6 +368,8 @@ open class FirFrontendFacade( createIncrementalCompilationSymbolProviders = { null }, extensionRegistrars, languageVersionSettings, + jvmTarget = testServices.compilerConfigurationProvider.getCompilerConfiguration(module) + .get(JVMConfigurationKeys.JVM_TARGET, JvmTarget.DEFAULT), lookupTracker = null, enumWhenTracker = null, importTracker = null, diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileKotlinAgainstCustomBinariesTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileKotlinAgainstCustomBinariesTest.kt index 6025fbb7419..7563a5173b9 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileKotlinAgainstCustomBinariesTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/AbstractCompileKotlinAgainstCustomBinariesTest.kt @@ -491,8 +491,7 @@ abstract class AbstractCompileKotlinAgainstCustomBinariesTest : AbstractKotlinCo compileKotlin("source.kt", tmpdir, listOf(library1)) } - // KT-60777 K2: missing INLINE_FROM_HIGHER_PLATFORM - fun testWrongInlineTarget() = muteForK2 { + fun testWrongInlineTarget() { val library = compileLibrary("library", additionalOptions = listOf("-jvm-target", "11")) compileKotlin("source.kt", tmpdir, listOf(library), additionalOptions = listOf("-jvm-target", "1.8"))