File tree 4 files changed +28
-2
lines changed
test/dotty/tools/dotc/reporting
4 files changed +28
-2
lines changed Original file line number Diff line number Diff line change @@ -112,6 +112,7 @@ public enum ErrorMessageID {
112
112
UndefinedNamedTypeParameterID ,
113
113
IllegalStartOfStatementID ,
114
114
TraitIsExpectedID ,
115
+ TraitRedefinedFinalMethodFromAnyRefID ,
115
116
;
116
117
117
118
public int errorNumber () {
Original file line number Diff line number Diff line change @@ -1916,4 +1916,11 @@ object messages {
1916
1916
| """
1917
1917
}
1918
1918
}
1919
+
1920
+ case class TraitRedefinedFinalMethodFromAnyRef ()(implicit ctx : Context ) extends Message (TraitRedefinedFinalMethodFromAnyRefID ) {
1921
+ val kind = " Syntax"
1922
+ val msg = " Trait cannot redefine final method from class AnyRef"
1923
+ val explanation = hl """ A method was defined in a trait trying to redefine a method declared in class AnyRef.
1924
+ All classes inherit from AnyRef and should not redefine its methods """
1925
+ }
1919
1926
}
Original file line number Diff line number Diff line change @@ -116,7 +116,7 @@ object RefChecks {
116
116
if (! cls.owner.is(ModuleClass )) {
117
117
def clashes (sym : Symbol ) =
118
118
sym.isClass &&
119
- sym.name.stripModuleClassSuffix == cls.name.stripModuleClassSuffix
119
+ sym.name.stripModuleClassSuffix == cls.name.stripModuleClassSuffix
120
120
121
121
val others = cls.owner.linkedClass.info.decls.filter(clashes)
122
122
others.foreach { other =>
@@ -606,7 +606,7 @@ object RefChecks {
606
606
// override a concrete method in Object. The jvm, however, does not.
607
607
val overridden = decl.matchingDecl(defn.ObjectClass , defn.ObjectType )
608
608
if (overridden.is(Final ))
609
- ctx.error(" trait cannot redefine final method from class AnyRef " , decl.pos)
609
+ ctx.error(TraitRedefinedFinalMethodFromAnyRef () , decl.pos)
610
610
}
611
611
}
612
612
Original file line number Diff line number Diff line change @@ -1172,4 +1172,22 @@ class ErrorMessagesTests extends ErrorMessagesTest {
1172
1172
val TraitIsExpected (symbol) :: Nil = messages
1173
1173
assertEquals(" class B" , symbol.show)
1174
1174
}
1175
+
1176
+ @ Test def traitRedefinedFinalMethodFromAnyRef =
1177
+ checkMessagesAfter(" refchecks" ) {
1178
+ """
1179
+ |trait C {
1180
+ | def wait (): Unit
1181
+ |}
1182
+ """ .stripMargin
1183
+ }
1184
+ .expect { (ictx, messages) =>
1185
+ implicit val ctx : Context = ictx
1186
+
1187
+ assertMessageCount(1 , messages)
1188
+ val err :: Nil = messages
1189
+
1190
+ assertEquals(TraitRedefinedFinalMethodFromAnyRef (), err)
1191
+ }
1192
+
1175
1193
}
You can’t perform that action at this time.
0 commit comments