aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc
diff options
context:
space:
mode:
authorodersky <odersky@gmail.com>2016-11-16 14:54:27 +0100
committerGitHub <noreply@github.com>2016-11-16 14:54:27 +0100
commit443f93f38e3e4bbc346ff945eb0fa51939f3d3a9 (patch)
tree53460dd13c2026f5a02f0567db0cec4d47261ca5 /src/dotty/tools/dotc
parent6990bb37ee070ad4ffea21eb7557c4b438f1b295 (diff)
parentd5656f51972f6a8cc122f47abf144bee29fcf022 (diff)
downloaddotty-443f93f38e3e4bbc346ff945eb0fa51939f3d3a9.tar.gz
dotty-443f93f38e3e4bbc346ff945eb0fa51939f3d3a9.tar.bz2
dotty-443f93f38e3e4bbc346ff945eb0fa51939f3d3a9.zip
Merge pull request #1666 from dotty-staging/fix-#1653
Fix #1653: Check "no inherit from final" earlier.
Diffstat (limited to 'src/dotty/tools/dotc')
-rw-r--r--src/dotty/tools/dotc/typer/Namer.scala11
-rw-r--r--src/dotty/tools/dotc/typer/RefChecks.scala11
2 files changed, 12 insertions, 10 deletions
diff --git a/src/dotty/tools/dotc/typer/Namer.scala b/src/dotty/tools/dotc/typer/Namer.scala
index dd7326fae..687de1e7a 100644
--- a/src/dotty/tools/dotc/typer/Namer.scala
+++ b/src/dotty/tools/dotc/typer/Namer.scala
@@ -656,6 +656,8 @@ class Namer { typer: Typer =>
* (1) It must be a class type with a stable prefix (@see checkClassTypeWithStablePrefix)
* (2) If may not derive from itself
* (3) Overriding type parameters must be correctly forwarded. (@see checkTypeParamOverride)
+ * (4) The class is not final
+ * (5) If the class is sealed, it is defined in the same compilation unit as the current class
*/
def checkedParentType(parent: untpd.Tree, paramAccessors: List[Symbol]): Type = {
val ptype = parentType(parent)(ctx.superCallContext)
@@ -674,7 +676,14 @@ class Namer { typer: Typer =>
}
else if (!paramAccessors.forall(checkTypeParamOverride(pt, _)))
defn.ObjectType
- else pt
+ else {
+ val pclazz = pt.typeSymbol
+ if (pclazz.is(Final))
+ ctx.error(em"cannot extend final $pclazz", cls.pos)
+ if (pclazz.is(Sealed) && pclazz.associatedFile != cls.associatedFile)
+ ctx.error(em"cannot extend sealed $pclazz in different compilation unit", cls.pos)
+ pt
+ }
}
}
diff --git a/src/dotty/tools/dotc/typer/RefChecks.scala b/src/dotty/tools/dotc/typer/RefChecks.scala
index 026015d1d..46bdbf3b3 100644
--- a/src/dotty/tools/dotc/typer/RefChecks.scala
+++ b/src/dotty/tools/dotc/typer/RefChecks.scala
@@ -72,8 +72,7 @@ object RefChecks {
}
}
- /** Check that final and sealed restrictions on class parents
- * and that self type of this class conforms to self types of parents.
+ /** Check that self type of this class conforms to self types of parents.
* and required classes.
*/
private def checkParents(cls: Symbol)(implicit ctx: Context): Unit = cls.info match {
@@ -83,14 +82,8 @@ object RefChecks {
if (otherSelf.exists && !(cinfo.selfType <:< otherSelf))
ctx.error(ex"$category: self type ${cinfo.selfType} of $cls does not conform to self type $otherSelf of $relation ${other.classSymbol}", cls.pos)
}
- for (parent <- cinfo.classParents) {
- val pclazz = parent.classSymbol
- if (pclazz.is(Final))
- ctx.error(em"cannot extend final $pclazz", cls.pos)
- if (pclazz.is(Sealed) && pclazz.associatedFile != cls.associatedFile)
- ctx.error(em"cannot extend sealed $pclazz in different compilation unit", cls.pos)
+ for (parent <- cinfo.classParents)
checkSelfConforms(parent, "illegal inheritance", "parent")
- }
for (reqd <- cinfo.givenSelfType.classSymbols)
checkSelfConforms(reqd.typeRef, "missing requirement", "required")
case _ =>