Skip to content

Commit 8bfe342

Browse files
committed
Disallow extensions of Dynamic in safe mode
1 parent 5b0f56d commit 8bfe342

File tree

3 files changed

+24
-9
lines changed

3 files changed

+24
-9
lines changed

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3485,15 +3485,14 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
34853485
checkEnum(cdef, cls, firstParent)
34863486
val cdef1 = assignType(cpy.TypeDef(cdef)(name, impl1), cls)
34873487

3488-
val reportDynamicInheritance =
3489-
ctx.phase.isTyper &&
3490-
cdef1.symbol.ne(defn.DynamicClass) &&
3491-
cdef1.tpe.derivesFrom(defn.DynamicClass) &&
3492-
!Feature.dynamicsEnabled
3493-
if (reportDynamicInheritance) {
3494-
val isRequired = parents1.exists(_.tpe.isRef(defn.DynamicClass))
3495-
report.featureWarning(nme.dynamics.toString, "extension of type scala.Dynamic", cls, isRequired, cdef.srcPos)
3496-
}
3488+
val checkDynamicInheritance =
3489+
ctx.phase.isTyper && cdef1.symbol.ne(defn.DynamicClass) && cdef1.tpe.derivesFrom(defn.DynamicClass)
3490+
if checkDynamicInheritance then
3491+
if Feature.safeEnabled then
3492+
report.error(i"Extensions of type scala.Dynamic are not allowed in safe mode.", cls.srcPos)
3493+
else if !Feature.dynamicsEnabled then
3494+
val isRequired = parents1.exists(_.tpe.isRef(defn.DynamicClass))
3495+
report.featureWarning(nme.dynamics.toString, "extension of type scala.Dynamic", cls, isRequired, cdef.srcPos)
34973496

34983497
checkNonCyclicInherited(cls.thisType, cls.info.parents, cls.info.decls, cdef.srcPos)
34993498

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-- Error: tests/neg-custom-args/captures/dynamic.scala:4:6 -------------------------------------------------------------
2+
4 |class User(map: Map[String, Any]) extends Dynamic { // error
3+
| ^
4+
| Extensions of type scala.Dynamic are not allowed in safe mode.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import scala.language.dynamics
2+
import scala.language.experimental.safe
3+
4+
class User(map: Map[String, Any]) extends Dynamic { // error
5+
// selectDynamic is called when accessing obj.field
6+
def selectDynamic(name: String): Any = map.getOrElse(name, "Unknown")
7+
}
8+
9+
def Test =
10+
val user = new User(Map("name" -> "Alice", "age" -> "30"))
11+
println(user.name) // Prints: Alice
12+
println(user.email) // Prints: Unknown

0 commit comments

Comments
 (0)