summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2005-01-31 17:59:38 +0000
committerMartin Odersky <odersky@gmail.com>2005-01-31 17:59:38 +0000
commit6f55f1053bd379616d52d01589a74ee8fee69cd1 (patch)
tree9b335b997224355eb74587dc1f91fd5044c716a7
parent54c7abb0d0d45cdc9ed709c99f6b95f0dbad72cf (diff)
downloadscala-6f55f1053bd379616d52d01589a74ee8fee69cd1.tar.gz
scala-6f55f1053bd379616d52d01589a74ee8fee69cd1.tar.bz2
scala-6f55f1053bd379616d52d01589a74ee8fee69cd1.zip
*** empty log message ***
-rw-r--r--sources/scala/Predef.scala1
-rw-r--r--sources/scala/tools/scalac/typechecker/Analyzer.scala30
-rw-r--r--sources/scala/tools/scalac/typechecker/Infer.scala1
3 files changed, 14 insertions, 18 deletions
diff --git a/sources/scala/Predef.scala b/sources/scala/Predef.scala
index a260a97d21..c8eec04235 100644
--- a/sources/scala/Predef.scala
+++ b/sources/scala/Predef.scala
@@ -66,6 +66,7 @@ object Predef {
for (val x <- xs.elements) { array(i) = x; i = i + 1; }
array;
}
+
def Array(x: boolean, xs: boolean*): Array[boolean] = {
val array = new Array[boolean](xs.length + 1);
array(0) = x;
diff --git a/sources/scala/tools/scalac/typechecker/Analyzer.scala b/sources/scala/tools/scalac/typechecker/Analyzer.scala
index 86f0654849..e63c61aefb 100644
--- a/sources/scala/tools/scalac/typechecker/Analyzer.scala
+++ b/sources/scala/tools/scalac/typechecker/Analyzer.scala
@@ -2708,29 +2708,23 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer(
}
// if function is overloaded with one alternative
- // whose arity matches argument length, preselect this alternative.
+ // whose arity matches argument length and whose result type matches prototype,
+ // preselect this alternative.
fn1.getType() match {
case Type$OverloadedType(alts, alttypes) =>
+ val argtypes = new Array[Type](args.length);
+ { var i = 0; while (i < argtypes.length) {
+ argtypes(i) = definitions.ALL_TYPE(); i = i + 1
+ }}
var matching1: int = -1;
var matching2: int = -1;
- for (val i <- Iterator.range(0, alttypes.length)) {
- // can't replace with while because of backend crash???
- val alttp: Type = alttypes(i) match {
- case Type$PolyType(_, restp) => restp;
- case t => t
+ { var i = 0; while (i < alttypes.length) {
+ if (infer.isApplicable(alttypes(i), argtypes, pt)) {
+ System.out.println("matches: " + alttypes(i) + " with " + pt);//debug
+ matching2 = matching1;
+ matching1 = i;
}
- alttp match {
- case Type$MethodType(params, _) =>
- if (params.length == args.length ||
- params.length > 0 &&
- args.length > params.length - 1 &&
- (params(params.length-1).flags & REPEATED) != 0) {
- matching2 = matching1;
- matching1 = i;
- }
- case _ =>
- }
- }
+ }}
if (matching1 >= 0 && matching2 < 0)
fn1.setSymbol(alts(matching1)).setType(alttypes(matching1));
case _ =>
diff --git a/sources/scala/tools/scalac/typechecker/Infer.scala b/sources/scala/tools/scalac/typechecker/Infer.scala
index 68e21f84d3..e5d3d433f1 100644
--- a/sources/scala/tools/scalac/typechecker/Infer.scala
+++ b/sources/scala/tools/scalac/typechecker/Infer.scala
@@ -1314,6 +1314,7 @@ class Infer(global: scalac_Global, gen: TreeGen, make: TreeFactory) extends scal
* If pt is AnyType, leave tree unchanged.
*/
def methodAlternative(tree: Tree, alts: Array[Symbol], alttypes: Array[Type], argtypes: Array[Type], pt: Type): unit = {
+ //System.out.println("meth alt " + ArrayApply.toString(argtypes.asInstanceOf[Array[Object]], "[", ",", "]") + pt);//debug
if (alts.length == 1) {
tree.setSymbol(alts(0)).setType(alttypes(0));
return;