diff --git a/src/compiler/scala/tools/nsc/javac/JavaParsers.scala b/src/compiler/scala/tools/nsc/javac/JavaParsers.scala index 12906d0ece7b..d14aacad9e68 100644 --- a/src/compiler/scala/tools/nsc/javac/JavaParsers.scala +++ b/src/compiler/scala/tools/nsc/javac/JavaParsers.scala @@ -837,22 +837,12 @@ trait JavaParsers extends ast.parser.ParsersCommon with JavaScanners { val (statics, body) = typeBody(RECORD) // Records generate a canonical constructor and accessors, unless they are manually specified - var generateCanonicalCtor = true var generateAccessors = header .view .map { case ValDef(mods, name, tpt, _) => (name, (tpt, mods.annotations)) } .toMap - for (DefDef(_, name, List(), List(params), _, _) <- body) { - if (name == nme.CONSTRUCTOR && params.size == header.size) { - val ctorParamsAreCanonical = params.lazyZip(header).forall { - case (ValDef(_, _, tpt1, _), ValDef(_, _, tpt2, _)) => tpt1 equalsStructure tpt2 - case _ => false - } - if (ctorParamsAreCanonical) generateCanonicalCtor = false - } else if (generateAccessors.contains(name) && params.isEmpty) { - generateAccessors -= name - } - } + for (DefDef(_, name, List(), List(params), _, _) <- body if generateAccessors.contains(name) && params.isEmpty) + generateAccessors -= name // Generate canonical constructor and accessors, if not already manually specified val accessors = generateAccessors @@ -860,23 +850,21 @@ trait JavaParsers extends ast.parser.ParsersCommon with JavaScanners { DefDef(Modifiers(Flags.JAVA) withAnnotations annots, name, List(), List(), tpt.duplicate, blankExpr) } .toList - val canonicalCtor = Option.when(generateCanonicalCtor) { - DefDef( - mods, - nme.CONSTRUCTOR, - List(), - List(header.map(_.duplicate)), - TypeTree(), - blankExpr - ) - } + val canonicalCtor = DefDef( + mods | Flags.SYNTHETIC, + nme.CONSTRUCTOR, + List(), + List(header.map(_.duplicate)), + TypeTree(), + blankExpr + ) addCompanionObject(statics, atPos(pos) { ClassDef( mods | Flags.FINAL, name, tparams, - makeTemplate(superclass :: interfaces, canonicalCtor.toList ++ accessors ++ body) + makeTemplate(superclass :: interfaces, canonicalCtor :: accessors ::: body) ) }) } diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index 825bcd50b04f..0d25d8ed12a1 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -1487,7 +1487,13 @@ trait Namers extends MethodSynthesis { } val methSig = deskolemizedPolySig(vparamSymssOrEmptyParamsFromOverride, resTp) - pluginsTypeSig(methSig, typer, ddef, resTpGiven) + val unlink = methOwner.isJava && meth.isSynthetic && meth.isConstructor && methOwner.superClass == JavaRecordClass && + methOwner.info.decl(meth.name).alternatives.exists(c => c != meth && c.tpe.matches(methSig)) + if (unlink) { + methOwner.info.decls.unlink(meth) + ErrorType + } else + pluginsTypeSig(methSig, typer, ddef, resTpGiven) } /** diff --git a/src/reflect/scala/reflect/internal/Definitions.scala b/src/reflect/scala/reflect/internal/Definitions.scala index f6a8615e44d2..35cb296a1bbc 100644 --- a/src/reflect/scala/reflect/internal/Definitions.scala +++ b/src/reflect/scala/reflect/internal/Definitions.scala @@ -411,6 +411,7 @@ trait Definitions extends api.StandardDefinitions { lazy val JavaEnumClass = requiredClass[java.lang.Enum[_]] lazy val JavaUtilMap = requiredClass[java.util.Map[_, _]] lazy val JavaUtilHashMap = requiredClass[java.util.HashMap[_, _]] + lazy val JavaRecordClass = getClassIfDefined("java.lang.Record") lazy val ByNameParamClass = specialPolyClass(tpnme.BYNAME_PARAM_CLASS_NAME, COVARIANT)(_ => AnyTpe) lazy val JavaRepeatedParamClass = specialPolyClass(tpnme.JAVA_REPEATED_PARAM_CLASS_NAME, COVARIANT)(tparam => arrayType(tparam.tpe)) diff --git a/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala b/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala index be33ed5a6651..0e01853468ea 100644 --- a/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala +++ b/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala @@ -290,6 +290,7 @@ trait JavaUniverseForce { self: runtime.JavaUniverse => definitions.JavaEnumClass definitions.JavaUtilMap definitions.JavaUtilHashMap + definitions.JavaRecordClass definitions.ByNameParamClass definitions.JavaRepeatedParamClass definitions.RepeatedParamClass diff --git a/test/files/pos/t11908/R2.java b/test/files/pos/t11908/R2.java index 52fb72b26e5e..62bf5ff6c22c 100644 --- a/test/files/pos/t11908/R2.java +++ b/test/files/pos/t11908/R2.java @@ -6,9 +6,9 @@ public int getInt() { } // Canonical constructor - public R(int i, String s) { + public R(int i, java.lang.String s) { this.i = i; this.s = s.intern(); } } -} \ No newline at end of file +}