diff options
Diffstat (limited to 'sources/scalac/typechecker')
-rw-r--r-- | sources/scalac/typechecker/Analyzer.java | 14 | ||||
-rw-r--r-- | sources/scalac/typechecker/Infer.java | 21 |
2 files changed, 24 insertions, 11 deletions
diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java index b11f3ac85a..3457499228 100644 --- a/sources/scalac/typechecker/Analyzer.java +++ b/sources/scalac/typechecker/Analyzer.java @@ -917,9 +917,9 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { enterSym(params[i]); switch (params[i]) { case ValDef(int mods, _, _, _): - if ((mods & REPEATED) != 0 && params.length > 1) + if ((mods & REPEATED) != 0 && i != params.length - 1) error(params[i].pos, - "`*' parameter must be the only parameter of a `('...`)' section"); + "`*' parameter must be the last parameter of a `('...`)' section"); } } return Tree.symbolOf(params); @@ -1782,11 +1782,13 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { } } // desugarizing ident patterns - if (params.length == 1 && (params[0].flags & REPEATED) != 0) { + if (params.length > 0 && + (params[params.length - 1].flags & REPEATED) != 0) { if (( mode & PATTERNmode ) != 0 ) { desug_allIdentPatterns( args, context.owner ); } else { - assert (args.length != 1 || !(args[0] instanceof Tree.Sequence)); + assert (args.length != params.length || + !(args[params.length-1] instanceof Tree.Sequence)); } } return argtypes; @@ -2392,7 +2394,9 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { switch (alttp) { case MethodType(Symbol[] params, _): if (params.length == args.length || - params.length == 1 && (params[0].flags & REPEATED) != 0) { + params.length > 0 && + args.length >= params.length - 1 && + (params[params.length-1].flags & REPEATED) != 0) { matching2 = matching1; matching1 = i; } diff --git a/sources/scalac/typechecker/Infer.java b/sources/scalac/typechecker/Infer.java index ea6cb4ddc4..b2b38ef2da 100644 --- a/sources/scalac/typechecker/Infer.java +++ b/sources/scalac/typechecker/Infer.java @@ -333,15 +333,24 @@ public class Infer implements Modifiers, Kinds { * If `params' is a repeated parameter, a list of `length' copies * of its type is returned. */ - public Type[] formalTypes(Symbol[] params, int length) { + public Type[] formalTypes(Symbol[] params, int nargs) { Type[] result; - if (params.length == 1 && (params[0].flags & REPEATED) != 0) { - Type[] formals = new Type[length]; - Type[] args = params[0].type().typeArgs(); + if (params.length > 0 && + (params[params.length-1].flags & REPEATED) != 0) { + Type[] args = params[params.length-1].type().typeArgs(); if (args.length == 1) { Type ft = args[0]; - // params[0] has type Seq[T], we need T here - for (int i = 0; i < length; i++) formals[i] = ft; + // last param has type Seq[T], we need T here + Type[] formals = new Type[nargs]; + int i = 0; + while (i < params.length-1) { + formals[i] = params[i].type(); + i++; + } + while (i < nargs) { + formals[i] = ft; + i++; + } return formals; } } |