diff --git a/compiler/src/dotty/tools/backend/jvm/BCodeHelpers.scala b/compiler/src/dotty/tools/backend/jvm/BCodeHelpers.scala index 03d5ac13665b..4085d87ad7ca 100644 --- a/compiler/src/dotty/tools/backend/jvm/BCodeHelpers.scala +++ b/compiler/src/dotty/tools/backend/jvm/BCodeHelpers.scala @@ -343,6 +343,7 @@ trait BCodeHelpers extends BCodeIdiomatic with BytecodeWriters { def emitParamNames(jmethod: asm.MethodVisitor, params: List[Symbol]) = for param <- params do var access = asm.Opcodes.ACC_FINAL + if param.is(Artifact) then access |= asm.Opcodes.ACC_SYNTHETIC jmethod.visitParameter(param.name.mangledString, access) /* diff --git a/compiler/src/dotty/tools/dotc/transform/Erasure.scala b/compiler/src/dotty/tools/dotc/transform/Erasure.scala index ab6f00dfc575..7a89a819677f 100644 --- a/compiler/src/dotty/tools/dotc/transform/Erasure.scala +++ b/compiler/src/dotty/tools/dotc/transform/Erasure.scala @@ -929,7 +929,7 @@ object Erasure { if constr.isConstructor && needsOuterParam(constr.owner.asClass) then constr.info match case MethodTpe(outerName :: _, outerType :: _, _) => - val outerSym = newSymbol(constr, outerName, Flags.Param, outerType) + val outerSym = newSymbol(constr, outerName, Flags.Param | Flags.SyntheticArtifact, outerType) ValDef(outerSym) :: Nil case _ => // There's a possible race condition that a constructor was looked at diff --git a/compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala b/compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala index a6a6b2736b1b..9c50e3c2f114 100644 --- a/compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala +++ b/compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala @@ -177,7 +177,7 @@ object ExplicitOuter { else prefix.widen) val info = if (flags.is(Method)) ExprType(target) else target atPhaseNoEarlier(explicitOuterPhase.next) { // outer accessors are entered at explicitOuter + 1, should not be defined before. - newSymbol(owner, name, Synthetic | flags, info, coord = cls.coord) + newSymbol(owner, name, SyntheticArtifact | flags, info, coord = cls.coord) } } diff --git a/tests/run/i14083.scala b/tests/run/i14083.scala new file mode 100644 index 000000000000..4014e474ad45 --- /dev/null +++ b/tests/run/i14083.scala @@ -0,0 +1,13 @@ +class Outer { + class Inner +} +@main def Test = + assert(classOf[Outer#Inner] + .getConstructors.head + .getParameters.head + .isSynthetic) + assert( + classOf[Outer#Inner] + .getDeclaredFields + .filter(_.getName == "$outer") + .exists(_.isSynthetic))