diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Types.scala | 25 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 17 | ||||
-rw-r--r-- | test/files/pos/bug779.scala | 8 |
3 files changed, 32 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) => diff --git a/test/files/pos/bug779.scala b/test/files/pos/bug779.scala new file mode 100644 index 0000000000..01db156a59 --- /dev/null +++ b/test/files/pos/bug779.scala @@ -0,0 +1,8 @@ +abstract class Foo { + trait Node { + def ast : Object = null; + } + trait Something extends Node { + override def ast = return null; + } +} |