diff --git a/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt b/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt index 19a59385b7b..e47946c15b7 100644 --- a/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt +++ b/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt @@ -1095,7 +1095,14 @@ open class KotlinFileExtractor( } if (!f.hasAnnotation(jvmOverloadsFqName)) { - if (f is IrConstructor && f.valueParameters.isNotEmpty() && f.valueParameters.all { it.defaultValue != null }) { + if (f is IrConstructor && + f.valueParameters.isNotEmpty() && + f.valueParameters.all { it.defaultValue != null } && + f.parentClassOrNull?.let { + // Don't create a default constructor for an annotation class, or a class that explicitly declares a no-arg constructor. + !it.isAnnotationClass && + it.declarations.none { d -> d is IrConstructor && d.valueParameters.isEmpty() } + } == true) { // Per https://kotlinlang.org/docs/classes.html#creating-instances-of-classes, a single default overload gets created specifically // when we have all default parameters, regardless of `@JvmOverloads`. extractGeneratedOverload(f.valueParameters.map { _ -> null }) diff --git a/java/ql/integration-tests/all-platforms/kotlin/jvmoverloads-external-class/User.java b/java/ql/integration-tests/all-platforms/kotlin/jvmoverloads-external-class/User.java index abe5b4e0092..c3356f588d5 100644 --- a/java/ql/integration-tests/all-platforms/kotlin/jvmoverloads-external-class/User.java +++ b/java/ql/integration-tests/all-platforms/kotlin/jvmoverloads-external-class/User.java @@ -1,5 +1,6 @@ +@AllDefaultsAnnotation public class User { - public static void test() { new AllDefaultsConstructor(); } + public static void test() { new AllDefaultsConstructor(); new AllDefaultsExplicitNoargConstructor(); } } diff --git a/java/ql/integration-tests/all-platforms/kotlin/jvmoverloads-external-class/test.kt b/java/ql/integration-tests/all-platforms/kotlin/jvmoverloads-external-class/test.kt index 0d155020de5..33e6d1d1221 100644 --- a/java/ql/integration-tests/all-platforms/kotlin/jvmoverloads-external-class/test.kt +++ b/java/ql/integration-tests/all-platforms/kotlin/jvmoverloads-external-class/test.kt @@ -5,3 +5,11 @@ public class Test { } public class AllDefaultsConstructor(val x: Int = 1, val y: Int = 2) { } + +public annotation class AllDefaultsAnnotation(val x: Int = 1, val y: Int = 2) { } + +public class AllDefaultsExplicitNoargConstructor(val x: Int = 1, val y: Int = 2) { + + constructor() : this(3, 4) { } + +}