@@ -26,6 +26,7 @@ import scala.util.matching.Regex._
26
26
import Constants .Constant
27
27
import NullOpsDecorator ._
28
28
import dotty .tools .dotc .config .Feature
29
+ import scala .PartialFunction .cond
29
30
30
31
object RefChecks {
31
32
import tpd ._
@@ -253,7 +254,7 @@ object RefChecks {
253
254
def infoString (sym : Symbol ) = infoString0(sym, sym.owner != clazz)
254
255
def infoStringWithLocation (sym : Symbol ) = infoString0(sym, true )
255
256
256
- def infoString0 (sym : Symbol , showLocation : Boolean ) = {
257
+ def infoString0 (sym : Symbol , showLocation : Boolean ) = atPhase(typerPhase) {
257
258
val sym1 = sym.underlyingSymbol
258
259
def info = self.memberInfo(sym1)
259
260
val infoStr =
@@ -265,6 +266,19 @@ object RefChecks {
265
266
i " ${if (showLocation) sym1.showLocated else sym1}$infoStr"
266
267
}
267
268
269
+ def incompatibleRepeatedParam (member : Symbol , other : Symbol ): Boolean =
270
+ def mismatched (p1 : List [Type ], p2 : List [Type ]): Boolean =
271
+ p1 match
272
+ case h :: t => cond(p2) { case h2 :: t2 => h.isRepeatedParam != h2.isRepeatedParam || mismatched(t, t2) }
273
+ case _ => false
274
+ def loop (ps1 : List [List [Type ]], ps2 : List [List [Type ]]): Boolean =
275
+ ps1 match
276
+ case h :: t => cond(ps2) { case h2 :: t2 => mismatched(h, h2) || loop(t, t2) }
277
+ case _ => false
278
+ member.is(Method , butNot = JavaDefined ) && other.is(Method , butNot = JavaDefined ) && atPhase(typerPhase) {
279
+ loop(member.info.paramInfoss, other.info.paramInfoss)
280
+ }
281
+
268
282
/* Check that all conditions for overriding `other` by `member`
269
283
* of class `clazz` are met.
270
284
*/
@@ -350,10 +364,8 @@ object RefChecks {
350
364
// Console.println(infoString(member) + " overrides " + infoString(other) + " in " + clazz);//DEBUG
351
365
352
366
/* Is the intersection between given two lists of overridden symbols empty? */
353
- def intersectionIsEmpty (syms1 : Iterator [Symbol ], syms2 : Iterator [Symbol ]) = {
354
- val set2 = syms2.toSet
355
- ! (syms1 exists (set2 contains _))
356
- }
367
+ def intersectionIsEmpty (syms1 : Iterator [Symbol ], syms2 : Iterator [Symbol ]) =
368
+ ! syms1.exists(syms2.toSet.contains)
357
369
358
370
// o: public | protected | package-protected (aka java's default access)
359
371
// ^-may be overridden by member with access privileges-v
@@ -414,6 +426,8 @@ object RefChecks {
414
426
+ " \n (Note: this can be resolved by declaring an override in " + clazz + " .)" )
415
427
else if member.is(Exported ) then
416
428
overrideError(" cannot override since it comes from an export" )
429
+ else if incompatibleRepeatedParam(member, other) then
430
+ overrideError(" cannot override because erased signatures conflict in repeated parameter" )
417
431
else
418
432
overrideError(" needs `override` modifier" )
419
433
else if (other.is(AbsOverride ) && other.isIncompleteIn(clazz) && ! member.is(AbsOverride ))
@@ -839,6 +853,7 @@ object RefChecks {
839
853
def isSignatureMatch (sym : Symbol ) = sym.isType || {
840
854
val self = clazz.thisType
841
855
sym.asSeenFrom(self).matches(member.asSeenFrom(self))
856
+ && ! incompatibleRepeatedParam(sym, member)
842
857
}
843
858
844
859
/* The rules for accessing members which have an access boundary are more
@@ -871,8 +886,8 @@ object RefChecks {
871
886
}
872
887
873
888
// 4. Check that every defined member with an `override` modifier overrides some other member.
874
- for ( member <- clazz.info.decls)
875
- if ( member.isAnyOverride && ! ( clazz.thisType.baseClasses exists (hasMatchingSym(_, member)))) {
889
+ for member <- clazz.info.decls do
890
+ if member.isAnyOverride && ! clazz.thisType.baseClasses. exists(hasMatchingSym(_, member)) then
876
891
if (checks != noPrinter)
877
892
for (bc <- clazz.info.baseClasses.tail) {
878
893
val sym = bc.info.decl(member.name).symbol
@@ -896,7 +911,7 @@ object RefChecks {
896
911
}
897
912
member.resetFlag(Override )
898
913
member.resetFlag(AbsOverride )
899
- }
914
+ end if
900
915
}
901
916
902
917
// Note: if a symbol has both @deprecated and @migration annotations and both
0 commit comments