diff --git a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala index cfb132dd95ce..82ecf02e2900 100644 --- a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala +++ b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala @@ -1798,8 +1798,9 @@ object Parsers { val start = in.offset val tparams = typeParamClause(ParamOwner.Type) if in.token == TLARROW then + // Filter illegal context bounds and report syntax error atSpan(start, in.skipToken()): - LambdaTypeTree(tparams, toplevelTyp()) + LambdaTypeTree(tparams.mapConserve(stripContextBounds("type lambdas")), toplevelTyp()) else if in.token == ARROW || isPureArrow(nme.PUREARROW) then val arrowOffset = in.skipToken() val body = toplevelTyp(nestedIntoOK(in.token)) @@ -1815,6 +1816,13 @@ object Parsers { typeRest(infixType(inContextBound)) end typ + /** Removes context bounds from TypeDefs and returns a syntax error. */ + private def stripContextBounds(in: String)(tparam: TypeDef) = tparam match + case TypeDef(name, rhs: ContextBounds) => + syntaxError(em"context bounds are not allowed in $in", rhs.span) + TypeDef(name, rhs.bounds) + case other => other + private def makeKindProjectorTypeDef(name: TypeName): TypeDef = { val isVarianceAnnotated = name.startsWith("+") || name.startsWith("-") // We remove the variance marker from the name without passing along the specified variance at all @@ -3475,7 +3483,7 @@ object Parsers { * * HkTypeParamClause ::= ‘[’ HkTypeParam {‘,’ HkTypeParam} ‘]’ * HkTypeParam ::= {Annotation} [‘+’ | ‘-’] - * (id | ‘_’) [HkTypePamClause] TypeBounds + * (id | ‘_’) [HkTypeParamClause] TypeBounds */ def typeParamClause(paramOwner: ParamOwner): List[TypeDef] = inBracketsWithCommas { diff --git a/tests/neg/i22552.check b/tests/neg/i22552.check new file mode 100644 index 000000000000..7a9b6c9800c7 --- /dev/null +++ b/tests/neg/i22552.check @@ -0,0 +1,8 @@ +-- [E040] Syntax Error: tests/neg/i22552.scala:3:10 -------------------------------------------------------------------- +3 | type A[X: TC] // error + | ^ + | ']' expected, but ':' found +-- Error: tests/neg/i22552.scala:4:15 ---------------------------------------------------------------------------------- +4 | type C = [X: TC] =>> List[X] // error + | ^^ + | context bounds are not allowed in type lambdas diff --git a/tests/neg/i22552.scala b/tests/neg/i22552.scala new file mode 100644 index 000000000000..5ac7840a3a96 --- /dev/null +++ b/tests/neg/i22552.scala @@ -0,0 +1,5 @@ +trait Foo: + type TC[T] + type A[X: TC] // error + type C = [X: TC] =>> List[X] // error + type D = [X: TC] => () => List[X] // allowed context bound