Skip to content

Commit dede682

Browse files
authored
Merge pull request #11971 from megri/issue-11963
Warn when `open` modifier is redundant (traits, abstract classes and local classes)
2 parents 4a1f867 + c6deecd commit dede682

File tree

4 files changed

+18
-2
lines changed

4 files changed

+18
-2
lines changed

compiler/src/dotty/tools/dotc/typer/Checking.scala

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ object Checking {
425425
/** Check that symbol's definition is well-formed. */
426426
def checkWellFormed(sym: Symbol)(using Context): Unit = {
427427
def fail(msg: Message) = report.error(msg, sym.srcPos)
428+
def warn(msg: Message) = report.warning(msg, sym.srcPos)
428429

429430
def checkWithDeferred(flag: FlagSet) =
430431
if (sym.isOneOf(flag))
@@ -464,8 +465,15 @@ object Checking {
464465
fail(em"only classes can be ${(sym.flags & ClassOnlyFlags).flagsString}")
465466
if (sym.is(AbsOverride) && !sym.owner.is(Trait))
466467
fail(AbstractOverrideOnlyInTraits(sym))
467-
if (sym.is(Trait) && sym.is(Final))
468-
fail(TraitsMayNotBeFinal(sym))
468+
if sym.is(Trait) then
469+
if sym.is(Final) then
470+
fail(TraitsMayNotBeFinal(sym))
471+
else if sym.is(Open) then
472+
warn(RedundantModifier(Open))
473+
if sym.isAllOf(Abstract | Open) then
474+
warn(RedundantModifier(Open))
475+
if sym.is(Open) && sym.isLocal then
476+
warn(RedundantModifier(Open))
469477
// Skip ModuleVal since the annotation will also be on the ModuleClass
470478
if sym.hasAnnotation(defn.TailrecAnnot) then
471479
if !sym.isOneOf(Method | ModuleVal) then
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
open trait Foo // error
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
open abstract class Foo // error
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
object Test {
2+
def foo: Any = {
3+
open class Bar // error
4+
new Bar
5+
}
6+
}

0 commit comments

Comments
 (0)