summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Types.scala25
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala17
-rw-r--r--test/files/pos/bug779.scala8
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;
+ }
+}