summaryrefslogtreecommitdiff
path: root/sources/scalac
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2004-01-06 14:02:00 +0000
committerMartin Odersky <odersky@gmail.com>2004-01-06 14:02:00 +0000
commit22499e81b5526b8f8713fc5703d785d12439fef4 (patch)
tree18f87fac93bf8577f46477c7efb0605512c936ff /sources/scalac
parent7b8b6d0adf3e1e84829f9c1bc97854883cbd1ebd (diff)
downloadscala-22499e81b5526b8f8713fc5703d785d12439fef4.tar.gz
scala-22499e81b5526b8f8713fc5703d785d12439fef4.tar.bz2
scala-22499e81b5526b8f8713fc5703d785d12439fef4.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac')
-rw-r--r--sources/scalac/symtab/Definitions.java4
-rw-r--r--sources/scalac/symtab/Symbol.java18
-rw-r--r--sources/scalac/symtab/Type.java1
3 files changed, 21 insertions, 2 deletions
diff --git a/sources/scalac/symtab/Definitions.java b/sources/scalac/symtab/Definitions.java
index bcf7b755bf..d22891c341 100644
--- a/sources/scalac/symtab/Definitions.java
+++ b/sources/scalac/symtab/Definitions.java
@@ -150,7 +150,9 @@ public class Definitions {
public final int FUNCTION_COUNT = 10;
public final Symbol[] FUNCTION_CLASS = new Symbol[FUNCTION_COUNT];
public final Type FUNCTION_TYPE(Type[] args, Type result) {
- assert 0 <= args.length && args.length < FUNCTION_COUNT: args.length;
+ assert 0 <= args.length;
+ if (args.length >= FUNCTION_COUNT)
+ throw new Type.Error("function has too many arguments; limit = " + (FUNCTION_COUNT-1));
args = Type.cloneArray(args, 1);
args[args.length - 1] = result;
return getType(FUNCTION_CLASS[args.length - 1], args);
diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java
index f7430a8402..8deb6ef2e6 100644
--- a/sources/scalac/symtab/Symbol.java
+++ b/sources/scalac/symtab/Symbol.java
@@ -1300,7 +1300,23 @@ public class TermSymbol extends Symbol {
Scope.Entry e = scope.lookupEntry(name);
if (e.owner == scope && e.sym.isExternal() && e.sym.kind == VAL) {
TermSymbol sym = (TermSymbol) e.sym;
- sym.update(pos, flags);
+ if (sym.isInitialized()) {
+ switch (sym.type()) {
+ case OverloadedType(Symbol[] alts, Type[] alttypes):
+ int i = 0;
+ while (i < alts.length && !alts[i].isExternal())
+ i++;
+ if (i < alts.length) {
+ //System.out.println("PATCH: " + alts[i] + ":" + alttypes[i]);//DEBUG
+ alts[i].update(pos, flags);
+ if (i == alts.length - 1)
+ sym.update(pos, sym.flags);
+ return (TermSymbol) alts[i];
+ }
+ throw new ApplicationError("TermSymbol.define " + sym);
+ }
+ }
+ sym.update(pos, flags);
return sym;
} else {
return new TermSymbol(pos, name, owner, flags);
diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java
index 93918f0c54..ae2aaf5a39 100644
--- a/sources/scalac/symtab/Type.java
+++ b/sources/scalac/symtab/Type.java
@@ -2574,6 +2574,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags {
j++;
}
if (j == tps.length) {
+ if (Global.instance.debug) System.out.println("refinement lub for " + rsyms[0]);//debug
Symbol lubSym = lub(rsyms, rtps, rlbs, lubType.symbol());
if (lubSym.kind != NONE &&
!(lubSym.kind == sym.kind &&