diff --git a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala index e0b629feeddc..8958c014fb92 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala @@ -1466,10 +1466,27 @@ trait Contexts { self: Analyzer => } if (!defSym.exists) cx = cx.outer // push further outward } + def forwardedClassParam = lastDef.isParamAccessor && { + val parentClass = lastDef.owner + val templateCtx = thisContext.nextEnclosing(c => c.tree.isInstanceOf[Template] && c.owner.isNonBottomSubClass(parentClass)) + templateCtx.owner.superClass == parentClass && { + templateCtx.tree.asInstanceOf[Template].parents.headOption.collect { + case Apply(_, args) => args + } match { + case Some(args) => + // named args? repeated args? + args.zip(parentClass.primaryConstructor.paramss.headOption.getOrElse(Nil)).exists { + case (arg: Ident, param) => param.name == lastDef.name && arg.symbol == defSym + case _ => false + } + case _ => false + } + } + } if ((defSym.isAliasType || lastDef.isAliasType) && pre.memberType(defSym) =:= lastPre.memberType(lastDef)) defSym = NoSymbol if (defSym.isStable && lastDef.isStable && - (lastPre.memberType(lastDef).termSymbol == defSym || pre.memberType(defSym).termSymbol == lastDef)) + (lastPre.memberType(lastDef).termSymbol == defSym || pre.memberType(defSym).termSymbol == lastDef || forwardedClassParam)) defSym = NoSymbol foundInPrefix = inPrefix && defSym.exists foundInSuper = foundInPrefix && defSym.owner != cx.owner diff --git a/test/files/neg/t11921-alias.scala b/test/files/neg/t11921-alias.scala index 8e05ecf1e5aa..ad878a4d50dc 100644 --- a/test/files/neg/t11921-alias.scala +++ b/test/files/neg/t11921-alias.scala @@ -47,3 +47,13 @@ object t5 { } } } + +object t6 { + abstract class C(val name: String) + + object Test { + def m(name: String) = new C(name) { + println(name) + } + } +}