@@ -336,6 +336,11 @@ object RefChecks {
336
336
next == other || isInheritedAccessor(next, other)
337
337
}
338
338
339
+ def incompatibleRepeatedParam (member : Symbol , other : Symbol ): Boolean =
340
+ member.is(Method , butNot = JavaDefined ) && other.is(Method , butNot = JavaDefined ) && atPhase(typerPhase) {
341
+ member.info.paramInfoss.nestedZipExists(other.info.paramInfoss)(_.isRepeatedParam != _.isRepeatedParam)
342
+ }
343
+
339
344
/* Check that all conditions for overriding `other` by `member`
340
345
* of class `clazz` are met.
341
346
*/
@@ -425,10 +430,8 @@ object RefChecks {
425
430
// Console.println(infoString(member) + " overrides " + infoString(other) + " in " + clazz);//DEBUG
426
431
427
432
/* Is the intersection between given two lists of overridden symbols empty? */
428
- def intersectionIsEmpty (syms1 : Iterator [Symbol ], syms2 : Iterator [Symbol ]) = {
429
- val set2 = syms2.toSet
430
- ! (syms1 exists (set2 contains _))
431
- }
433
+ def intersectionIsEmpty (syms1 : Iterator [Symbol ], syms2 : Iterator [Symbol ]) =
434
+ ! syms1.exists(syms2.toSet.contains)
432
435
433
436
// o: public | protected | package-protected (aka java's default access)
434
437
// ^-may be overridden by member with access privileges-v
@@ -498,6 +501,8 @@ object RefChecks {
498
501
+ " \n (Note: this can be resolved by declaring an override in " + clazz + " .)" )
499
502
else if member.is(Exported ) then
500
503
overrideError(" cannot override since it comes from an export" )
504
+ else if incompatibleRepeatedParam(member, other) then
505
+ overrideError(" cannot override because erased signatures conflict in repeated parameter" )
501
506
else
502
507
overrideError(" needs `override` modifier" )
503
508
else if (other.is(AbsOverride ) && other.isIncompleteIn(clazz) && ! member.is(AbsOverride ))
@@ -878,6 +883,7 @@ object RefChecks {
878
883
def isSignatureMatch (sym : Symbol ) = sym.isType || {
879
884
val self = clazz.thisType
880
885
sym.asSeenFrom(self).matches(member.asSeenFrom(self))
886
+ && ! incompatibleRepeatedParam(sym, member)
881
887
}
882
888
883
889
/* The rules for accessing members which have an access boundary are more
@@ -910,8 +916,8 @@ object RefChecks {
910
916
}
911
917
912
918
// 4. Check that every defined member with an `override` modifier overrides some other member.
913
- for ( member <- clazz.info.decls)
914
- if ( member.isAnyOverride && ! ( clazz.thisType.baseClasses exists (hasMatchingSym(_, member)))) {
919
+ for member <- clazz.info.decls do
920
+ if member.isAnyOverride && ! clazz.thisType.baseClasses. exists(hasMatchingSym(_, member)) then
915
921
if (checks != noPrinter)
916
922
for (bc <- clazz.info.baseClasses.tail) {
917
923
val sym = bc.info.decl(member.name).symbol
@@ -935,7 +941,7 @@ object RefChecks {
935
941
}
936
942
member.resetFlag(Override )
937
943
member.resetFlag(AbsOverride )
938
- }
944
+ end if
939
945
}
940
946
941
947
/** Check that we do not "override" anything with a private method
0 commit comments