summaryrefslogtreecommitdiff
path: root/test/files/pos/t6651.scala
blob: 55a3b74e4cadacb5f87a5ba680da04830b7f9eca (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class YouAreYourself[A <: AnyRef](val you: A) extends AnyVal {
  def yourself: you.type = you
}

object Test {
  val s = ""
  val s1: s.type = new YouAreYourself[s.type](s).yourself
}

trait Path {
  type Dep <: AnyRef
}

final class ValueClass[P <: Path](val path: P) extends AnyVal {
  import path.Dep

  def apply(dep: Dep)(d2: dep.type, foo: Int): (Dep, d2.type) = (d2, d2)

  // This generates dodgy code; note `ValueClass.this`:
  //
  // final def bounds$extension[D >: Nothing <: ValueClass.this.path.Dep,
  //                            P >: Nothing <: Path]
  //                            ($this: ValueClass[P])
  //                            (dep: D)
  //                            (d2: dep.type, foo: Int): (D, d2.type) = scala.Tuple2.apply[D, d2.type](d2, d2);
  //
  // Nothing crashes down the line, but it certainly doesn't conform to best-practices.
  //
  // An better alternative would be to add a type parameter for the (singleton) type of
  // the wrapped value.
  def bounds[D <: Dep](dep: D)(d2: dep.type, foo: Int): (D, d2.type) = (d2, d2)
}