Skip to content

Commit 765369d

Browse files
committed
Reject by-name types as arguments of AndTypeTree and OrTypeTree
Those types lead to assertion failures later while building OrTypeTree. Reject them, also for AndTypeTree.
1 parent 9f52acf commit 765369d

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

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

+16-3
Original file line numberDiff line numberDiff line change
@@ -468,9 +468,9 @@ object Parsers {
468468
val l = opInfo.operand
469469
val r = top
470470
if (isType && !op.isBackquoted && op.name == tpnme.raw.BAR) {
471-
OrTypeTree(checkWildcard(l), checkWildcard(r))
471+
OrTypeTree(checkAndOrArgument(l), checkAndOrArgument(r))
472472
} else if (isType && !op.isBackquoted && op.name == tpnme.raw.AMP) {
473-
AndTypeTree(checkWildcard(l), checkWildcard(r))
473+
AndTypeTree(checkAndOrArgument(l), checkAndOrArgument(r))
474474
} else
475475
InfixOp(l, op, r)
476476
}
@@ -842,7 +842,7 @@ object Parsers {
842842
if (ctx.settings.strict.value)
843843
deprecationWarning(DeprecatedWithOperator())
844844
in.nextToken()
845-
AndTypeTree(checkWildcard(t), checkWildcard(withType()))
845+
AndTypeTree(checkAndOrArgument(t), checkAndOrArgument(withType()))
846846
}
847847
else t
848848

@@ -1035,6 +1035,19 @@ object Parsers {
10351035
else
10361036
rejectWildcard(t, fallbackTree)
10371037

1038+
def checkAndOrArgument(t: Tree): Tree =
1039+
findWildcardType(t, true) match {
1040+
case Some(typTree) =>
1041+
typTree match {
1042+
case typTree: TypeBoundsTree =>
1043+
syntaxError(UnboundWildcardType(), typTree.pos)
1044+
case typTree: ByNameTypeTree =>
1045+
syntaxError(ByNameParameterNotSupported(typTree), typTree.pos)
1046+
}
1047+
scalaAny
1048+
case None => t
1049+
}
1050+
10381051
/* ----------- EXPRESSIONS ------------------------------------------------ */
10391052

10401053
/** EqualsExpr ::= `=' Expr

0 commit comments

Comments
 (0)