diff options
author | Dmitry Petrashko <dark@d-d.me> | 2017-04-19 06:58:40 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-19 06:58:40 -0500 |
commit | 02e38832668ed2a0504a77dd4f86270fa1a1d4bf (patch) | |
tree | 5f931022c36fc3cf8ef585e4bcc08f554f92142e /compiler/src/dotty/tools/dotc/ast | |
parent | 4623e1282ebe7dfc31cb12411fed16457ed289ca (diff) | |
parent | 983ce8da3ce321bed7f8100c00b4aa709528208e (diff) | |
download | dotty-02e38832668ed2a0504a77dd4f86270fa1a1d4bf.tar.gz dotty-02e38832668ed2a0504a77dd4f86270fa1a1d4bf.tar.bz2 dotty-02e38832668ed2a0504a77dd4f86270fa1a1d4bf.zip |
Merge pull request #2267 from dotty-staging/fix-constant-lazy-vals
Fix #2266: Do not replace constant type lazy vals with constant.
Diffstat (limited to 'compiler/src/dotty/tools/dotc/ast')
-rw-r--r-- | compiler/src/dotty/tools/dotc/ast/TreeInfo.scala | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/compiler/src/dotty/tools/dotc/ast/TreeInfo.scala b/compiler/src/dotty/tools/dotc/ast/TreeInfo.scala index f3bce4000..49187492e 100644 --- a/compiler/src/dotty/tools/dotc/ast/TreeInfo.scala +++ b/compiler/src/dotty/tools/dotc/ast/TreeInfo.scala @@ -3,7 +3,7 @@ package dotc package ast import core._ -import Flags._, Trees._, Types._, Contexts._ +import Flags._, Trees._, Types._, Contexts._, Constants._ import Names._, StdNames._, NameOps._, Decorators._, Symbols._ import util.HashSet import typer.ConstFold @@ -426,8 +426,18 @@ trait TypedTreeInfo extends TreeInfo[Type] { self: Trees.Instance[Type] => */ def constToLiteral(tree: Tree)(implicit ctx: Context): Tree = { val tree1 = ConstFold(tree) + def canInlineConstant(value: Constant): Boolean = { + val sym = tree1.symbol + isIdempotentExpr(tree1) && // see note in documentation + // lazy value must be initialized (would not be needed with isPureExpr) + !sym.is(Lazy) && + // could hide initialization order issues (ex. val with constant type read before initialized) + (!ctx.owner.isLocalDummy || (!sym.is(Method) && !sym.is(Lazy) && value.isZero) || + ctx.scala2Mode // ignore in Scala 2 because of inlined `final val` values + ) + } tree1.tpe.widenTermRefExpr match { - case ConstantType(value) if isIdempotentExpr(tree1) => Literal(value) + case ConstantType(value) if canInlineConstant(value) => Literal(value) case _ => tree1 } } |