diff options
-rw-r--r-- | src/dotty/tools/dotc/ast/Desugar.scala | 4 | ||||
-rw-r--r-- | src/dotty/tools/dotc/ast/untpd.scala | 7 | ||||
-rw-r--r-- | src/dotty/tools/dotc/parsing/Parsers.scala | 4 | ||||
-rw-r--r-- | tests/pos/overloaded.scala | 12 |
4 files changed, 22 insertions, 5 deletions
diff --git a/src/dotty/tools/dotc/ast/Desugar.scala b/src/dotty/tools/dotc/ast/Desugar.scala index 2e1aa48bf..70c3e76f6 100644 --- a/src/dotty/tools/dotc/ast/Desugar.scala +++ b/src/dotty/tools/dotc/ast/Desugar.scala @@ -417,7 +417,7 @@ object desugar { * tree @cls */ def makeAnnotated(cls: Symbol, tree: Tree)(implicit ctx: Context) = - Annotated(TypedSplice(tpd.New(cls.typeRef)), tree) + Annotated(TypedSplice(tpd.New(cls.typeRef, Nil)), tree) private def derivedValDef(mods: Modifiers, named: NameTree, tpt: Tree, rhs: Tree) = ValDef(mods, named.name.asTermName, tpt, rhs).withPos(named.pos) @@ -700,7 +700,7 @@ object desugar { * The result is used for validity checking, is thrown away afterwards. */ def refinedTypeToClass(tree: RefinedTypeTree)(implicit ctx: Context): TypeDef = { - val parent = Select(New(tree.tpt), nme.CONSTRUCTOR) + val parent = New(tree.tpt, Nil) val impl = Template(emptyConstructor, parent :: Nil, EmptyValDef, tree.refinements) TypeDef(Modifiers(), tpnme.REFINE_CLASS, impl) } diff --git a/src/dotty/tools/dotc/ast/untpd.scala b/src/dotty/tools/dotc/ast/untpd.scala index 351548d91..740e8f110 100644 --- a/src/dotty/tools/dotc/ast/untpd.scala +++ b/src/dotty/tools/dotc/ast/untpd.scala @@ -107,7 +107,7 @@ object untpd extends Trees.Instance[Untyped] with TreeInfo[Untyped] { } var prefix: Tree = Select(New(tycon), nme.CONSTRUCTOR) if (targs.nonEmpty) prefix = TypeApply(prefix, targs) - (prefix /: argss)(Apply(_, _)) + ensureApplied((prefix /: argss)(Apply(_, _))) } def Block(stat: Tree, expr: Tree): Block = @@ -116,6 +116,11 @@ object untpd extends Trees.Instance[Untyped] with TreeInfo[Untyped] { def Apply(fn: Tree, arg: Tree): Apply = Apply(fn, arg :: Nil) + def ensureApplied(tpt: Tree) = tpt match { + case _: Apply => tpt + case _ => Apply(tpt, Nil) + } + def AppliedTypeTree(tpt: Tree, arg: Tree): AppliedTypeTree = AppliedTypeTree(tpt, arg :: Nil) diff --git a/src/dotty/tools/dotc/parsing/Parsers.scala b/src/dotty/tools/dotc/parsing/Parsers.scala index ccb7d26bf..ae066e9a9 100644 --- a/src/dotty/tools/dotc/parsing/Parsers.scala +++ b/src/dotty/tools/dotc/parsing/Parsers.scala @@ -1423,7 +1423,7 @@ object Parsers { /** Annotation ::= `@' SimpleType {ArgumentExprs} */ def annot() = - adjustStart(accept(AT)) { argumentExprss(wrapNew(simpleType())) } + adjustStart(accept(AT)) { ensureApplied(argumentExprss(wrapNew(simpleType()))) } def annotations(skipNewLines: Boolean = false): List[Tree] = { if (skipNewLines) newLineOptWhenFollowedBy(AT) @@ -1824,7 +1824,7 @@ object Parsers { /** ConstrApp ::= SimpleType {ParArgumentExprs} */ val constrApp = () => - parArgumentExprss(wrapNew(simpleType())) + ensureApplied(parArgumentExprss(wrapNew(simpleType()))) /** Template ::= ConstrApps [TemplateBody] | TemplateBody * ConstrApps ::= ConstrApp {`with' ConstrApp} diff --git a/tests/pos/overloaded.scala b/tests/pos/overloaded.scala index d76585f93..ba5d8c205 100644 --- a/tests/pos/overloaded.scala +++ b/tests/pos/overloaded.scala @@ -6,5 +6,17 @@ object overloaded { val x1 = f("abc") val x2 = f(new Integer(1)) val x3 = f(null) + + val x4: String => String = f + val x5: String => Any = f + val x6: Any = f _ + + def g(): Int = 1 + def g(x: Int): Int = 2 + + val y1: Int => Int = g + val y2: Any = g _ + + println(g) } |