aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-12-11 12:31:29 +0100
committerMartin Odersky <odersky@gmail.com>2016-12-11 12:31:29 +0100
commitf332dcc73e1a644be87b2017201e8a28792c5ef6 (patch)
treea50d5aa0b2305609eab1b28754e6bc48752f768f /compiler
parent4daf543cf6857295807a8a9d37890891274255a9 (diff)
downloaddotty-f332dcc73e1a644be87b2017201e8a28792c5ef6.tar.gz
dotty-f332dcc73e1a644be87b2017201e8a28792c5ef6.tar.bz2
dotty-f332dcc73e1a644be87b2017201e8a28792c5ef6.zip
Fix #1776: Avoid interaction between parameter forwarding and elimByName
Parameter forwarding is not geared to handle parameters of by-name types correctly and consequently elimByName generates wrong code. Since it's a corner case it's easiest by not applying the parameter forwarding optimization to by-name parameters.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala4
1 files changed, 3 insertions, 1 deletions
diff --git a/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala b/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala
index 9571c387b..a72e10681 100644
--- a/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala
+++ b/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala
@@ -55,7 +55,9 @@ class ParamForwarding(thisTransformer: DenotTransformer) {
stat match {
case stat: ValDef =>
val sym = stat.symbol.asTerm
- if (sym is (ParamAccessor, butNot = Mutable)) {
+ if (sym.is(ParamAccessor, butNot = Mutable) && !sym.info.isInstanceOf[ExprType]) {
+ // ElimByName gets confused with methods returning an ExprType,
+ // so avoid param forwarding if parameter is by name. See i1766.scala
val idx = superArgs.indexWhere(_.symbol == sym)
if (idx >= 0 && superParamNames(idx) == stat.name) { // supercall to like-named parameter
val alias = inheritedAccessor(sym)