diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/Trees.scala | 8 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/UnCurry.scala | 6 | ||||
-rw-r--r-- | test/files/pos/bug767.scala | 18 |
3 files changed, 26 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/Trees.scala b/src/compiler/scala/tools/nsc/ast/Trees.scala index 91a2d727a3..a8b64575cb 100644 --- a/src/compiler/scala/tools/nsc/ast/Trees.scala +++ b/src/compiler/scala/tools/nsc/ast/Trees.scala @@ -610,10 +610,10 @@ trait Trees requires Global { case Ident(name) => case Literal(value) => case TypeTree() => - case SingletonTypeTree(ref) => (eliminated by typecheck) - case SelectFromTypeTree(qualifier, selector) => (eliminated by typecheck) - case CompoundTypeTree(templ: Template) => (eliminated by typecheck) - case AppliedTypeTree(tpt, args) => (eliminated by typecheck) + case SingletonTypeTree(ref) => (eliminated by uncurry) + case SelectFromTypeTree(qualifier, selector) => (eliminated by uncurry) + case CompoundTypeTree(templ: Template) => (eliminated by uncurry) + case AppliedTypeTree(tpt, args) => (eliminated by uncurry) */ abstract class TreeCopier { diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala index 0957e0c435..13b8ea7638 100644 --- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala +++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala @@ -415,7 +415,7 @@ abstract class UnCurry extends InfoTransform with TypingTransformers { if (tree.symbol.isMethod && (!tree.tpe.isInstanceOf[PolyType] || tree.tpe.typeParams.isEmpty)) { if (!tree.tpe.isInstanceOf[MethodType]) tree.tpe = MethodType(List(), tree.tpe); atPos(tree.pos)(Apply(tree, List()) setType tree.tpe.resultType) - } else if (tree.isType && !tree.isInstanceOf[TypeTree]) { + } else if (tree.isType) { TypeTree(tree.tpe) setPos tree.pos } else { tree @@ -471,8 +471,10 @@ abstract class UnCurry extends InfoTransform with TypingTransformers { case Return(expr) if (tree.symbol != currentOwner.enclMethod) => if (settings.debug.value) log("non local return in "+tree.symbol+" from "+currentOwner.enclMethod) atPos(tree.pos)(nonLocalReturnThrow(expr, tree.symbol)) - case _ => + case TypeTree() => tree + case _ => + if (tree.isType) TypeTree(tree.tpe) setPos tree.pos else tree } } } diff --git a/test/files/pos/bug767.scala b/test/files/pos/bug767.scala new file mode 100644 index 0000000000..05dd97f556 --- /dev/null +++ b/test/files/pos/bug767.scala @@ -0,0 +1,18 @@ +abstract class AbsCell { + type T = Node + val init: T + private var value: T = init + def get: T = value + def set (x: T): unit = { value = x } + + class Node { + val foo = 1 + } +} + +object inner { + def main(args: Array[String]): Unit = { + val cell = new AbsCell { val init = new Node() } + cell.set(new cell.type#T()) // nullpointer exception + } +} |