Skip to content

Commit f62429b

Browse files
Elide companion defs to a object extending AnyVal (#18451)
Fixes #18274
2 parents 7be9af0 + bbeb0ab commit f62429b

File tree

5 files changed

+24
-5
lines changed

5 files changed

+24
-5
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,7 @@ object desugar {
820820
}
821821
else if (companionMembers.nonEmpty || companionDerived.nonEmpty || isEnum)
822822
companionDefs(anyRef, companionMembers)
823-
else if (isValueClass)
823+
else if isValueClass && !isObject then
824824
companionDefs(anyRef, Nil)
825825
else Nil
826826

compiler/src/dotty/tools/dotc/reporting/messages.scala

+9-4
Original file line numberDiff line numberDiff line change
@@ -1686,10 +1686,15 @@ class CannotExtendAnyVal(sym: Symbol)(using Context)
16861686
extends SyntaxMsg(CannotExtendAnyValID) {
16871687
def msg(using Context) = i"""$sym cannot extend ${hl("AnyVal")}"""
16881688
def explain(using Context) =
1689-
i"""Only classes (not traits) are allowed to extend ${hl("AnyVal")}, but traits may extend
1690-
|${hl("Any")} to become ${Green("\"universal traits\"")} which may only have ${hl("def")} members.
1691-
|Universal traits can be mixed into classes that extend ${hl("AnyVal")}.
1692-
|"""
1689+
if sym.is(Trait) then
1690+
i"""Only classes (not traits) are allowed to extend ${hl("AnyVal")}, but traits may extend
1691+
|${hl("Any")} to become ${Green("\"universal traits\"")} which may only have ${hl("def")} members.
1692+
|Universal traits can be mixed into classes that extend ${hl("AnyVal")}.
1693+
|"""
1694+
else if sym.is(Module) then
1695+
i"""Only classes (not objects) are allowed to extend ${hl("AnyVal")}.
1696+
|"""
1697+
else ""
16931698
}
16941699

16951700
class CannotExtendJavaEnum(sym: Symbol)(using Context)

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

+2
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,8 @@ object Checking {
711711
if (isDerivedValueClass(clazz)) {
712712
if (clazz.is(Trait))
713713
report.error(CannotExtendAnyVal(clazz), clazz.srcPos)
714+
if clazz.is(Module) then
715+
report.error(CannotExtendAnyVal(clazz), clazz.srcPos)
714716
if (clazz.is(Abstract))
715717
report.error(ValueClassesMayNotBeAbstract(clazz), clazz.srcPos)
716718
if (!clazz.isStatic)

tests/neg/i18274.check

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-- [E068] Syntax Error: tests/neg/i18274.scala:3:7 ---------------------------------------------------------------------
2+
3 |object Foo extends AnyVal // error
3+
| ^
4+
| object Foo cannot extend AnyVal
5+
|---------------------------------------------------------------------------------------------------------------------
6+
| Explanation (enabled by `-explain`)
7+
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
8+
| Only classes (not objects) are allowed to extend AnyVal.
9+
---------------------------------------------------------------------------------------------------------------------

tests/neg/i18274.scala

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
//> using options -explain
2+
3+
object Foo extends AnyVal // error

0 commit comments

Comments
 (0)