diff options
author | Martin Odersky <odersky@gmail.com> | 2004-01-06 14:02:00 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2004-01-06 14:02:00 +0000 |
commit | 22499e81b5526b8f8713fc5703d785d12439fef4 (patch) | |
tree | 18f87fac93bf8577f46477c7efb0605512c936ff | |
parent | 7b8b6d0adf3e1e84829f9c1bc97854883cbd1ebd (diff) | |
download | scala-22499e81b5526b8f8713fc5703d785d12439fef4.tar.gz scala-22499e81b5526b8f8713fc5703d785d12439fef4.tar.bz2 scala-22499e81b5526b8f8713fc5703d785d12439fef4.zip |
*** empty log message ***
-rw-r--r-- | sources/scala/tools/scalac/typechecker/Analyzer.scala | 18 | ||||
-rw-r--r-- | sources/scalac/symtab/Definitions.java | 4 | ||||
-rw-r--r-- | sources/scalac/symtab/Symbol.java | 18 | ||||
-rw-r--r-- | sources/scalac/symtab/Type.java | 1 | ||||
-rw-r--r-- | test/files/neg/S7.check | 3 | ||||
-rw-r--r-- | test/neg/S7.check | 3 |
6 files changed, 41 insertions, 6 deletions
diff --git a/sources/scala/tools/scalac/typechecker/Analyzer.scala b/sources/scala/tools/scalac/typechecker/Analyzer.scala index 1a723516d2..48585dfcd2 100644 --- a/sources/scala/tools/scalac/typechecker/Analyzer.scala +++ b/sources/scala/tools/scalac/typechecker/Analyzer.scala @@ -696,10 +696,24 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( * Handle overloading. */ def enterInScope(sym: Symbol): unit = { + + def covers(presym: Symbol, newsym: Symbol) = { + if (presym == newsym) true + else if (!presym.isInitialized()) false + else presym.getType() match { + case Type$OverloadedType(alts, _) => + var i = 0; + while (i < alts.length && alts(i) != newsym) i = i + 1; + i < alts.length + case _ => + false + } + } + // handle double and overloaded definitions val e: Scope$Entry = context.scope.lookupEntry(sym.name); val other: Symbol = e.sym; - if (sym == other) { + if (covers(other, sym)) { if (global.debug) global.log("redefined: " + sym + ":" + sym.rawInfo()); } else if (e.owner == context.scope) { assert(!other.isExternal(), other); @@ -738,7 +752,6 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( def enterSym(tree: Tree, sym: Symbol): Symbol = { //if (global.debug) System.out.println("entering " + sym);//DEBUG if (!sym.isInitialized()) { - //System.err.println("undefined: " + sym + ":" + sym.rawInfo());//DEBUG sym.setInfo(new LazyTreeType(tree)); } if (!sym.isConstructor()) { @@ -2032,6 +2045,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( .setType(Type.NoType); case Tree$ValDef(_, _, tpe, rhs) => + assert(sym != null, tree); val tpe1: Tree = if (tpe == Tree.Empty) gen.mkType(tree.pos, sym.getType()) else transform(tpe, TYPEmode); 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 && diff --git a/test/files/neg/S7.check b/test/files/neg/S7.check index 59c57786b3..71ea1e818f 100644 --- a/test/files/neg/S7.check +++ b/test/files/neg/S7.check @@ -1,4 +1,5 @@ S7.scala:6: illegal cyclic reference involving class S7.A class C() extends a.A() {} - ^ + ^ one error found +t
\ No newline at end of file diff --git a/test/neg/S7.check b/test/neg/S7.check index 59c57786b3..71ea1e818f 100644 --- a/test/neg/S7.check +++ b/test/neg/S7.check @@ -1,4 +1,5 @@ S7.scala:6: illegal cyclic reference involving class S7.A class C() extends a.A() {} - ^ + ^ one error found +t
\ No newline at end of file |