aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala55
-rw-r--r--src/dotty/tools/dotc/core/classfile/ClassfileParser.scala8
-rw-r--r--tests/disabled/pos/i530-import-symbolic.scala (renamed from tests/disabled/i530-import-symbolic.scala)0
-rw-r--r--tests/disabled/pos/simplesams.scala (renamed from tests/disabled/simplesams.scala)0
-rw-r--r--tests/disabled/pos/t1237.scala (renamed from tests/disabled/t1237.scala)0
-rw-r--r--tests/disabled/pos/t2669.scala (renamed from tests/disabled/t2669.scala)0
-rw-r--r--tests/disabled/pos/t3174.scala (renamed from tests/disabled/t3174.scala)0
-rw-r--r--tests/disabled/run/t7291.check (renamed from tests/run/t7291.check)0
-rw-r--r--tests/disabled/run/t7291.scala (renamed from tests/run/t7291.scala)0
-rwxr-xr-xtests/disabled/t2503.scala (renamed from tests/run/t2503.scala)0
-rw-r--r--tests/disabled/t5577.scala (renamed from tests/run/t5577.scala)0
-rw-r--r--tests/pos/intersection.scala19
-rw-r--r--tests/pos/jon.scala8
-rw-r--r--tests/pos/pets.scala21
-rw-r--r--tests/pos/sort.scala7
-rw-r--r--tests/pos/staleSymbol.scala7
16 files changed, 91 insertions, 34 deletions
diff --git a/src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala b/src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala
index b04ea99ac..dd29fa49d 100644
--- a/src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala
+++ b/src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala
@@ -329,15 +329,11 @@ object ClassfileConstants {
final val impdep1 = 0xfe
final val impdep2 = 0xff
+ import Flags._
abstract class FlagTranslation {
- import Flags._
- private var isAnnotation = false
- private var isClass = false
- private def initFields(flags: Int) = {
- isAnnotation = (flags & JAVA_ACC_ANNOTATION) != 0
- isClass = false
- }
+ protected def baseFlags(jflags: Int) = EmptyFlags
+ protected def isClass: Boolean = false
private def translateFlag(jflag: Int): FlagSet = (jflag: @switch) match {
case JAVA_ACC_PRIVATE => Private
@@ -345,8 +341,8 @@ object ClassfileConstants {
case JAVA_ACC_FINAL => Final
case JAVA_ACC_SYNTHETIC => Synthetic
case JAVA_ACC_STATIC => JavaStatic
- case JAVA_ACC_ABSTRACT => if (isAnnotation) EmptyFlags else if (isClass) Abstract else Deferred
- case JAVA_ACC_INTERFACE => if (isAnnotation) EmptyFlags else PureInterfaceCreationFlags | JavaDefined
+ case JAVA_ACC_ABSTRACT => if (isClass) Abstract else Deferred
+ case JAVA_ACC_INTERFACE => PureInterfaceCreationFlags | JavaDefined
case _ => EmptyFlags
}
@@ -354,30 +350,29 @@ object ClassfileConstants {
if (jflag == 0) base else base | translateFlag(jflag)
private def translateFlags(jflags: Int, baseFlags: FlagSet): FlagSet = {
+ val nflags =
+ if ((jflags & JAVA_ACC_ANNOTATION) == 0) jflags
+ else jflags & ~(JAVA_ACC_ABSTRACT | JAVA_ACC_INTERFACE) // annotations are neither abstract nor interfaces
var res: FlagSet = baseFlags | JavaDefined
- res = addFlag(res, jflags & JAVA_ACC_PRIVATE)
- res = addFlag(res, jflags & JAVA_ACC_PROTECTED)
- res = addFlag(res, jflags & JAVA_ACC_FINAL)
- res = addFlag(res, jflags & JAVA_ACC_SYNTHETIC)
- res = addFlag(res, jflags & JAVA_ACC_STATIC)
- res = addFlag(res, jflags & JAVA_ACC_ABSTRACT)
- res = addFlag(res, jflags & JAVA_ACC_INTERFACE)
+ res = addFlag(res, nflags & JAVA_ACC_PRIVATE)
+ res = addFlag(res, nflags & JAVA_ACC_PROTECTED)
+ res = addFlag(res, nflags & JAVA_ACC_FINAL)
+ res = addFlag(res, nflags & JAVA_ACC_SYNTHETIC)
+ res = addFlag(res, nflags & JAVA_ACC_STATIC)
+ res = addFlag(res, nflags & JAVA_ACC_ABSTRACT)
+ res = addFlag(res, nflags & JAVA_ACC_INTERFACE)
res
}
- def classFlags(jflags: Int): FlagSet = {
- initFields(jflags)
- isClass = true
- translateFlags(jflags, EmptyFlags)
- }
- def fieldFlags(jflags: Int): FlagSet = {
- initFields(jflags)
- translateFlags(jflags, if ((jflags & JAVA_ACC_FINAL) == 0) Mutable else EmptyFlags)
- }
- def methodFlags(jflags: Int): FlagSet = {
- initFields(jflags)
- translateFlags(jflags, if ((jflags & JAVA_ACC_BRIDGE) != 0) Bridge else EmptyFlags)
- }
+ def flags(jflags: Int): FlagSet = translateFlags(jflags, baseFlags(jflags))
+ }
+ val classTranslation = new FlagTranslation {
+ override def isClass = true
+ }
+ val fieldTranslation = new FlagTranslation {
+ override def baseFlags(jflags: Int) = if ((jflags & JAVA_ACC_FINAL) == 0) Mutable else EmptyFlags
+ }
+ val methodTranslation = new FlagTranslation {
+ override def baseFlags(jflags: Int) = if ((jflags & JAVA_ACC_BRIDGE) != 0) Bridge else EmptyFlags
}
- object FlagTranslation extends FlagTranslation { }
}
diff --git a/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala b/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala
index ee5453a8e..d53f545d3 100644
--- a/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala
+++ b/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala
@@ -89,7 +89,7 @@ class ClassfileParser(
def parseClass()(implicit ctx: Context): Option[Embedded] = {
val jflags = in.nextChar
val isAnnotation = hasAnnotation(jflags)
- val sflags = FlagTranslation.classFlags(jflags)
+ val sflags = classTranslation.flags(jflags)
val nameIdx = in.nextChar
currentClassName = pool.getClassName(nameIdx)
@@ -163,8 +163,8 @@ class ClassfileParser(
val start = indexCoord(in.bp)
val jflags = in.nextChar
val sflags =
- if (method) Flags.Method | FlagTranslation.methodFlags(jflags)
- else FlagTranslation.fieldFlags(jflags)
+ if (method) Flags.Method | methodTranslation.flags(jflags)
+ else fieldTranslation.flags(jflags)
val name = pool.getName(in.nextChar)
if (!(sflags is Flags.Private) || name == nme.CONSTRUCTOR || ctx.settings.optimise.value) {
val member = ctx.newSymbol(
@@ -632,7 +632,7 @@ class ClassfileParser(
getOwner(jflags),
entry.originalName,
new ClassfileLoader(file),
- FlagTranslation.classFlags(jflags),
+ classTranslation.flags(jflags),
getScope(jflags))
}
diff --git a/tests/disabled/i530-import-symbolic.scala b/tests/disabled/pos/i530-import-symbolic.scala
index f2c541af4..f2c541af4 100644
--- a/tests/disabled/i530-import-symbolic.scala
+++ b/tests/disabled/pos/i530-import-symbolic.scala
diff --git a/tests/disabled/simplesams.scala b/tests/disabled/pos/simplesams.scala
index 14a7ba6c0..14a7ba6c0 100644
--- a/tests/disabled/simplesams.scala
+++ b/tests/disabled/pos/simplesams.scala
diff --git a/tests/disabled/t1237.scala b/tests/disabled/pos/t1237.scala
index 31ba2966a..31ba2966a 100644
--- a/tests/disabled/t1237.scala
+++ b/tests/disabled/pos/t1237.scala
diff --git a/tests/disabled/t2669.scala b/tests/disabled/pos/t2669.scala
index 609e88786..609e88786 100644
--- a/tests/disabled/t2669.scala
+++ b/tests/disabled/pos/t2669.scala
diff --git a/tests/disabled/t3174.scala b/tests/disabled/pos/t3174.scala
index 8d9b2578d..8d9b2578d 100644
--- a/tests/disabled/t3174.scala
+++ b/tests/disabled/pos/t3174.scala
diff --git a/tests/run/t7291.check b/tests/disabled/run/t7291.check
index c07ba986a..c07ba986a 100644
--- a/tests/run/t7291.check
+++ b/tests/disabled/run/t7291.check
diff --git a/tests/run/t7291.scala b/tests/disabled/run/t7291.scala
index ee22b581e..ee22b581e 100644
--- a/tests/run/t7291.scala
+++ b/tests/disabled/run/t7291.scala
diff --git a/tests/run/t2503.scala b/tests/disabled/t2503.scala
index d0983f2ca..d0983f2ca 100755
--- a/tests/run/t2503.scala
+++ b/tests/disabled/t2503.scala
diff --git a/tests/run/t5577.scala b/tests/disabled/t5577.scala
index d54a37e45..d54a37e45 100644
--- a/tests/run/t5577.scala
+++ b/tests/disabled/t5577.scala
diff --git a/tests/pos/intersection.scala b/tests/pos/intersection.scala
new file mode 100644
index 000000000..2b9f6c0b7
--- /dev/null
+++ b/tests/pos/intersection.scala
@@ -0,0 +1,19 @@
+object intersection {
+
+ class A
+ class B
+
+ val x: A => Unit = ???
+ val y: B => Unit = ???
+
+ val z = if (???) x else y
+
+ val a: A & B => Unit = z
+ val b: (A => Unit) | (B => Unit) = z
+
+
+
+
+ type needsA = A => Nothing
+ type needsB = B => Nothing
+}
diff --git a/tests/pos/jon.scala b/tests/pos/jon.scala
new file mode 100644
index 000000000..d4ea74f02
--- /dev/null
+++ b/tests/pos/jon.scala
@@ -0,0 +1,8 @@
+// This one blows up with a huge type in Scala 2.
+// Reported by Jon Pretty in his talk on Scala type inference.
+object Test {
+
+ val x = List(List, Vector)
+
+ val y: List[scala.collection.generic.SeqFactory] = x
+}
diff --git a/tests/pos/pets.scala b/tests/pos/pets.scala
new file mode 100644
index 000000000..e1d5df44e
--- /dev/null
+++ b/tests/pos/pets.scala
@@ -0,0 +1,21 @@
+// Representing the current type
+trait Pet {
+ type This <: Pet
+ def name: String
+ def renamed(newName: String): This
+}
+
+case class Fish(name: String, age: Int) extends Pet {
+ type This = Fish
+ def renamed(newName: String): Fish = copy(name = newName)
+}
+
+case class Kitty(name: String, age: Int) extends Pet {
+ type This = Kitty
+ def renamed(newName: String): Kitty = copy(name = newName)
+}
+
+object Test {
+ def esquire[A <: Pet](a: A): a.This = a.renamed(a.name + ", Esq.")
+ val f: Fish = esquire(new Fish("bob", 22))
+}
diff --git a/tests/pos/sort.scala b/tests/pos/sort.scala
new file mode 100644
index 000000000..97ee3454d
--- /dev/null
+++ b/tests/pos/sort.scala
@@ -0,0 +1,7 @@
+object sorting {
+
+ val xs: Array[String] = ???
+
+ java.util.Arrays.sort(xs, ???)
+
+}
diff --git a/tests/pos/staleSymbol.scala b/tests/pos/staleSymbol.scala
new file mode 100644
index 000000000..310d87cb9
--- /dev/null
+++ b/tests/pos/staleSymbol.scala
@@ -0,0 +1,7 @@
+object intersection {
+
+ class A
+ class B
+
+ val x: A => Unit = ???
+}