@@ -253,7 +253,7 @@ object RefChecks {
253
253
def infoString (sym : Symbol ) = infoString0(sym, sym.owner != clazz)
254
254
def infoStringWithLocation (sym : Symbol ) = infoString0(sym, true )
255
255
256
- def infoString0 (sym : Symbol , showLocation : Boolean ) = {
256
+ def infoString0 (sym : Symbol , showLocation : Boolean ) = atPhase(typerPhase) {
257
257
val sym1 = sym.underlyingSymbol
258
258
def info = self.memberInfo(sym1)
259
259
val infoStr =
@@ -265,6 +265,11 @@ object RefChecks {
265
265
i " ${if (showLocation) sym1.showLocated else sym1}$infoStr"
266
266
}
267
267
268
+ def incompatibleRepeatedParam (member : Symbol , other : Symbol ): Boolean =
269
+ member.is(Method , butNot = JavaDefined ) && other.is(Method , butNot = JavaDefined ) && atPhase(typerPhase) {
270
+ member.info.paramInfoss.nestedZipExists(other.info.paramInfoss)(_.isRepeatedParam != _.isRepeatedParam)
271
+ }
272
+
268
273
/* Check that all conditions for overriding `other` by `member`
269
274
* of class `clazz` are met.
270
275
*/
@@ -350,10 +355,8 @@ object RefChecks {
350
355
// Console.println(infoString(member) + " overrides " + infoString(other) + " in " + clazz);//DEBUG
351
356
352
357
/* 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
- }
358
+ def intersectionIsEmpty (syms1 : Iterator [Symbol ], syms2 : Iterator [Symbol ]) =
359
+ ! syms1.exists(syms2.toSet.contains)
357
360
358
361
// o: public | protected | package-protected (aka java's default access)
359
362
// ^-may be overridden by member with access privileges-v
@@ -414,6 +417,8 @@ object RefChecks {
414
417
+ " \n (Note: this can be resolved by declaring an override in " + clazz + " .)" )
415
418
else if member.is(Exported ) then
416
419
overrideError(" cannot override since it comes from an export" )
420
+ else if incompatibleRepeatedParam(member, other) then
421
+ overrideError(" cannot override because erased signatures conflict in repeated parameter" )
417
422
else
418
423
overrideError(" needs `override` modifier" )
419
424
else if (other.is(AbsOverride ) && other.isIncompleteIn(clazz) && ! member.is(AbsOverride ))
@@ -839,6 +844,7 @@ object RefChecks {
839
844
def isSignatureMatch (sym : Symbol ) = sym.isType || {
840
845
val self = clazz.thisType
841
846
sym.asSeenFrom(self).matches(member.asSeenFrom(self))
847
+ && ! incompatibleRepeatedParam(sym, member)
842
848
}
843
849
844
850
/* The rules for accessing members which have an access boundary are more
@@ -871,8 +877,8 @@ object RefChecks {
871
877
}
872
878
873
879
// 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)))) {
880
+ for member <- clazz.info.decls do
881
+ if member.isAnyOverride && ! clazz.thisType.baseClasses. exists(hasMatchingSym(_, member)) then
876
882
if (checks != noPrinter)
877
883
for (bc <- clazz.info.baseClasses.tail) {
878
884
val sym = bc.info.decl(member.name).symbol
@@ -896,7 +902,7 @@ object RefChecks {
896
902
}
897
903
member.resetFlag(Override )
898
904
member.resetFlag(AbsOverride )
899
- }
905
+ end if
900
906
}
901
907
902
908
// Note: if a symbol has both @deprecated and @migration annotations and both
0 commit comments