summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/scala/tools/scalac/typechecker/Analyzer.scala18
-rw-r--r--sources/scalac/symtab/Definitions.java4
-rw-r--r--sources/scalac/symtab/Symbol.java18
-rw-r--r--sources/scalac/symtab/Type.java1
-rw-r--r--test/files/neg/S7.check3
-rw-r--r--test/neg/S7.check3
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