diff options
author | Guillaume Martres <smarter@ubuntu.com> | 2016-12-21 22:40:36 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-21 22:40:36 +0100 |
commit | 404ce763d0f9ef82dae52e6aff3ec20950c67e29 (patch) | |
tree | e1c1b4ac13d26c214816b2f0582e573298c741f4 | |
parent | ee4f4a109b3ec3190886c75bb6d140087c33287d (diff) | |
parent | 9568eba6de7e881c6003dbfc95e46e6f83fa2e7b (diff) | |
download | dotty-404ce763d0f9ef82dae52e6aff3ec20950c67e29.tar.gz dotty-404ce763d0f9ef82dae52e6aff3ec20950c67e29.tar.bz2 dotty-404ce763d0f9ef82dae52e6aff3ec20950c67e29.zip |
Merge pull request #1826 from dotty-staging/fix-compile-stdlib
Make more parts of stdlib compile
-rw-r--r-- | compiler/src/dotty/tools/dotc/ast/Desugar.scala | 30 | ||||
-rw-r--r-- | compiler/src/dotty/tools/dotc/core/TypeComparer.scala | 10 | ||||
-rw-r--r-- | compiler/src/dotty/tools/dotc/core/TypeOps.scala | 2 | ||||
-rw-r--r-- | compiler/src/dotty/tools/dotc/core/Types.scala | 8 | ||||
-rw-r--r-- | compiler/src/dotty/tools/dotc/transform/ElimByName.scala | 2 | ||||
-rw-r--r-- | compiler/src/dotty/tools/dotc/transform/LiftTry.scala | 2 | ||||
-rw-r--r-- | compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala | 33 | ||||
-rw-r--r-- | compiler/src/dotty/tools/dotc/typer/Applications.scala | 26 | ||||
-rw-r--r-- | compiler/src/dotty/tools/dotc/typer/FrontEnd.scala | 15 | ||||
-rw-r--r-- | compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala | 20 | ||||
-rw-r--r-- | compiler/src/dotty/tools/dotc/typer/RefChecks.scala | 7 | ||||
-rw-r--r-- | compiler/src/dotty/tools/dotc/typer/Typer.scala | 23 | ||||
-rw-r--r-- | compiler/test/dotc/scala-collections.blacklist | 227 | ||||
-rw-r--r-- | compiler/test/dotc/scala-collections.whitelist | 65 | ||||
-rw-r--r-- | doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala | 2 | ||||
-rw-r--r-- | tests/pos/hkwild.scala | 6 |
16 files changed, 235 insertions, 243 deletions
diff --git a/compiler/src/dotty/tools/dotc/ast/Desugar.scala b/compiler/src/dotty/tools/dotc/ast/Desugar.scala index 13ddff08c..211683c0a 100644 --- a/compiler/src/dotty/tools/dotc/ast/Desugar.scala +++ b/compiler/src/dotty/tools/dotc/ast/Desugar.scala @@ -7,6 +7,7 @@ import util.Positions._, Types._, Contexts._, Constants._, Names._, NameOps._, F import SymDenotations._, Symbols._, StdNames._, Annotations._, Trees._ import Decorators._ import language.higherKinds +import typer.FrontEnd import collection.mutable.ListBuffer import util.Property import reporting.diagnostic.messages._ @@ -363,7 +364,7 @@ object desugar { if (mods.is(Abstract) || hasRepeatedParam) Nil // cannot have default arguments for repeated parameters, hence copy method is not issued else { def copyDefault(vparam: ValDef) = - makeAnnotated(defn.UncheckedVarianceAnnot, refOfDef(vparam)) + makeAnnotated("scala.annotation.unchecked.uncheckedVariance", refOfDef(vparam)) val copyFirstParams = derivedVparamss.head.map(vparam => cpy.ValDef(vparam)(rhs = copyDefault(vparam))) val copyRestParamss = derivedVparamss.tail.nestedMap(vparam => @@ -559,7 +560,7 @@ object desugar { case VarPattern(named, tpt) => derivedValDef(original, named, tpt, rhs, mods) case _ => - val rhsUnchecked = makeAnnotated(defn.UncheckedAnnot, rhs) + val rhsUnchecked = makeAnnotated("scala.unchecked", rhs) val vars = getVariables(pat) val isMatchingTuple: Tree => Boolean = { case Tuple(es) => es.length == vars.length @@ -688,11 +689,28 @@ object desugar { new ImplicitFunction(params, body) } - /** Add annotation with class `cls` to tree: - * tree @cls + /** Add annotation to tree: + * tree @fullName + * + * The annotation is usually represented as a TypeTree referring to the class + * with the given name `fullName`. However, if the annotation matches a file name + * that is still to be entered, the annotation is represented as a cascade of `Selects` + * following `fullName`. This is necessary so that we avoid reading an annotation from + * the classpath that is also compiled from source. */ - def makeAnnotated(cls: Symbol, tree: Tree)(implicit ctx: Context) = - Annotated(tree, untpd.New(untpd.TypeTree(cls.typeRef), Nil)) + def makeAnnotated(fullName: String, tree: Tree)(implicit ctx: Context) = { + val parts = fullName.split('.') + val ttree = ctx.typerPhase match { + case phase: FrontEnd if phase.stillToBeEntered(parts.last) => + val prefix = + ((Ident(nme.ROOTPKG): Tree) /: parts.init)((qual, name) => + Select(qual, name.toTermName)) + Select(prefix, parts.last.toTypeName) + case _ => + TypeTree(ctx.requiredClass(fullName).typeRef) + } + Annotated(tree, untpd.New(ttree, Nil)) + } private def derivedValDef(original: Tree, named: NameTree, tpt: Tree, rhs: Tree, mods: Modifiers)(implicit ctx: Context) = { val vdef = ValDef(named.name.asTermName, tpt, rhs) diff --git a/compiler/src/dotty/tools/dotc/core/TypeComparer.scala b/compiler/src/dotty/tools/dotc/core/TypeComparer.scala index 334306f19..8930983f3 100644 --- a/compiler/src/dotty/tools/dotc/core/TypeComparer.scala +++ b/compiler/src/dotty/tools/dotc/core/TypeComparer.scala @@ -757,8 +757,14 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling { if (args1.isEmpty) args2.isEmpty else args2.nonEmpty && { val v = tparams.head.paramVariance - (v > 0 || isSubType(args2.head, args1.head)) && - (v < 0 || isSubType(args1.head, args2.head)) + def isSub(tp1: Type, tp2: Type) = tp2 match { + case tp2: TypeBounds => + tp2.contains(tp1) + case _ => + (v > 0 || isSubType(tp2, tp1)) && + (v < 0 || isSubType(tp1, tp2)) + } + isSub(args1.head, args2.head) } && isSubArgs(args1.tail, args2.tail, tparams) /** Test whether `tp1` has a base type of the form `B[T1, ..., Tn]` where diff --git a/compiler/src/dotty/tools/dotc/core/TypeOps.scala b/compiler/src/dotty/tools/dotc/core/TypeOps.scala index db73daaa2..c2a7d7ea6 100644 --- a/compiler/src/dotty/tools/dotc/core/TypeOps.scala +++ b/compiler/src/dotty/tools/dotc/core/TypeOps.scala @@ -552,7 +552,7 @@ trait TypeOps { this: Context => // TODO: Make standalone object. def dynamicsEnabled = featureEnabled(defn.LanguageModuleClass, nme.dynamics) - def testScala2Mode(msg: String, pos: Position) = { + def testScala2Mode(msg: => String, pos: Position) = { if (scala2Mode) migrationWarning(msg, pos) scala2Mode } diff --git a/compiler/src/dotty/tools/dotc/core/Types.scala b/compiler/src/dotty/tools/dotc/core/Types.scala index 64fa48071..636204f64 100644 --- a/compiler/src/dotty/tools/dotc/core/Types.scala +++ b/compiler/src/dotty/tools/dotc/core/Types.scala @@ -217,6 +217,14 @@ object Types { case _ => false } + /** Is this the type of a method with a leading empty parameter list? + */ + def isNullaryMethod(implicit ctx: Context): Boolean = this match { + case MethodType(Nil, _) => true + case tp: PolyType => tp.resultType.isNullaryMethod + case _ => false + } + /** Is this an alias TypeBounds? */ def isAlias: Boolean = this.isInstanceOf[TypeAlias] diff --git a/compiler/src/dotty/tools/dotc/transform/ElimByName.scala b/compiler/src/dotty/tools/dotc/transform/ElimByName.scala index 192227261..71ced3175 100644 --- a/compiler/src/dotty/tools/dotc/transform/ElimByName.scala +++ b/compiler/src/dotty/tools/dotc/transform/ElimByName.scala @@ -71,7 +71,7 @@ class ElimByName extends MiniPhaseTransform with InfoTransformer { thisTransform def transformArg(arg: Tree, formal: Type): Tree = formal.dealias match { case formalExpr: ExprType => - val argType = arg.tpe.widen + val argType = arg.tpe.widenIfUnstable val argFun = arg match { case Apply(Select(qual, nme.apply), Nil) if qual.tpe.derivesFrom(defn.FunctionClass(0)) && isPureExpr(qual) => diff --git a/compiler/src/dotty/tools/dotc/transform/LiftTry.scala b/compiler/src/dotty/tools/dotc/transform/LiftTry.scala index 6a273b91e..d01195614 100644 --- a/compiler/src/dotty/tools/dotc/transform/LiftTry.scala +++ b/compiler/src/dotty/tools/dotc/transform/LiftTry.scala @@ -57,7 +57,7 @@ class LiftTry extends MiniPhase with IdentityDenotTransformer { thisTransform => ctx.debuglog(i"lifting tree at ${tree.pos}, current owner = ${ctx.owner}") val fn = ctx.newSymbol( ctx.owner, ctx.freshName("liftedTree").toTermName, Synthetic | Method, - MethodType(Nil, tree.tpe), coord = tree.pos) + MethodType(Nil, tree.tpe.widenIfUnstable), coord = tree.pos) tree.changeOwnerAfter(ctx.owner, fn, thisTransform) Block(DefDef(fn, tree) :: Nil, ref(fn).appliedToNone) } diff --git a/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala b/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala index fea478c9b..3c11827fc 100644 --- a/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala +++ b/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala @@ -71,21 +71,24 @@ class SuperAccessors(thisTransformer: DenotTransformer) { val Select(qual, name) = sel val sym = sel.symbol val clazz = qual.symbol.asClass - var supername = name.superName - if (clazz is Trait) supername = supername.expandedName(clazz) - - val superAcc = clazz.info.decl(supername).suchThat(_.signature == sym.signature).symbol orElse { - ctx.debuglog(s"add super acc ${sym.showLocated} to $clazz") - val deferredOrPrivate = if (clazz is Trait) Deferred | ExpandedName else Private - val acc = ctx.newSymbol( - clazz, supername, SuperAccessor | Artifact | Method | deferredOrPrivate, - sel.tpe.widenSingleton.ensureMethodic, coord = sym.coord).enteredAfter(thisTransformer) - // Diagnostic for SI-7091 - if (!accDefs.contains(clazz)) - ctx.error(s"Internal error: unable to store accessor definition in ${clazz}. clazz.hasPackageFlag=${clazz is Package}. Accessor required for ${sel} (${sel.show})", sel.pos) - else accDefs(clazz) += DefDef(acc, EmptyTree) - acc - } + var superName = name.superName + if (clazz is Trait) superName = superName.expandedName(clazz) + val superInfo = sel.tpe.widenSingleton.ensureMethodic + + val superAcc = clazz.info.decl(superName) + .suchThat(_.signature == superInfo.signature).symbol + .orElse { + ctx.debuglog(s"add super acc ${sym.showLocated} to $clazz") + val deferredOrPrivate = if (clazz is Trait) Deferred | ExpandedName else Private + val acc = ctx.newSymbol( + clazz, superName, SuperAccessor | Artifact | Method | deferredOrPrivate, + superInfo, coord = sym.coord).enteredAfter(thisTransformer) + // Diagnostic for SI-7091 + if (!accDefs.contains(clazz)) + ctx.error(s"Internal error: unable to store accessor definition in ${clazz}. clazz.hasPackageFlag=${clazz is Package}. Accessor required for ${sel} (${sel.show})", sel.pos) + else accDefs(clazz) += DefDef(acc, EmptyTree) + acc + } This(clazz).select(superAcc).withPos(sel.pos) } diff --git a/compiler/src/dotty/tools/dotc/typer/Applications.scala b/compiler/src/dotty/tools/dotc/typer/Applications.scala index 8a18e63c0..42c24ffb7 100644 --- a/compiler/src/dotty/tools/dotc/typer/Applications.scala +++ b/compiler/src/dotty/tools/dotc/typer/Applications.scala @@ -657,18 +657,20 @@ trait Applications extends Compatibility { self: Typer with Dynamic => case err: ErrorType => untpd.cpy.Apply(tree)(fun1, tree.args).withType(err) case TryDynamicCallType => typedDynamicApply(tree, pt) case _ => - tryEither { - implicit ctx => simpleApply(fun1, proto) - } { - (failedVal, failedState) => - def fail = { failedState.commit(); failedVal } - // Try once with original prototype and once (if different) with tupled one. - // The reason we need to try both is that the decision whether to use tupled - // or not was already taken but might have to be revised when an implicit - // is inserted on the qualifier. - tryWithImplicitOnQualifier(fun1, originalProto).getOrElse( - if (proto eq originalProto) fail - else tryWithImplicitOnQualifier(fun1, proto).getOrElse(fail)) + if (originalProto.isDropped) fun1 + else + tryEither { + implicit ctx => simpleApply(fun1, proto) + } { + (failedVal, failedState) => + def fail = { failedState.commit(); failedVal } + // Try once with original prototype and once (if different) with tupled one. + // The reason we need to try both is that the decision whether to use tupled + // or not was already taken but might have to be revised when an implicit + // is inserted on the qualifier. + tryWithImplicitOnQualifier(fun1, originalProto).getOrElse( + if (proto eq originalProto) fail + else tryWithImplicitOnQualifier(fun1, proto).getOrElse(fail)) } } } diff --git a/compiler/src/dotty/tools/dotc/typer/FrontEnd.scala b/compiler/src/dotty/tools/dotc/typer/FrontEnd.scala index cd374e32c..6eff63e2b 100644 --- a/compiler/src/dotty/tools/dotc/typer/FrontEnd.scala +++ b/compiler/src/dotty/tools/dotc/typer/FrontEnd.scala @@ -19,6 +19,15 @@ class FrontEnd extends Phase { override def isTyper = true import ast.tpd + /** The contexts for compilation units that are parsed but not yet entered */ + private var remaining: List[Context] = Nil + + /** Does a source file ending with `<name>.scala` belong to a compilation unit + * that is parsed but not yet entered? + */ + def stillToBeEntered(name: String): Boolean = + remaining.exists(_.compilationUnit.toString.endsWith(name + ".scala")) + def monitor(doing: String)(body: => Unit)(implicit ctx: Context) = try body catch { @@ -75,7 +84,11 @@ class FrontEnd extends Phase { } unitContexts foreach (parse(_)) record("parsedTrees", ast.Trees.ntrees) - unitContexts.foreach(enterSyms(_)) + remaining = unitContexts + while (remaining.nonEmpty) { + enterSyms(remaining.head) + remaining = remaining.tail + } unitContexts.foreach(enterAnnotations(_)) unitContexts.foreach(typeCheck(_)) record("total trees after typer", ast.Trees.ntrees) diff --git a/compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala b/compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala index ed6b95c3b..eb46a131f 100644 --- a/compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala +++ b/compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala @@ -40,7 +40,9 @@ object ProtoTypes { /** Test compatibility after normalization in a fresh typerstate. */ def normalizedCompatible(tp: Type, pt: Type)(implicit ctx: Context) = { val nestedCtx = ctx.fresh.setExploreTyperState - isCompatible(normalize(tp, pt)(nestedCtx), pt)(nestedCtx) + val normTp = normalize(tp, pt)(nestedCtx) + isCompatible(normTp, pt)(nestedCtx) || + pt.isRef(defn.UnitClass) && normTp.isParameterless } private def disregardProto(pt: Type)(implicit ctx: Context): Boolean = pt.dealias match { @@ -250,6 +252,22 @@ object ProtoTypes { /** Somebody called the `tupled` method of this prototype */ def isTupled: Boolean = myTupled.isInstanceOf[FunProto] + /** If true, the application of this prototype was canceled. */ + private var toDrop: Boolean = false + + /** Cancel the application of this prototype. This can happen for a nullary + * application `f()` if `f` refers to a symbol that exists both in parameterless + * form `def f` and nullary method form `def f()`. A common example for such + * a method is `toString`. If in that case the type in the denotation is + * parameterless, we compensate by dropping the application. + */ + def markAsDropped() = { + assert(args.isEmpty) + toDrop = true + } + + def isDropped: Boolean = toDrop + override def toString = s"FunProto(${args mkString ","} => $resultType)" def map(tm: TypeMap)(implicit ctx: Context): FunProto = diff --git a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala index dcbd444f9..3192546cd 100644 --- a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala +++ b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala @@ -299,7 +299,9 @@ object RefChecks { !member.isAnyOverride) { // (*) Exclusion for default getters, fixes SI-5178. We cannot assign the Override flag to // the default getter: one default getter might sometimes override, sometimes not. Example in comment on ticket. - if (autoOverride(member)) + // Also excluded under Scala2 mode are overrides of default methods of Java traits. + if (autoOverride(member) || + other.owner.is(JavaTrait) && ctx.testScala2Mode("`override' modifier required when a Java 8 default method is re-implemented", member.pos)) member.setFlag(Override) else if (member.owner != clazz && other.owner != clazz && !(other.owner derivesFrom member.owner)) emitOverrideError( @@ -326,7 +328,8 @@ object RefChecks { overrideError("needs to be a stable, immutable value") } else if (member.is(ModuleVal) && !other.isRealMethod && !other.is(Deferred | Lazy)) { overrideError("may not override a concrete non-lazy value") - } else if (member.is(Lazy, butNot = Module) && !other.isRealMethod && !other.is(Lazy)) { + } else if (member.is(Lazy, butNot = Module) && !other.isRealMethod && !other.is(Lazy) && + !ctx.testScala2Mode("may not override a non-lazy value", member.pos)) { overrideError("may not override a non-lazy value") } else if (other.is(Lazy) && !other.isRealMethod && !member.is(Lazy)) { overrideError("must be declared lazy to override a lazy value") diff --git a/compiler/src/dotty/tools/dotc/typer/Typer.scala b/compiler/src/dotty/tools/dotc/typer/Typer.scala index 07a27a498..fe158dfe2 100644 --- a/compiler/src/dotty/tools/dotc/typer/Typer.scala +++ b/compiler/src/dotty/tools/dotc/typer/Typer.scala @@ -1640,13 +1640,19 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit case _ => false } - /** Add apply node or implicit conversions. Two strategies are tried, and the first - * that is successful is picked. If neither of the strategies are successful, continues with - * `fallBack`. + /** Potentially add apply node or implicit conversions. Before trying either, + * if the function is applied to an empty parameter list (), we try + * + * 0th strategy: If `tree` overrides a nullary method, mark the prototype + * so that the argument is dropped and return `tree` itself. + * + * After that, two strategies are tried, and the first that is successful is picked. + * If neither of the strategies are successful, continues with`fallBack`. * * 1st strategy: Try to insert `.apply` so that the result conforms to prototype `pt`. * This strategy is not tried if the prototype represents already * another `.apply` or `.apply()` selection. + * * 2nd strategy: If tree is a select `qual.name`, try to insert an implicit conversion * around the qualifier part `qual` so that the result conforms to the expected type * with wildcard result type. @@ -1661,8 +1667,15 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit def tryImplicit = tryInsertImplicitOnQualifier(tree, pt).getOrElse(fallBack) - if (isApplyProto(pt)) tryImplicit - else tryEither(tryApply(_))((_, _) => tryImplicit) + pt match { + case pt @ FunProto(Nil, _, _) + if tree.symbol.allOverriddenSymbols.exists(_.info.isNullaryMethod) => + pt.markAsDropped() + tree + case _ => + if (isApplyProto(pt)) tryImplicit + else tryEither(tryApply(_))((_, _) => tryImplicit) + } } /** If this tree is a select node `qual.name`, try to insert an implicit conversion diff --git a/compiler/test/dotc/scala-collections.blacklist b/compiler/test/dotc/scala-collections.blacklist index 97f12244e..7d3008bbc 100644 --- a/compiler/test/dotc/scala-collections.blacklist +++ b/compiler/test/dotc/scala-collections.blacklist @@ -1,221 +1,66 @@ -../scala-scala/src/library/scala/annotation/unchecked/uncheckedVariance.scala +## Errors having to do with bootstrap -../scala-scala/src/library/scala/AnyVal.scala -# 55 |abstract class AnyVal extends Any { -# |^ -# |illegal redefinition of standard class AnyVal +../scala-scala/src/library/scala/Function1.scala +../scala-scala/src/library/scala/Function2.scala +# Cyclic reference because of @specialized annotation -../scala-scala/src/library/scala/collection/convert/Wrappers.scala -# 34 | def remove() = throw new UnsupportedOperationException -# | ^ -# | overriding method remove in trait Iterator of type ()Unit; -# | method remove of type ()Unit needs `override' modifier +## Errors having to do with deep subtypes ../scala-scala/src/library/scala/collection/generic/ParSetFactory.scala - -../scala-scala/src/library/scala/collection/mutable/DefaultEntry.scala -# 22 | "(kv: " + key + ", " + value + ")" + (if (next != null) " -> " + next.toString else "") -# | ^^^^ -# | cyclic reference involving method toString - -../scala-scala/src/library/scala/collection/mutable/ImmutableMapAdaptor.scala -# 78 | override def toString() = imap.toString() -# | ^^^^^^^^^^^^^^^ -# | missing argument for parameter index of method apply: (index: Int)Char - -../scala-scala/src/library/scala/collection/mutable/LinkedHashMap.scala -# 102 | protected class FilteredKeys(p: A => Boolean) extends super.FilteredKeys(p) { -# | ^^^^^^^^^^^^^^^^^^^^ -# | cyclic inheritance: class FilteredKeys extends itself -# ... - -../scala-scala/src/library/scala/collection/mutable/ObservableMap.scala -# assertion failed - -../scala-scala/src/library/scala/collection/mutable/ObservableSet.scala -# 35 | publish(new Include(elem) with Undoable { def undo = -=(elem) }) -# | ^ -# | overriding method undo in trait Undoable of type ()Unit; -# | method undo of type => scala.collection.mutable.ObservableSet[A] has incompatible type - -../scala-scala/src/library/scala/collection/mutable/SynchronizedQueue.scala -# 102 | override def toString() = synchronized { super.toString() } -# | ^^^^^^^^^^^^^^^^ -# | missing argument for parameter index of method apply: (index: Int)Char - -../scala-scala/src/library/scala/collection/mutable/UnrolledBuffer.scala -# 347 | override def toString = array.take(size).mkString("Unrolled[" + array.length + "](", ", ", ")") + " -> " + (if (next ne null) next.toString else "") -# | ^^^^ -# | cyclic reference involving method toString - -../scala-scala/src/library/scala/collection/mutable/SynchronizedBuffer.scala -# assertion failed - -../scala-scala/src/library/scala/collection/parallel/mutable/ParArray.scala -# 648 | class Map[S](f: T => S, targetarr: Array[Any], offset: Int, howmany: Int) extends Task[Unit, Map[S]] { -# | ^ -# | overriding class Map in trait ParIterableLike; -# | class Map cannot be used here - class definitions cannot be overridden +# This gives a deep subtype violation when run with the rest of the whitelist. +# Works without -Yno-deep-subtypes, though. ../scala-scala/src/library/scala/collection/parallel/mutable/ParMap.scala -# 42 | override def updated [U >: V](key: K, value: U): ParMap[K, U] = this + ((key, value)) -# | ^^^^^^^^^^^^^^^^^^^^^ -# | found: scala.collection.parallel.ParMap[K, U] -# | required: scala.collection.parallel.mutable.ParMap'[K, U] -# | -# | where: ParMap is a trait in package parallel -# | ParMap' is a trait in package mutable - - -../scala-scala/src/library/scala/collection/parallel/mutable/ResizableParArrayCombiner.scala -# 91 | new { val chain = c } with ResizableParArrayCombiner[T] // was: with EnvironmentPassingCombiner[T, ParArray[T]] -# | ^ -# | early definitions are not supported; use trait parameters instead - -../scala-scala/src/library/scala/collection/parallel/mutable/ParTrieMap.scala -# 136 | it.iterated = this.iterated -# | ^^^^^^^^^^^ -# | value `iterated` is not a member of scala.collection.concurrent.TrieMapIterator[K, V](it) - -../scala-scala/src/library/scala/collection/parallel/package.scala -# 75 | implicit def factory2ops[From, Elem, To](bf: CanBuildFrom[From, Elem, To]) = new FactoryOps[From, Elem, To] { -# | ^ -# | result type of implicit definition needs to be given explicitly - -../scala-scala/src/library/scala/collection/parallel/ParIterable.scala -# 304 | protected implicit def task2ops[R, Tp](tsk: SSCTask[R, Tp]) = new TaskOps[R, Tp] { -# | ^ -# | result type of implicit definition needs to be given explicitly - -../scala-scala/src/library/scala/collection/parallel/ParIterableLike.scala -# 324 | protected implicit def delegatedSignalling2ops[PI <: DelegatedSignalling](it: PI) = new SignallingOps[PI] { -# | ^ -# | result type of implicit definition needs to be given explicitly +# -Yno-deep-subtypes fails ../scala-scala/src/library/scala/collection/parallel/ParMap.scala +# -Yno-deep-subtypes fails + ../scala-scala/src/library/scala/collection/parallel/ParMapLike.scala +# -Yno-deep-subtypes fails + + + +## Ycheck failures, presumably linked to TailCalls + +../scala-scala/src/library/scala/collection/parallel/ParIterableLike.scala +# -Ycheck:classOf fails ../scala-scala/src/library/scala/collection/parallel/ParSeqLike.scala -# 334 | protected trait Accessor[R, Tp] extends super.Accessor[R, Tp] { -# | ^^^^^^^^^^^^^^^^^^^^^ -# | cyclic inheritance: trait Accessor extends itself - -../scala-scala/src/library/scala/collection/parallel/RemainsIterator.scala -# 617 | class Zipped[S](ti: SeqSplitter[S]) extends super.Zipped[S](ti) with SeqSplitter[(T, S)] { -# | ^^^^^^^^^^^^^^^^^^ -# | cyclic inheritance: class Zipped extends itself - -../scala-scala/src/library/scala/collection/parallel/Tasks.scala -# 429 | fjtask.body.result -# | ^^^^^^^^^^^ -# | value `body` is not a member of ForkJoinTasks.this.WrappedTask[R, Tp](fjtask) - -../scala-scala/src/library/scala/concurrent/Future.scala -# 188 | implicit val ec = internalExecutor -# | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -# | type of implicit definition needs to be given explicitly - -../scala-scala/src/library/scala/concurrent/SyncChannel.scala -# 45 | writeReq.get -# | ^^^^^^^^^^^^ -# | none of the overloaded alternatives of method get in class SyncVar with types -# | (timeout: Long)Option[Boolean] -# | => Boolean -# | match expected type Unit - -../scala-scala/src/library/scala/concurrent/impl/ExecutionContextImpl.scala -# assertion failed - -../scala-scala/src/library/scala/concurrent/package.scala -# assertion failed +# -Ycheck:classOf fails + +../scala-scala/src/library/scala/util/control/TailCalls.scala +# -Ycheck:classOf fails + -../scala-scala/src/library/scala/Function1.scala -../scala-scala/src/library/scala/Function2.scala -../scala-scala/src/library/scala/Function3.scala -../scala-scala/src/library/scala/Function4.scala -../scala-scala/src/library/scala/Function5.scala -../scala-scala/src/library/scala/Function6.scala -../scala-scala/src/library/scala/Function7.scala -../scala-scala/src/library/scala/Function8.scala -../scala-scala/src/library/scala/Function9.scala -../scala-scala/src/library/scala/Function10.scala -../scala-scala/src/library/scala/Function11.scala -../scala-scala/src/library/scala/Function12.scala -../scala-scala/src/library/scala/Function13.scala -../scala-scala/src/library/scala/Function14.scala -../scala-scala/src/library/scala/Function15.scala -../scala-scala/src/library/scala/Function16.scala -../scala-scala/src/library/scala/Function17.scala -../scala-scala/src/library/scala/Function18.scala -../scala-scala/src/library/scala/Function19.scala -../scala-scala/src/library/scala/Function20.scala -../scala-scala/src/library/scala/Function21.scala -../scala-scala/src/library/scala/Function22.scala - -../scala-scala/src/library/scala/io/BufferedSource.scala -# 38 | override lazy val iter = ( -# | ^ -# | overriding getter iter in class Source of type => collection.Iterator[Char]; -# | lazy value iter of type collection.Iterator[Char] may not override a non-lazy value - -../scala-scala/src/library/scala/io/Source.scala -# 303 | report(pos, msg, out) -# | ^^^ -# | not found: msg + +## Errors having to do with unavailable APIs or language features: ../scala-scala/src/library/scala/reflect/ClassManifestDeprecatedApis.scala # 51 | import Manifest._ # | ^^^^^^^^ # | not found: Manifest + ../scala-scala/src/library/scala/reflect/ClassTag.scala # 124 | val Short : ClassTag[scala.Short] = Manifest.Short # | ^^^^^^^^ # | not found: Manifest + ../scala-scala/src/library/scala/reflect/Manifest.scala # 104 | private def readResolve(): Any = Manifest.Short # | ^^^^^^^^ # | not found: Manifest -../scala-scala/src/library/scala/reflect/NameTransformer.scala -# 89 | if (buf eq null) name else buf.toString() -# | ^^^^^^^^^^^^^^ -# | missing argument for parameter index of method apply: (index: Int)Char -../scala-scala/src/library/scala/reflect/package.scala -# 63 | private[scala] def materializeClassTag[T](): ClassTag[T] = macro ??? -# | ^^^^^ -# | not found: macro - -../scala-scala/src/library/scala/runtime/Tuple2Zipped.scala -# 122 | val buf = bf(x._1) -# | ^^^^ -# | found: T1 -# | required: CC1[_] - -../scala-scala/src/library/scala/runtime/Tuple3Zipped.scala -# 131 | val buf = bf(x._1) -# | ^^^^ -# | found: T1 -# | required: CC1[_] - -../scala-scala/src/library/scala/StringContext.scala -# 168 | def f[A >: Any](args: A*): String = macro ??? -# | ^^^^^ -# | not found: macro ../scala-scala/src/library/scala/text/Document.scala +# Lots of type errors for pattern matches, having to do with the fact +# that Document contains a :: method without corresponding extractor, +# but still wants to extract lists using ::. We won't support that. +# Since Document should have been removed already, let's ignore it. -../scala-scala/src/library/scala/util/control/Exception.scala -# scala.MatchError: PostfixOp(Select(Ident(pf),isDefinedAt),_) (of class dotty.tools.dotc.ast.untpd$PostfixOp) -# at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1173) - -../scala-scala/src/library/scala/util/control/TailCalls.scala -# assertion failed - -../scala-scala/src/library/scala/util/hashing/Hashing.scala -# 35 | implicit def default[T] = new Default[T] -# | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -# | result type of implicit definition needs to be given explicitly - +../scala-scala/src/library/scala/AnyVal.scala +# 55 |abstract class AnyVal extends Any { +# |^ +# |illegal redefinition of standard class AnyVal +# (This is intended) -../scala-scala/src/library/scala/util/Sorting.scala -# assertion failed: invalid prefix ImplicitMethodType(List(ord), List(RefinedType(TypeRef(ThisType(TypeRef(NoPrefix,math)),Ordering), scala$math$Ordering$$T, TypeAlias(TypeRef(NoPrefix,K), 0))), RefinedType(TypeRef(ThisType(TypeRef(NoPrefix,math)),Ordering), scala$math$Ordering$$T, TypeAlias(TypeRef(NoPrefix,K), 0))) diff --git a/compiler/test/dotc/scala-collections.whitelist b/compiler/test/dotc/scala-collections.whitelist index cdec1ab12..cb7fd29b9 100644 --- a/compiler/test/dotc/scala-collections.whitelist +++ b/compiler/test/dotc/scala-collections.whitelist @@ -7,6 +7,8 @@ ../scala-scala/src/library/scala/runtime/RichInt.scala ../scala-scala/src/library/scala/runtime/RichLong.scala ../scala-scala/src/library/scala/runtime/RichShort.scala +../scala-scala/src/library/scala/runtime/Tuple2Zipped.scala +../scala-scala/src/library/scala/runtime/Tuple3Zipped.scala ../scala-scala/src/library/scala/Array.scala ../scala-scala/src/library/scala/NotImplementedError.scala ../scala-scala/src/library/scala/AnyValCompanion.scala @@ -62,6 +64,7 @@ ../scala-scala/src/library/scala/Serializable.scala ../scala-scala/src/library/scala/Specializable.scala ../scala-scala/src/library/scala/Symbol.scala +../scala-scala/src/library/scala/StringContext.scala ../scala-scala/src/library/scala/UninitializedError.scala ../scala-scala/src/library/scala/UninitializedFieldError.scala ../scala-scala/src/library/scala/collection/IndexedSeqOptimized.scala @@ -87,6 +90,13 @@ ../scala-scala/src/library/scala/collection/mutable/ArrayBuilder.scala ../scala-scala/src/library/scala/collection/mutable/ObservableBuffer.scala +../scala-scala/src/library/scala/collection/mutable/DefaultEntry.scala +../scala-scala/src/library/scala/collection/mutable/LinkedHashMap.scala +../scala-scala/src/library/scala/collection/mutable/ObservableMap.scala +../scala-scala/src/library/scala/collection/mutable/ObservableSet.scala +../scala-scala/src/library/scala/collection/mutable/SynchronizedQueue.scala +../scala-scala/src/library/scala/collection/mutable/UnrolledBuffer.scala +../scala-scala/src/library/scala/collection/mutable/SynchronizedBuffer.scala ../scala-scala/src/library/scala/collection/immutable/Stack.scala ../scala-scala/src/library/scala/collection/immutable/StringLike.scala @@ -265,10 +275,9 @@ ../scala-scala/src/library/scala/collection/generic/SetFactory.scala ../scala-scala/src/library/scala/collection/generic/ParFactory.scala -# https://github.com/lampepfl/dotty/issues/974 -> @smarter ../scala-scala/src/library/scala/collection/generic/MutableSortedSetFactory.scala -# cyclic reference, maybe related to #974 -> @smarter +# deep subtype #../scala-scala/src/library/scala/collection/generic/ParSetFactory.scala ../scala-scala/src/library/scala/collection/generic/OrderedTraversableFactory.scala @@ -284,12 +293,14 @@ ../scala-scala/src/library/scala/util/Try.scala +../scala-scala/src/library/scala/util/control/Exception.scala ../scala-scala/src/library/scala/util/control/Breaks.scala ../scala-scala/src/library/scala/util/control/ControlThrowable.scala ../scala-scala/src/library/scala/util/control/NonFatal.scala ../scala-scala/src/library/scala/util/control/NoStackTrace.scala ../scala-scala/src/library/scala/util/DynamicVariable.scala ../scala-scala/src/library/scala/util/Either.scala +../scala-scala/src/library/scala/util/hashing/Hashing.scala ../scala-scala/src/library/scala/util/hashing/ByteswapHashing.scala ../scala-scala/src/library/scala/util/hashing/MurmurHash3.scala ../scala-scala/src/library/scala/util/hashing/package.scala @@ -297,6 +308,7 @@ ../scala-scala/src/library/scala/util/MurmurHash.scala ../scala-scala/src/library/scala/util/Properties.scala ../scala-scala/src/library/scala/util/Random.scala +../scala-scala/src/library/scala/util/Sorting.scala ../scala-scala/src/library/scala/collection/mutable/AnyRefMap.scala ../scala-scala/src/library/scala/collection/mutable/ArrayBuffer.scala @@ -363,6 +375,7 @@ ../scala-scala/src/library/scala/collection/mutable/TreeSet.scala ../scala-scala/src/library/scala/collection/mutable/Undoable.scala ../scala-scala/src/library/scala/collection/mutable/WeakHashMap.scala +../scala-scala/src/library/scala/collection/mutable/ImmutableMapAdaptor.scala ../scala-scala/src/library/scala/collection/convert/DecorateAsJava.scala ../scala-scala/src/library/scala/collection/convert/DecorateAsScala.scala @@ -370,6 +383,7 @@ ../scala-scala/src/library/scala/collection/convert/package.scala ../scala-scala/src/library/scala/collection/convert/WrapAsJava.scala ../scala-scala/src/library/scala/collection/convert/WrapAsScala.scala +../scala-scala/src/library/scala/collection/convert/Wrappers.scala ../scala-scala/src/library/scala/collection/concurrent/Map.scala ../scala-scala/src/library/scala/collection/concurrent/TrieMap.scala @@ -386,8 +400,8 @@ ../scala-scala/src/library/scala/compat/Platform.scala -../scala-scala/src/library/scala/sys/SystemProperties.scala ../scala-scala/src/library/scala/sys/package.scala +../scala-scala/src/library/scala/sys/SystemProperties.scala ../scala-scala/src/library/scala/sys/Prop.scala ../scala-scala/src/library/scala/sys/PropImpl.scala ../scala-scala/src/library/scala/sys/BooleanProp.scala @@ -413,6 +427,8 @@ ../scala-scala/src/library/scala/io/Codec.scala ../scala-scala/src/library/scala/io/Position.scala ../scala-scala/src/library/scala/io/StdIn.scala +../scala-scala/src/library/scala/io/BufferedSource.scala +../scala-scala/src/library/scala/io/Source.scala ../scala-scala/src/library/scala/math/BigDecimal.scala ../scala-scala/src/library/scala/math/BigInt.scala @@ -428,6 +444,8 @@ ../scala-scala/src/library/scala/reflect/macros/internal/macroImpl.scala ../scala-scala/src/library/scala/reflect/NoManifest.scala ../scala-scala/src/library/scala/reflect/OptManifest.scala +../scala-scala/src/library/scala/reflect/NameTransformer.scala +../scala-scala/src/library/scala/reflect/package.scala ../scala-scala/src/library/scala/Responder.scala @@ -435,6 +453,8 @@ ../scala-scala/src/library/scala/collection/script/Message.scala ../scala-scala/src/library/scala/collection/script/Scriptable.scala +../scala-scala/src/library/scala/concurrent/package.scala +../scala-scala/src/library/scala/concurrent/Future.scala ../scala-scala/src/library/scala/concurrent/Awaitable.scala ../scala-scala/src/library/scala/concurrent/BatchingExecutor.scala ../scala-scala/src/library/scala/concurrent/BlockContext.scala @@ -455,9 +475,19 @@ ../scala-scala/src/library/scala/concurrent/SyncVar.scala ../scala-scala/src/library/scala/concurrent/TaskRunner.scala ../scala-scala/src/library/scala/concurrent/ThreadPoolRunner.scala - +../scala-scala/src/library/scala/concurrent/SyncChannel.scala +../scala-scala/src/library/scala/concurrent/impl/ExecutionContextImpl.scala + +../scala-scala/src/library/scala/collection/parallel/package.scala +../scala-scala/src/library/scala/collection/parallel/ParIterable.scala +#../scala-scala/src/library/scala/collection/parallel/ParMap.scala +#../scala-scala/src/library/scala/collection/parallel/ParMapLike.scala +#../scala-scala/src/library/scala/collection/parallel/ParIterableLike.scala +#../scala-scala/src/library/scala/collection/parallel/ParSeqLike.scala ../scala-scala/src/library/scala/collection/parallel/Combiner.scala ../scala-scala/src/library/scala/collection/parallel/mutable/LazyCombiner.scala +../scala-scala/src/library/scala/collection/parallel/mutable/ResizableParArrayCombiner.scala +../scala-scala/src/library/scala/collection/parallel/RemainsIterator.scala ../scala-scala/src/library/scala/collection/parallel/mutable/package.scala ../scala-scala/src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala ../scala-scala/src/library/scala/collection/parallel/mutable/ParHashMap.scala @@ -468,13 +498,17 @@ ../scala-scala/src/library/scala/collection/parallel/mutable/ParSeq.scala ../scala-scala/src/library/scala/collection/parallel/mutable/ParSet.scala ../scala-scala/src/library/scala/collection/parallel/mutable/ParSetLike.scala +../scala-scala/src/library/scala/collection/parallel/mutable/ParTrieMap.scala ../scala-scala/src/library/scala/collection/parallel/mutable/UnrolledParArrayCombiner.scala +../scala-scala/src/library/scala/collection/parallel/mutable/ParArray.scala +#../scala-scala/src/library/scala/collection/parallel/mutable/ParMap.scala ../scala-scala/src/library/scala/collection/parallel/ParSeq.scala ../scala-scala/src/library/scala/collection/parallel/ParSet.scala ../scala-scala/src/library/scala/collection/parallel/ParSetLike.scala ../scala-scala/src/library/scala/collection/parallel/PreciseSplitter.scala ../scala-scala/src/library/scala/collection/parallel/Splitter.scala ../scala-scala/src/library/scala/collection/parallel/TaskSupport.scala +../scala-scala/src/library/scala/collection/parallel/Tasks.scala ../scala-scala/src/library/scala/Console.scala ../scala-scala/src/library/scala/Enumeration.scala @@ -503,6 +537,7 @@ ../scala-scala/src/library/scala/annotation/tailrec.scala ../scala-scala/src/library/scala/annotation/TypeConstraint.scala ../scala-scala/src/library/scala/annotation/unchecked/uncheckedStable.scala +../scala-scala/src/library/scala/annotation/unchecked/uncheckedVariance.scala ../scala-scala/src/library/scala/annotation/unspecialized.scala ../scala-scala/src/library/scala/annotation/varargs.scala @@ -546,6 +581,28 @@ ../scala-scala/src/library/scala/Function.scala ../scala-scala/src/library/scala/Function0.scala +#../scala-scala/src/library/scala/Function1.scala +#../scala-scala/src/library/scala/Function2.scala +../scala-scala/src/library/scala/Function3.scala +../scala-scala/src/library/scala/Function4.scala +../scala-scala/src/library/scala/Function5.scala +../scala-scala/src/library/scala/Function6.scala +../scala-scala/src/library/scala/Function7.scala +../scala-scala/src/library/scala/Function8.scala +../scala-scala/src/library/scala/Function9.scala +../scala-scala/src/library/scala/Function10.scala +../scala-scala/src/library/scala/Function11.scala +../scala-scala/src/library/scala/Function12.scala +../scala-scala/src/library/scala/Function13.scala +../scala-scala/src/library/scala/Function14.scala +../scala-scala/src/library/scala/Function15.scala +../scala-scala/src/library/scala/Function16.scala +../scala-scala/src/library/scala/Function17.scala +../scala-scala/src/library/scala/Function18.scala +../scala-scala/src/library/scala/Function19.scala +../scala-scala/src/library/scala/Function20.scala +../scala-scala/src/library/scala/Function21.scala +../scala-scala/src/library/scala/Function22.scala ../scala-scala/src/library/scala/Tuple1.scala ../scala-scala/src/library/scala/Tuple2.scala diff --git a/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala index 43b679c71..483c22984 100644 --- a/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala +++ b/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala @@ -46,7 +46,7 @@ class DocASTPhase extends Phase { def membersFromSymbol(sym: Symbol): List[Entity] = { if (sym.info ne NoType) { - val defs = sym.info.bounds.hi.membersBasedOnFlags(Flags.Method, Flags.Synthetic | Flags.Private) + val defs = sym.info.bounds.hi.finalResultType.membersBasedOnFlags(Flags.Method, Flags.Synthetic | Flags.Private) .filterNot(_.symbol.owner.name.show == "Any") .map { meth => DefImpl( diff --git a/tests/pos/hkwild.scala b/tests/pos/hkwild.scala new file mode 100644 index 000000000..49bea7d01 --- /dev/null +++ b/tests/pos/hkwild.scala @@ -0,0 +1,6 @@ +class Test[T1](val x: T1) { + def invert[El1, CC1[X]](implicit w1: T1 <:< CC1[El1]) = { + val buf: CC1[_] = w1(x) + ??? + } +} |