Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

scala-js file order sensitive bug related to https://github.com/scala/scala/pull/7966? #11525

Closed
adriaanm opened this issue May 10, 2019 · 5 comments · Fixed by scala/scala#8049
Labels
Milestone

Comments

@adriaanm
Copy link
Contributor

adriaanm commented May 10, 2019

to reproduce, checkout branch t11525 from https://github.com/adriaanm/scala-js

sbt javalanglib/compile:

> javalanglib/compile
[info] Compiling 42 Scala sources to /Users/adriaan/git/scala-js/javalanglib/target/scala-2.13.0-pre-2ef2f9f/classes...
ArrayBuffer(/Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Long.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Math.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/InheritableThreadLocal.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Appendable.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Comparable.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/StringBuffer.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/StackTraceElement.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Runtime.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/ThreadLocal.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Character.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Void.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Cloneable.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/StackTrace.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Number.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Thread.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Readable.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Integer.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/StringBuilder.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/AutoCloseable.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/System.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/ClassLoader.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Byte.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Class.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Throwables.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/FloatingPointBits.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Double.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/ObjectClone.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/CharSequence.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Iterable.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/_String.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Short.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Enum.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Runnable.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Boolean.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Float.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/ref/PhantomReference.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/ref/Reference.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/ref/SoftReference.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/ref/ReferenceQueue.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/ref/WeakReference.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/reflect/Array.scala, /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/annotation/Annotation.scala)
[error] /Users/adriaan/git/scala-js/javalanglib/src/main/scala/java/lang/Iterable.scala:18: error: type arguments [T] do not conform to trait Iterator's type parameter bounds [E <: Object]
[error]   def iterator(): Iterator[T]
[error]                   ^
[info] one error found
@adriaanm adriaanm added this to the 2.13.0-RC2 milestone May 10, 2019
@adriaanm
Copy link
Contributor Author

This one was tricky. File order in adriaanm/scala-js@9bb932c was discovered on CI (linux machine, also Eugene's dbuild box), whereas our macs compiled the project ok.

adriaanm added a commit to scalacommunitybuild/scala-js that referenced this issue May 10, 2019
adriaanm added a commit to scala/community-build that referenced this issue May 10, 2019
@adriaanm
Copy link
Contributor Author

adriaanm commented May 10, 2019

self-contained repro:

package java.lang

import java.util.Iterator

class Class[A](o: Object)

class Comparable[A] { def compareTo(o: A): scala.Int = ??? }

object System {
  def currentTimeMillis(): scala.Long = ???

  def arraycopy(src: Object, srcPos: scala.Int, dest: Object, destPos: scala.Int, length: scala.Int): Unit = {
    import scala.{Boolean, Double}

    def mismatch(): Nothing =
      throw new ArrayStoreException("Incompatible array types")

    def copyPrim[@specialized T](src: Array[T], dest: Array[T]): Unit = {
        var i = length-1
        while (i >= 0) {
          dest(i+destPos) = src(i+srcPos)
          i -= 1
        }
    }

    def copyRef(src: Array[AnyRef], dest: Array[AnyRef]): Unit = {
      val x = (src.length, dest.length)
      
      var i = length-1
      while (i >= 0) {
        dest(i+destPos) = src(i+srcPos)
        i -= 1
      }
    }

    (src match {
      case src: Array[Boolean] =>
        dest match {
          case dest: Array[Boolean] => copyPrim(src, dest)
          case _                    => mismatch()
        }

    })
  }

  def identityHashCode(x: Object): scala.Int = {
    x.getClass
    1
  }
}

trait Iterable[T] {
  def iterator():  java.util.Iterator[T]
}

Repro's pretty consistently with:

 scalac /tmp/iter.scala -Ystop-after:refchecks -verbose -Ydebug -uniqid

🤷‍♂

@adriaanm
Copy link
Contributor Author

compiling this yields the same error:

error: type arguments [T] do not conform to trait Iterator's type parameter bounds [E <: Object]
  def iterator(): Iterator[T]
                  ^
one error found

@adriaanm
Copy link
Contributor Author

I spent a lot of time trying to prune the repro, but this seems as small as I could get it.

Just compiling this with -uniqid makes the error go away (sometimes). WTF

@adriaanm
Copy link
Contributor Author

Ok, I think I figured it out. ObjectTpeJava is still replaced by ObjectTpe when uniqueing a Type that contains ObjectTpeJava, since e.g. TypeBounds(...ObjectTpeJava...).equalsTypeBounds(...ObjectTpe...) and thus uniqueing the TypeBounds will also replace our precious ObjectTpeJava by ObjectTpe.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants