@@ -20,7 +20,7 @@ import dotty.tools.dotc.typer.Implicits._
2020import dotty .tools .dotc .typer .Inferencing ._
2121import dotty .tools .dotc .util .Spans ._
2222import dotty .tools .dotc .util .Stats .record
23-
23+ import dotty . tools . dotc . reporting . IllegalVariableInPatternAlternative
2424import scala .collection .mutable
2525
2626
@@ -243,6 +243,17 @@ trait QuotesAndSplices {
243243 res
244244 }
245245
246+ def checkAlternativeBinds (pat0 : Tree ): Unit =
247+ def rec (pat : Tree ): Unit =
248+ pat match
249+ case Typed (pat, _) => rec(pat)
250+ case UnApply (_, _, pats) => pats.foreach(rec)
251+ case pat : Bind =>
252+ report.error(IllegalVariableInPatternAlternative (pat.symbol.name), pat.withSpan(pat.nameSpan))
253+ rec(pat.body)
254+ case _ =>
255+ if ctx.mode.is(Mode .InPatternAlternative ) then rec(pat0)
256+
246257 val patBuf = new mutable.ListBuffer [Tree ]
247258 val freshTypePatBuf = new mutable.ListBuffer [Tree ]
248259 val freshTypeBindingsBuff = new mutable.ListBuffer [Tree ]
@@ -254,6 +265,7 @@ trait QuotesAndSplices {
254265 val newSplice = ref(defn.QuotedRuntime_exprSplice ).appliedToType(tpt1.tpe).appliedTo(Typed (pat, exprTpt))
255266 transform(newSplice)
256267 case Apply (TypeApply (fn, targs), Apply (sp, pat :: Nil ) :: args :: Nil ) if fn.symbol == defn.QuotedRuntimePatterns_patternHigherOrderHole =>
268+ checkAlternativeBinds(pat)
257269 args match // TODO support these patterns. Possibly using scala.quoted.util.Var
258270 case SeqLiteral (args, _) =>
259271 for arg <- args; if arg.symbol.is(Mutable ) do
@@ -266,6 +278,7 @@ trait QuotesAndSplices {
266278 patBuf += pat1
267279 }
268280 case Apply (fn, pat :: Nil ) if fn.symbol.isExprSplice =>
281+ checkAlternativeBinds(pat)
269282 try ref(defn.QuotedRuntimePatterns_patternHole .termRef).appliedToType(tree.tpe).withSpan(tree.span)
270283 finally {
271284 val patType = pat.tpe.widen
@@ -321,7 +334,9 @@ trait QuotesAndSplices {
321334 }
322335
323336 private def transformTypeBindingTypeDef (nameOfSyntheticGiven : TermName , tdef : TypeDef , buff : mutable.Builder [Tree , List [Tree ]])(using Context ): Tree = {
324- if (variance == - 1 )
337+ if ctx.mode.is(Mode .InPatternAlternative ) then
338+ report.error(IllegalVariableInPatternAlternative (tdef.symbol.name), tdef.srcPos)
339+ if variance == - 1 then
325340 tdef.symbol.addAnnotation(Annotation (New (ref(defn.QuotedRuntimePatterns_fromAboveAnnot .typeRef)).withSpan(tdef.span)))
326341 val bindingType = getBinding(tdef.symbol).symbol.typeRef
327342 val bindingTypeTpe = AppliedType (defn.QuotedTypeClass .typeRef, bindingType :: Nil )
0 commit comments