Skip to content

Commit c65504d

Browse files
committed
Eliminate `_' from rhs of ValDefs
Previously was only done for DefDefs. Caused backend failure.
1 parent 3350907 commit c65504d

File tree

5 files changed

+23
-36
lines changed

5 files changed

+23
-36
lines changed

src/dotty/tools/dotc/ast/tpd.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
418418
Thicket(valdef, clsdef)
419419
}
420420

421-
def initValue(tpe: Types.Type)(implicit ctx: Context) = {
421+
def defaultValue(tpe: Types.Type)(implicit ctx: Context) = {
422422
val tpw = tpe.widen
423423

424424
if (tpw isRef defn.IntClass) Literal(Constant(0))
Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,14 @@
1-
package dotty.tools.dotc.transform
1+
package dotty.tools.dotc
2+
package transform
23

3-
import dotty.tools.dotc.transform.TreeTransforms.{TransformerInfo, TreeTransform, TreeTransformer, MiniPhaseTransform}
4-
import dotty.tools.dotc.ast.{untpd, tpd}
5-
import dotty.tools.dotc.core.Contexts.Context
6-
import scala.collection.mutable.ListBuffer
7-
import dotty.tools.dotc.core.{Scopes, Flags}
8-
import dotty.tools.dotc.core.Symbols.NoSymbol
9-
import scala.annotation.tailrec
10-
import dotty.tools.dotc.core._
4+
import TreeTransforms.{MiniPhaseTransform, TransformerInfo}
5+
import ast.tpd
6+
import ast.Trees._
7+
import core._
8+
import Contexts.Context
119
import Symbols._
12-
import scala.Some
13-
import dotty.tools.dotc.transform.TreeTransforms.{NXTransformations, TransformerInfo, TreeTransform, TreeTransformer}
14-
import dotty.tools.dotc.core.Contexts.Context
15-
import scala.collection.mutable
16-
import dotty.tools.dotc.core.Names.Name
17-
import NameOps._
1810
import Types._
19-
import scala.collection.SortedSet
20-
import Decorators._
2111
import StdNames._
22-
import dotty.tools.dotc.util.Positions.Position
23-
import dotty.tools.dotc.config.JavaPlatform
2412

2513
/**
2614
* Replace Ident("_") in tree with default values of corresponding type:
@@ -29,21 +17,21 @@ import dotty.tools.dotc.config.JavaPlatform
2917
* classes: `null`
3018
*/
3119
class ElimWildcardIdents extends MiniPhaseTransform {
32-
import tpd._
20+
import ast.tpd._
3321
def phaseName: String = "elimWildcardIdents"
3422

35-
36-
override def transformDefDef(tree: tpd.DefDef)(implicit ctx: Context, info: TransformerInfo): tpd.Tree = {
37-
def stripBlocks(arg: Tree): Tree = arg match {
38-
case b: Block if b.stats.isEmpty => stripBlocks(b.expr)
39-
case _ => arg
40-
}
41-
val b = stripBlocks(tree.rhs)
42-
b match {
43-
case x: Ident if (x.name == nme.WILDCARD && x.symbol.isClass) =>
44-
tpd.DefDef(tree.symbol.asTerm, tpd.initValue(x.tpe))
23+
def wildcardToDefaultValue(tree: Tree)(implicit ctx: Context) = {
24+
def recur(x: Tree): Tree = x match {
25+
case x: Ident if x.name == nme.WILDCARD && x.symbol.isClass => defaultValue(tree.tpe)
26+
case Block(Nil, y) => recur(y)
4527
case _ => tree
4628
}
29+
recur(tree)
4730
}
4831

32+
override def transformValDef(tree: tpd.ValDef)(implicit ctx: Context, info: TransformerInfo): tpd.Tree =
33+
cpy.ValDef(tree)(rhs = wildcardToDefaultValue(tree.rhs))
34+
35+
override def transformDefDef(tree: tpd.DefDef)(implicit ctx: Context, info: TransformerInfo): tpd.Tree =
36+
cpy.DefDef(tree)(rhs = wildcardToDefaultValue(tree.rhs))
4937
}

src/dotty/tools/dotc/transform/LazyVals.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
177177
tpe, coord = x.symbol.coord
178178
).entered
179179

180-
val containerTree = ValDef(containerSymbol, initValue(tpe))
180+
val containerTree = ValDef(containerSymbol, defaultValue(tpe))
181181
if (x.tpe.isNotNull && tpe <:< defn.ObjectType) { // can use 'null' value instead of flag
182182
val slowPath = DefDef(x.symbol.asTerm, mkDefNonThreadSafeNonNullable(containerSymbol, x.rhs))
183183
Thicket(List(containerTree, slowPath))
@@ -234,7 +234,7 @@ class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
234234
val thiz = This(claz)(ctx.fresh.setOwner(claz))
235235

236236
val resultSymbol = ctx.newSymbol(methodSymbol, lazyNme.result, containerFlags, tp)
237-
val resultDef = ValDef(resultSymbol, initValue(tp))
237+
val resultDef = ValDef(resultSymbol, defaultValue(tp))
238238

239239
val retrySymbol = ctx.newSymbol(methodSymbol, lazyNme.retry, containerFlags, defn.BooleanType)
240240
val retryDef = ValDef(retrySymbol, Literal(Constants.Constant(true)))
@@ -332,7 +332,7 @@ class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
332332

333333
val containerName = ctx.freshName(x.name ++ StdNames.nme.LAZY_LOCAL).toTermName
334334
val containerSymbol = ctx.newSymbol(claz, containerName, (x.mods &~ containerFlagsMask | containerFlags).flags, tpe, coord = x.symbol.coord).entered
335-
val containerTree = ValDef(containerSymbol, initValue(tpe))
335+
val containerTree = ValDef(containerSymbol, defaultValue(tpe))
336336

337337
val offset = ref(companion).ensureApplied.select(offsetSymbol)
338338
val getFlag = Select(ref(helperModule), lazyNme.RLazyVals.get)

src/dotty/tools/dotc/transform/TraitConstructors.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ class TraitConstructors extends MiniPhaseTransform with SymTransformer {
1818
import dotty.tools.dotc.ast.tpd._
1919
def phaseName: String = "traitConstructors"
2020

21-
2221
override def treeTransformPhase: Phase = this.phase
2322

2423
def transformSym(sym: SymDenotation)(implicit ctx: Context): SymDenotation = {

test/dotc/tests.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ class tests extends CompilerTest {
137137
@Test def neg_escapingRefs = compileFile(negDir, "escapingRefs", xerrors = 2)
138138
@Test def neg_instantiateAbstract = compileFile(negDir, "instantiateAbstract", xerrors = 8)
139139
@Test def neg_selfInheritance = compileFile(negDir, "selfInheritance", xerrors = 5)
140-
140+
141141

142142
@Test def run_all = runFiles(runDir)
143143

0 commit comments

Comments
 (0)