Skip to content

Commit f5940fe

Browse files
authored
Merge pull request #8166 from dotty-staging/fix-#8150
Fix #8150: Improve screening of legal refinements
2 parents a331da7 + 92c2215 commit f5940fe

File tree

3 files changed

+19
-14
lines changed

3 files changed

+19
-14
lines changed

compiler/src/dotty/tools/dotc/core/Flags.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ object Flags {
134134
}
135135

136136
/** The list of non-empty names of flags that are set in the given flag set */
137-
def flagStrings(privateWithin: String): Seq[String] = {
137+
def flagStrings(privateWithin: String = ""): Seq[String] = {
138138
var rawStrings = (2 to MaxFlag).flatMap(x.flagString(_)) // DOTTY problem: cannot drop with (_)
139139
if (!privateWithin.isEmpty && !x.is(Protected))
140140
rawStrings = rawStrings :+ "private"

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

+15-13
Original file line numberDiff line numberDiff line change
@@ -3800,19 +3800,21 @@ object Parsers {
38003800
*/
38013801
def refineStatSeq(): List[Tree] = {
38023802
val stats = new ListBuffer[Tree]
3803-
def checkLegal(tree: Tree): List[Tree] = {
3804-
val isLegal = tree match {
3805-
case tree: ValDef => tree.rhs.isEmpty && !tree.mods.flags.is(Mutable)
3806-
case tree: DefDef => tree.rhs.isEmpty
3807-
case tree: TypeDef => true
3808-
case _ => false
3809-
}
3810-
if (isLegal) tree :: Nil
3811-
else {
3812-
syntaxError("illegal refinement", tree.span)
3813-
Nil
3814-
}
3815-
}
3803+
def checkLegal(tree: Tree): List[Tree] =
3804+
val problem = tree match
3805+
case tree: MemberDef if !(tree.mods.flags & ModifierFlags).isEmpty =>
3806+
i"refinement cannot be ${(tree.mods.flags & ModifierFlags).flagStrings().mkString("`", "`, `", "`")}"
3807+
case tree: ValOrDefDef =>
3808+
if tree.rhs.isEmpty then ""
3809+
else "refinement in cannot have a right-hand side"
3810+
case tree: TypeDef =>
3811+
if !tree.isClassDef then ""
3812+
else "refinement cannot be a class or trait"
3813+
case _ =>
3814+
"this kind of definition cannot be a refinement"
3815+
if problem.isEmpty then tree :: Nil
3816+
else { syntaxError(problem, tree.span); Nil }
3817+
38163818
while (!isStatSeqEnd) {
38173819
if (isDclIntro)
38183820
stats ++= checkLegal(defOrDcl(in.offset, Modifiers()))

tests/neg/i8150.scala

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
trait A
2+
trait B
3+
type T = {given(given a: A) as B} // error: refinement cannot be `given`

0 commit comments

Comments
 (0)