Skip to content

Commit 17d1633

Browse files
Merge pull request #8785 from dotty-staging/only-allow-sound-inline-parameters-in-overrides
Only allow sound inline parameters in overrides
2 parents 8ccc095 + e9c1e7e commit 17d1633

File tree

5 files changed

+55
-5
lines changed

5 files changed

+55
-5
lines changed

compiler/src/dotty/tools/dotc/config/Printers.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ object Printers {
77
}
88

99
object noPrinter extends Printer {
10-
inline override def println(inline msg: => String): Unit = ()
10+
inline override def println(msg: => String): Unit = ()
1111
}
1212

1313
val default = new Printer

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

+16-1
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,8 @@ object Checking {
451451
|| sym.is(TermParam) && !sym.owner.isInlineMethod
452452
))
453453
fail(ParamsNoInline(sym.owner))
454-
454+
if sym.isInlineMethod && !sym.is(Deferred) && sym.allOverriddenSymbols.nonEmpty then
455+
checkInlineOverrideParameters(sym)
455456
if (sym.isOneOf(GivenOrImplicit)) {
456457
if (sym.owner.is(Package))
457458
fail(TopLevelCantBeImplicit(sym))
@@ -646,6 +647,20 @@ object Checking {
646647
val enumCls = enumCase.owner.linkedClass
647648
if !cls.info.parents.exists(_.typeSymbol == enumCls) then
648649
ctx.error(i"enum case does not extend its enum $enumCls", enumCase.sourcePos)
650+
651+
/** Check the inline override methods only use inline parameters if they override an inline parameter. */
652+
def checkInlineOverrideParameters(sym: Symbol)(using Context): Unit =
653+
lazy val params = sym.paramSymss.flatten
654+
for
655+
sym2 <- sym.allOverriddenSymbols
656+
(p1, p2) <- sym.paramSymss.flatten.lazyZip(sym2.paramSymss.flatten)
657+
if p1.is(Inline) != p2.is(Inline)
658+
do
659+
ctx.error(
660+
if p2.is(Inline) then "Cannot override inline parameter with a non-inline parameter"
661+
else "Cannot override non-inline parameter with an inline parameter",
662+
p1.sourcePos)
663+
649664
}
650665

651666
trait Checking {
+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
2+
3+
abstract class Logger {
4+
def log1(msg: String): Unit
5+
inline def log2(msg: String): Unit
6+
inline def log3(inline msg: String): Unit
7+
}
8+
9+
class Logger1 extends Logger {
10+
inline def log1(msg: String): Unit = ()
11+
inline def log2(msg: String): Unit = ()
12+
inline def log3(msg: String): Unit = () // error: Cannot override inline parameter with a non-inline parameter
13+
}
14+
15+
class Logger2 extends Logger {
16+
inline def log1(inline msg: String): Unit = () // error: Cannot override non-inline parameter with an inline parameter
17+
inline def log2(inline msg: String): Unit = () // error: Cannot override non-inline parameter with an inline parameter
18+
inline def log3(inline msg: String): Unit = ()
19+
}
20+
21+
trait A {
22+
inline def f(inline a: Int): Int
23+
}
24+
25+
trait B {
26+
def f(a: Int): Int
27+
}
28+
29+
class C extends A, B {
30+
inline def f(inline a: Int): Int = 3 // error: Cannot override non-inline parameter with and inline parameter
31+
}
32+
33+
class D extends B, A {
34+
inline def f(inline a: Int): Int = 3 // error: Cannot override non-inline parameter with and inline parameter
35+
}

tests/run/inline-override-num.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ trait Num[T] {
44

55
object Num {
66
class IntNum extends Num[Int] {
7-
inline def plus(inline x: Int, inline y: Int): Int = x + y
7+
inline def plus(x: Int, y: Int): Int = x + y
88
}
99
given IntNum
1010

tests/run/typeclass-derivation2b.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ object TypeLevel {
2626

2727
abstract class GenericSum[S] extends Generic[S] {
2828
def ordinal(x: S): Int
29-
inline def alternative(n: Int): GenericProduct[_ <: S]
29+
inline def alternative(inline n: Int): GenericProduct[_ <: S]
3030
}
3131

3232
abstract class GenericProduct[P] extends Generic[P] {
@@ -49,7 +49,7 @@ object Lst {
4949
case x: Cons[_] => 0
5050
case Nil => 1
5151
}
52-
inline override def alternative(inline n: Int) <: GenericProduct[_ <: Lst[T]] =
52+
inline def alternative(inline n: Int) <: GenericProduct[_ <: Lst[T]] =
5353
inline n match {
5454
case 0 => Cons.GenericCons[T]
5555
case 1 => Nil.GenericNil

0 commit comments

Comments
 (0)