aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/dotty/tools/dotc/typer
diff options
context:
space:
mode:
authorodersky <odersky@gmail.com>2017-01-30 12:05:02 +1100
committerGitHub <noreply@github.com>2017-01-30 12:05:02 +1100
commitd087448fdffff8f64a23d9db39445455cddc2fc6 (patch)
treec1e01cce8a76a5e66ba2a54472bc899ae41ca405 /compiler/src/dotty/tools/dotc/typer
parent6e8933ccc40bbfe1a92c32c2d8314fd6facef12a (diff)
parent56fb15888fb98e3a6a535f5734bb8ce82fcd76c3 (diff)
downloaddotty-d087448fdffff8f64a23d9db39445455cddc2fc6.tar.gz
dotty-d087448fdffff8f64a23d9db39445455cddc2fc6.tar.bz2
dotty-d087448fdffff8f64a23d9db39445455cddc2fc6.zip
Merge pull request #1913 from dotty-staging/fix-#1750
Fix #1750: Alternative fix for cyclic references due to illegal class overrides
Diffstat (limited to 'compiler/src/dotty/tools/dotc/typer')
-rw-r--r--compiler/src/dotty/tools/dotc/typer/Checking.scala5
-rw-r--r--compiler/src/dotty/tools/dotc/typer/RefChecks.scala2
2 files changed, 7 insertions, 0 deletions
diff --git a/compiler/src/dotty/tools/dotc/typer/Checking.scala b/compiler/src/dotty/tools/dotc/typer/Checking.scala
index 41d9f9572..321c275d7 100644
--- a/compiler/src/dotty/tools/dotc/typer/Checking.scala
+++ b/compiler/src/dotty/tools/dotc/typer/Checking.scala
@@ -338,6 +338,11 @@ object Checking {
checkNoConflict(Final, Sealed)
checkNoConflict(Private, Protected)
checkNoConflict(Abstract, Override)
+ if (sym.isType && !sym.is(Deferred))
+ for (cls <- sym.allOverriddenSymbols.filter(_.isClass)) {
+ fail(i"$sym cannot have the same name as ${cls.showLocated} -- class definitions cannot be overridden")
+ sym.setFlag(Private) // break the overriding relationship by making sym Private
+ }
}
/** Check the type signature of the symbol `M` defined by `tree` does not refer
diff --git a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala
index 3192546cd..e113399c5 100644
--- a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala
+++ b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala
@@ -289,6 +289,8 @@ object RefChecks {
if (!isOverrideAccessOK) {
overrideAccessError()
} else if (other.isClass) {
+ // direct overrides were already checked on completion (see Checking.chckWellFormed)
+ // the test here catches indirect overriddes between two inherited base types.
overrideError("cannot be used here - class definitions cannot be overridden")
} else if (!other.is(Deferred) && member.isClass) {
overrideError("cannot be used here - classes can only override abstract types")