aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/ast/tpd.scala16
-rw-r--r--src/dotty/tools/dotc/typer/Applications.scala18
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala2
3 files changed, 18 insertions, 18 deletions
diff --git a/src/dotty/tools/dotc/ast/tpd.scala b/src/dotty/tools/dotc/ast/tpd.scala
index de9d2165c..84747aecd 100644
--- a/src/dotty/tools/dotc/ast/tpd.scala
+++ b/src/dotty/tools/dotc/ast/tpd.scala
@@ -367,16 +367,10 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
def newArr(symbol: TermSymbol) =
ref(defn.DottyArraysModule).select(symbol).withPos(pos)
- if (!ctx.erasedTypes)
- if (TypeErasure.isUnboundedGeneric(elemTpe)) {
- //exists only before erasure
- assert(dims.elems.tail.isEmpty)
- assert(!ctx.isAfterTyper) // needs to infer an implicit
- newArr(defn.newGenericArrayMethod).appliedToType(elemTpe).appliedTo(dims.elems.head)
- }
- else
- newArr(defn.newArrayMethod).appliedToTypeTrees(TypeTree(returnTpe) :: Nil).appliedToArgs(clsOf(elemTpe) :: clsOf(returnTpe) :: dims :: Nil).withPos(pos)
- else // after erasure
+ if (!ctx.erasedTypes) {
+ assert(!TypeErasure.isUnboundedGeneric(elemTpe)) //needs to be done during typer. See Applications.convertNewGenericArray
+ newArr(defn.newArrayMethod).appliedToTypeTrees(TypeTree(returnTpe) :: Nil).appliedToArgs(clsOf(elemTpe) :: clsOf(returnTpe) :: dims :: Nil).withPos(pos)
+ } else // after erasure
newArr(defn.newArrayMethod).appliedToArgs(clsOf(elemTpe) :: clsOf(returnTpe) :: dims :: Nil).withPos(pos)
}
@@ -754,7 +748,7 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
/** If inititializer tree is `_', the default value of its type,
* otherwise the tree itself.
- */
+ * */
def wildcardToDefault(implicit ctx: Context) =
if (isWildcardArg(tree)) defaultValue(tree.tpe) else tree
diff --git a/src/dotty/tools/dotc/typer/Applications.scala b/src/dotty/tools/dotc/typer/Applications.scala
index 7fb71b7fb..2cec4bf08 100644
--- a/src/dotty/tools/dotc/typer/Applications.scala
+++ b/src/dotty/tools/dotc/typer/Applications.scala
@@ -560,7 +560,7 @@ trait Applications extends Compatibility { self: Typer =>
if (proto.argsAreTyped) new ApplyToTyped(tree, fun1, funRef, proto.typedArgs, pt)
else new ApplyToUntyped(tree, fun1, funRef, proto, pt)(argCtx(tree))
val result = app.result
- convertNewArray(ConstFold(result))
+ convertNewGenericArray(ConstFold(result))
} { (failedVal, failedState) =>
val fun2 = tryInsertImplicitOnQualifier(fun1, proto)
if (fun1 eq fun2) {
@@ -636,14 +636,20 @@ trait Applications extends Compatibility { self: Typer =>
def adaptTypeArg(tree: tpd.Tree, bound: Type)(implicit ctx: Context): tpd.Tree =
tree.withType(tree.tpe.etaExpandIfHK(bound))
- /** Rewrite `new Array[T](....)` trees to calls of newXYZArray methods.
+ /** Rewrite `new Array[T](....)` if T is an unbounded generic to calls to newGenericArray.
* It is performed during typer as creation of generic arrays needs a classTag.
- * we rely on implicit search to find one
+ * we rely on implicit search to find one.
*/
- def convertNewArray(tree: tpd.Tree)(implicit ctx: Context): tpd.Tree = tree match {
- case Apply(TypeApply(tycon, targ :: Nil), args) if tycon.symbol == defn.ArrayConstructor =>
+ def convertNewGenericArray(tree: tpd.Tree)(implicit ctx: Context): tpd.Tree = tree match {
+ case Apply(TypeApply(tycon, targs@(targ :: Nil)), args) if tycon.symbol == defn.ArrayConstructor =>
fullyDefinedType(tree.tpe, "array", tree.pos)
- newArray(targ.tpe, tree.tpe, tree.pos, JavaSeqLiteral(args, TypeTree(defn.IntClass.typeRef)))
+
+ def newGenericArrayCall =
+ ref(defn.DottyArraysModule).select(defn.newGenericArrayMethod).withPos(tree.pos).appliedToTypeTrees(targs).appliedToArgs(args)
+
+ if (TypeErasure.isUnboundedGeneric(targ.tpe))
+ newGenericArrayCall
+ else tree
case _ =>
tree
}
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index 2575dbec2..53296f9c9 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -1684,7 +1684,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
case _ => Nil
}
if (typeArgs.isEmpty) typeArgs = constrained(poly, tree)._2
- convertNewArray(
+ convertNewGenericArray(
adaptInterpolated(tree.appliedToTypes(typeArgs), pt, original))
}
case wtp =>