diff options
Diffstat (limited to 'sources/scalac/typechecker')
-rw-r--r-- | sources/scalac/typechecker/Analyzer.java | 4 | ||||
-rw-r--r-- | sources/scalac/typechecker/RefCheck.java | 16 | ||||
-rw-r--r-- | sources/scalac/typechecker/RefCheckPhase.java | 9 |
3 files changed, 27 insertions, 2 deletions
diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java index fcb6eaf0d6..44b4773b87 100644 --- a/sources/scalac/typechecker/Analyzer.java +++ b/sources/scalac/typechecker/Analyzer.java @@ -266,7 +266,9 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { accessWithin(sym.owner()) || ((sym.flags & PRIVATE) == 0) && - site.type.symbol().isSubClass(sym.owner()) && + site.type.symbol().isSubClass( + sym.isConstructor() ? sym.constructorClass() + : sym.owner()) && (site instanceof Tree.Super || isSubClassOfEnclosing(site.type.symbol())); } //where diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java index 2aee3a04c4..3c39218c72 100644 --- a/sources/scalac/typechecker/RefCheck.java +++ b/sources/scalac/typechecker/RefCheck.java @@ -141,6 +141,12 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { } if (clazz.kind == CLASS && (clazz.flags & ABSTRACT) == 0) { if ((member.flags & DEFERRED) != 0) { + Type[] parents = clazz.parents(); + for (int i = 0; i < parents.length; i++) { + Symbol p = parents[i].symbol(); + if (p.isSubClass(member.owner()) && (p.flags & ABSTRACT) == 0) + return; // everything was already checked elsewhere + } abstractClassError( clazz, member + member.locationString() + " is not defined" + @@ -196,10 +202,19 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { * M must be labelled `abstract override'. */ void checkOverride(int pos, Symbol clazz, Symbol member, Symbol other) { + //System.out.println(member + member.locationString() + " overrides " + other + other.locationString() + " in " + clazz);//DEBUG if (member.owner() == clazz) pos = member.pos; else if (member.owner().isSubClass(other.owner())) return; // everything was already checked elsewhere + else { + Type[] parents = clazz.parents(); + for (int i = 0; i < parents.length; i++) { + Symbol p = parents[i].symbol(); + if (p.isSubClass(member.owner()) && p.isSubClass(other.owner())) + return; // everything was already checked elsewhere + } + } if ((member.flags & PRIVATE) != 0) { overrideError(pos, member, other, "has weaker access privileges; it should not be private"); @@ -531,7 +546,6 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { gen.mkRef(tree.pos, mvar)}); // def m: T = { if (m$ == null[T]) m$ = new m$class; m$ } - sym.updateInfo(Type.PolyType(Symbol.EMPTY_ARRAY, sym.type())); sym.flags |= STABLE; Tree ddef = gen.DefDef(sym, body); diff --git a/sources/scalac/typechecker/RefCheckPhase.java b/sources/scalac/typechecker/RefCheckPhase.java index 7749e4b357..87a4653648 100644 --- a/sources/scalac/typechecker/RefCheckPhase.java +++ b/sources/scalac/typechecker/RefCheckPhase.java @@ -10,6 +10,7 @@ package scalac.typechecker; import scalac.*; import scalac.ast.*; +import scalac.symtab.*; import scalac.checkers.*; public class RefCheckPhase extends Phase { @@ -25,6 +26,14 @@ public class RefCheckPhase extends Phase { new RefCheck(global).apply(units[i]); } + public Type transformInfo(Symbol sym, Type tp) { + if (sym.isModule() && !sym.isPackage() && !sym.isGlobalModule()) { + return Type.PolyType(Symbol.EMPTY_ARRAY, tp); + } + else + return tp; + } + public Checker[] postCheckers(Global global) { return new Checker[] { new CheckSymbols(global), |