Permalink
Browse files

Fix for SI-5608, crasher with value classes.

Anyone who doubts the importance of avoiding duplication is
invited to look closely at the cause of this bug as revealed in
this one line patch.
  • Loading branch information...
paulp committed May 3, 2012
1 parent 03e3a40 commit 453d615fb3c6d0db3a0a43c9232bc12584e39107
@@ -3276,8 +3276,10 @@ trait Types extends api.Types { self: SymbolTable =>
final class UniqueErasedValueType(sym: Symbol) extends ErasedValueType(sym) with UniqueType
object ErasedValueType {
- def apply(sym: Symbol): Type =
+ def apply(sym: Symbol): Type = {
+ assert(sym ne NoSymbol, "ErasedValueType cannot be NoSymbol")
unique(new UniqueErasedValueType(sym))
+ }
}
/** A class representing an as-yet unevaluated type.
@@ -195,7 +195,7 @@ trait Trees extends reflect.internal.Trees { self: Global =>
def SelectFromArray(tree: Tree, qualifier: Tree, selector: Name, erasure: Type) =
new SelectFromArray(qualifier, selector, erasure).copyAttrs(tree)
def InjectDerivedValue(tree: Tree, arg: Tree) =
- new InjectDerivedValue(arg)
+ new InjectDerivedValue(arg).copyAttrs(tree)
def TypeTreeWithDeferredRefCheck(tree: Tree) = tree match {
case dc@TypeTreeWithDeferredRefCheck() => new TypeTreeWithDeferredRefCheck()(dc.check).copyAttrs(tree)
}
@@ -0,0 +1 @@
+A@6
View
@@ -0,0 +1,12 @@
+object Test {
+ def main(args:Array[String]) {
+ val ns = Array(3L, 3L, 3L)
+ val a1: A = new A(ns(0))
+ val a2: A = new A(ns(0))
+ println(a1 + a2)
+ }
+}
+
+class A(val u: Long) extends AnyVal {
+ def +(other: A) = new A(other.u + u)
+}

0 comments on commit 453d615

Please sign in to comment.