diff options
author | Martin Odersky <odersky@gmail.com> | 2006-10-26 14:33:26 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-10-26 14:33:26 +0000 |
commit | 2738fdc2ed8b0641dcec138eb3ce298b2a11af31 (patch) | |
tree | 30146cc9e569b723f975d16d8c9a8e59dc78b073 /src/compiler | |
parent | 3f8b526dd8375edf30ac8e8236ae6ca195d4990a (diff) | |
download | scala-2738fdc2ed8b0641dcec138eb3ce298b2a11af31.tar.gz scala-2738fdc2ed8b0641dcec138eb3ce298b2a11af31.tar.bz2 scala-2738fdc2ed8b0641dcec138eb3ce298b2a11af31.zip |
fixed bugs 779, 788
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Types.scala | 25 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 17 |
2 files changed, 24 insertions, 18 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index 9fdf1db895..3d3412a7b4 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -225,7 +225,7 @@ trait Types requires SymbolTable { } */ case _ => - //System.out.println("" + this.widen + ".memberType(" + sym +":" + sym.tpe +")");//DEBUG + //System.out.println("" + this.widen + ".memberType(" + sym +":" + sym.tpe +")" + sym.ownerChain);//debug sym.tpe.asSeenFrom(this, sym.owner) } } @@ -441,22 +441,27 @@ trait Types requires SymbolTable { member = sym } else if (members == null) { if (member.name != sym.name || - member != sym && - (member.owner == sym.owner || { - if (self == null) self = this.narrow; - !self.memberType(member).matches(self.memberType(sym))})) - members = newScope(List(member, sym)); + !(member == sym || + member.owner != sym.owner && + !member.hasFlag(PRIVATE) && + !sym.hasFlag(PRIVATE) && { + if (self == null) self = this.narrow; + (self.memberType(member) matches self.memberType(sym)) + })) { + members = newScope(List(member, sym)) + } } else { var prevEntry = members lookupEntry sym.name while (prevEntry != null && - !(prevEntry.sym == sym - || + !(prevEntry.sym == sym || prevEntry.sym.owner != sym.owner && !prevEntry.sym.hasFlag(PRIVATE) && !sym.hasFlag(PRIVATE) && { if (self == null) self = this.narrow; - (self.memberType(prevEntry.sym) matches self.memberType(sym))})) - prevEntry = members lookupNextEntry prevEntry; + (self.memberType(prevEntry.sym) matches self.memberType(sym)) + })) { + prevEntry = members lookupNextEntry prevEntry + } if (prevEntry == null) { members enter sym } diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 1027d71c5e..fc849661a6 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -1705,16 +1705,17 @@ trait Typers requires Analyzer { case Return(expr) => val enclMethod = context.enclMethod - if (enclMethod == NoContext || enclMethod.owner.isConstructor) + if (enclMethod == NoContext || enclMethod.owner.isConstructor) { errorTree(tree, "return outside method definition") - else if (!enclMethod.owner.isInitialized) - errorTree(tree, "method " + enclMethod.owner + - " has return statement; needs result type") - else { + } else { val DefDef(_, _, _, _, restpt, _) = enclMethod.tree - assert(restpt.tpe != null, restpt) - val expr1: Tree = typed(expr, restpt.tpe) - copy.Return(tree, expr1) setSymbol enclMethod.owner setType AllClass.tpe + if (restpt.tpe == null) { + errorTree(tree, "method " + enclMethod.owner + + " has return statement; needs result type") + } else { + val expr1: Tree = typed(expr, restpt.tpe) + copy.Return(tree, expr1) setSymbol enclMethod.owner setType AllClass.tpe + } } case Try(block, catches, finalizer) => |