summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@epfl.ch>2012-08-08 02:54:22 -0700
committerAdriaan Moors <adriaan.moors@epfl.ch>2012-08-08 02:54:22 -0700
commita0962092ddd79a14dbc37d05ba26a362b61d1a29 (patch)
tree0871f49979adb55d07dd139e36f541751530e30b /src
parent4185f7fb7a0a8ad4bc05b4ac8317a535ee644b28 (diff)
parentf76306b77fdc5b028d900141a40b8c98354641a9 (diff)
downloadscala-a0962092ddd79a14dbc37d05ba26a362b61d1a29.tar.gz
scala-a0962092ddd79a14dbc37d05ba26a362b61d1a29.tar.bz2
scala-a0962092ddd79a14dbc37d05ba26a362b61d1a29.zip
Merge pull request #1075 from adriaanm/ticket-6040
SI-6040 error on unauthorized extension Dynamic
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 063f615e17..a6d7424837 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -1551,10 +1551,15 @@ trait Typers extends Modes with Adaptations with Tags {
*/
def validateParentClasses(parents: List[Tree], selfType: Type) {
val pending = ListBuffer[AbsTypeError]()
- def validateParentClass(parent: Tree, superclazz: Symbol) {
+ @inline def validateDynamicParent(parent: Symbol) =
+ if (parent == DynamicClass) checkFeature(parent.pos, DynamicsFeature)
+
+ def validateParentClass(parent: Tree, superclazz: Symbol) =
if (!parent.isErrorTyped) {
val psym = parent.tpe.typeSymbol.initialize
+
checkStablePrefixClassType(parent)
+
if (psym != superclazz) {
if (psym.isTrait) {
val ps = psym.info.parents
@@ -1564,6 +1569,7 @@ trait Typers extends Modes with Adaptations with Tags {
pending += ParentNotATraitMixinError(parent, psym)
}
}
+
if (psym.isFinal)
pending += ParentFinalInheritanceError(parent, psym)
@@ -1586,12 +1592,17 @@ trait Typers extends Modes with Adaptations with Tags {
pending += ParentSelfTypeConformanceError(parent, selfType)
if (settings.explaintypes.value) explainTypes(selfType, parent.tpe.typeOfThis)
}
+
if (parents exists (p => p != parent && p.tpe.typeSymbol == psym && !psym.isError))
pending += ParentInheritedTwiceError(parent, psym)
+
+ validateDynamicParent(psym)
}
+
+ if (!parents.isEmpty && parents.forall(!_.isErrorTyped)) {
+ val superclazz = parents.head.tpe.typeSymbol
+ for (p <- parents) validateParentClass(p, superclazz)
}
- if (!parents.isEmpty && parents.forall(!_.isErrorTyped))
- for (p <- parents) validateParentClass(p, parents.head.tpe.typeSymbol)
/*
if (settings.Xshowcls.value != "" &&