Skip to content

Commit 91515d6

Browse files
committed
fix: disallow toplevel infix definitions for vals, vars, givens, methods and implicits
Part of #17738
1 parent c629090 commit 91515d6

File tree

5 files changed

+46
-0
lines changed

5 files changed

+46
-0
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ enum ErrorMessageID(val isActive: Boolean = true) extends java.lang.Enum[ErrorMe
199199
case ClosureCannotHaveInternalParameterDependenciesID // errorNumber: 183
200200
case MatchTypeNoCasesID // errorNumber: 184
201201
case UnimportedAndImportedID // errorNumber: 185
202+
case ToplevelDefCantBeInfixID // errorNumber: 186
202203

203204
def errorNumber = ordinal - 1
204205

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2938,3 +2938,13 @@ class ClosureCannotHaveInternalParameterDependencies(mt: Type)(using Context)
29382938
i"""cannot turn method type $mt into closure
29392939
|because it has internal parameter dependencies"""
29402940
def explain(using Context) = ""
2941+
2942+
class ToplevelDefCantBeInfix(sym: Symbol)(using Context)
2943+
extends SyntaxMsg(ToplevelDefCantBeInfixID):
2944+
def msg(using Context) = i"a toplevel $defName cannot be infix"
2945+
def explain(using Context) = ""
2946+
private val defName =
2947+
if sym.flags.is(Method) then "def"
2948+
else if sym.flags.is(Mutable) then "var"
2949+
else if sym.flags.is(Given) then "given"
2950+
else "val"

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,7 @@ object Checking {
561561
fail(CannotHaveSameNameAs(sym, cls, CannotHaveSameNameAs.CannotBeOverridden))
562562
sym.setFlag(Private) // break the overriding relationship by making sym Private
563563
}
564+
if sym.isWrappedToplevelDef && !sym.isType then fail(ToplevelDefCantBeInfix(sym))
564565
checkApplicable(Erased,
565566
!sym.isOneOf(MutableOrLazy, butNot = Given) && !sym.isType || sym.isClass)
566567
checkCombination(Final, Open)

tests/neg/i17738-toplevel-infix.check

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
-- [E183] Syntax Error: tests/neg/i17738-toplevel-infix.scala:10:10 ----------------------------------------------------
2+
10 |infix val toplevelVal = ??? // error
3+
| ^
4+
| a toplevel val cannot be infix
5+
-- [E183] Syntax Error: tests/neg/i17738-toplevel-infix.scala:11:10 ----------------------------------------------------
6+
11 |infix var toplevelVar = ??? // error
7+
| ^
8+
| a toplevel var cannot be infix
9+
-- [E183] Syntax Error: tests/neg/i17738-toplevel-infix.scala:12:10 ----------------------------------------------------
10+
12 |infix def toplevelDef = ??? // error
11+
| ^
12+
| a toplevel def cannot be infix
13+
-- [E183] Syntax Error: tests/neg/i17738-toplevel-infix.scala:13:12 ----------------------------------------------------
14+
13 |infix given toplevelGiven: Int = ??? // error
15+
| ^
16+
| a toplevel given cannot be infix
17+
-- [E183] Syntax Error: tests/neg/i17738-toplevel-infix.scala:14:19 ----------------------------------------------------
18+
14 |infix implicit val topevelImplicit: Int = ??? // error
19+
| ^
20+
| a toplevel val cannot be infix

tests/neg/i17738-toplevel-infix.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
infix type A[b, a] = Nothing
2+
3+
infix type B[b, a] = b match {
4+
case Int => a
5+
}
6+
7+
infix class C[A, B]
8+
infix trait D[A, B]
9+
10+
infix val toplevelVal = ??? // error
11+
infix var toplevelVar = ??? // error
12+
infix def toplevelDef = ??? // error
13+
infix given toplevelGiven: Int = ??? // error
14+
infix implicit val topevelImplicit: Int = ??? // error

0 commit comments

Comments
 (0)