Skip to content

Commit e3dd0c5

Browse files
authored
Merge pull request #12301 from dotty-staging/fix-7380
Fix #7380: Check type members of mirror formals
2 parents 9cdfd12 + 1afccfa commit e3dd0c5

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,12 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
219219
case _ => true
220220
loop(formal)
221221

222+
private def checkRefinement(formal: Type, name: TypeName, expected: Type, span: Span)(using Context): Unit =
223+
val actual = formal.lookupRefined(name)
224+
if actual.exists && !(expected =:= actual)
225+
then report.error(
226+
em"$name mismatch, expected: $expected, found: $actual.", ctx.source.atSpan(span))
227+
222228
private def mkMirroredMonoType(mirroredType: HKTypeLambda)(using Context): Type =
223229
val monoMap = new TypeMap:
224230
def apply(t: Type) = t match
@@ -260,10 +266,13 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
260266
case _ =>
261267
val elems = TypeOps.nestedPairs(accessors.map(mirroredType.memberInfo(_).widenExpr))
262268
(mirroredType, elems)
269+
val elemsLabels = TypeOps.nestedPairs(elemLabels)
270+
checkRefinement(formal, tpnme.MirroredElemTypes, elemsType, span)
271+
checkRefinement(formal, tpnme.MirroredElemLabels, elemsLabels, span)
263272
val mirrorType =
264273
mirrorCore(defn.Mirror_ProductClass, monoType, mirroredType, cls.name, formal)
265274
.refinedWith(tpnme.MirroredElemTypes, TypeAlias(elemsType))
266-
.refinedWith(tpnme.MirroredElemLabels, TypeAlias(TypeOps.nestedPairs(elemLabels)))
275+
.refinedWith(tpnme.MirroredElemLabels, TypeAlias(elemsLabels))
267276
val mirrorRef =
268277
if (cls.is(Scala2x)) anonymousMirror(monoType, ExtendsProductMirror, span)
269278
else companionPath(mirroredType, span)

tests/neg/7380.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import scala.deriving.Mirror
2+
3+
object Test {
4+
summon[Mirror.Of[(Int, String)] {
5+
type MirroredElemTypes = (Int, Int, Int)
6+
}] // error
7+
// MirroredElemTypes missmatch, expected: (Int, String), found: (Int, Int, Int).
8+
9+
summon[Mirror.Of[(Int, String)] {
10+
type MirroredElemLabels = ("_1", "_2", "_3")
11+
}] // error
12+
// MirroredElemLabels missmatch, expected: (("_1" : String), ("_2" : String)),
13+
// found: (("_1" : String), ("_2" : String), ("_3" : String)).
14+
}

0 commit comments

Comments
 (0)