Skip to content

Commit 5b91393

Browse files
Merge pull request #5176 from Jasper-M/fix/5121
check whether a value class parameter is call-by-name
2 parents db2d5aa + 6509411 commit 5b91393

File tree

4 files changed

+23
-1
lines changed

4 files changed

+23
-1
lines changed

compiler/src/dotty/tools/dotc/reporting/diagnostic/ErrorMessageID.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ public enum ErrorMessageID {
132132
ImportRenamedTwiceID,
133133
TypeTestAlwaysSucceedsID,
134134
TermMemberNeedsNeedsResultTypeForImplicitSearchID,
135-
CaseClassCannotExtendEnumID
135+
CaseClassCannotExtendEnumID,
136+
ValueClassParameterMayNotBeCallByNameID
136137
;
137138

138139
public int errorNumber() {

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1666,6 +1666,13 @@ object messages {
16661666
val explanation = ""
16671667
}
16681668

1669+
case class ValueClassParameterMayNotBeCallByName(valueClass: Symbol, param: Symbol)(implicit ctx: Context)
1670+
extends Message(ValueClassParameterMayNotBeCallByNameID) {
1671+
val msg = s"value class parameter `${param.name}` may not be call-by-name"
1672+
val kind = "Syntax"
1673+
val explanation = ""
1674+
}
1675+
16691676
case class OnlyCaseClassOrCaseObjectAllowed()(implicit ctx: Context)
16701677
extends Message(OnlyCaseClassOrCaseObjectAllowedID) {
16711678
val msg = "only `case class` or `case object` allowed"

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,8 @@ object Checking {
537537
case param :: params =>
538538
if (param.is(Mutable))
539539
ctx.error(ValueClassParameterMayNotBeAVar(clazz, param), param.pos)
540+
if (param.info.isInstanceOf[ExprType])
541+
ctx.error(ValueClassParameterMayNotBeCallByName(clazz, param), param.pos)
540542
if (param.is(Erased))
541543
ctx.error("value class first parameter cannot be `erased`", param.pos)
542544
else {

compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -935,6 +935,18 @@ class ErrorMessagesTests extends ErrorMessagesTest {
935935
assertEquals("class MyValue", valueClass.show)
936936
}
937937

938+
@Test def valueClassParameterMayNotBeCallByName =
939+
checkMessagesAfter(RefChecks.name) {
940+
"""class MyValue(a: => Int) extends AnyVal"""
941+
}
942+
.expect { (ictx, messages) =>
943+
implicit val ctx: Context = ictx
944+
assertMessageCount(1, messages)
945+
val ValueClassParameterMayNotBeCallByName(valueClass, param) :: Nil = messages
946+
assertEquals("class MyValue", valueClass.show)
947+
assertEquals("value a", param.show)
948+
}
949+
938950
@Test def onlyCaseClassOrCaseObjectAllowed =
939951
checkMessagesAfter(FrontEnd.name) {
940952
"""case Foobar"""

0 commit comments

Comments
 (0)