@@ -336,6 +336,11 @@ object RefChecks {
336336 next == other || isInheritedAccessor(next, other)
337337 }
338338
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+
339344 /* Check that all conditions for overriding `other` by `member`
340345 * of class `clazz` are met.
341346 */
@@ -425,10 +430,8 @@ object RefChecks {
425430 // Console.println(infoString(member) + " overrides " + infoString(other) + " in " + clazz);//DEBUG
426431
427432 /* 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)
432435
433436 // o: public | protected | package-protected (aka java's default access)
434437 // ^-may be overridden by member with access privileges-v
@@ -498,6 +501,8 @@ object RefChecks {
498501 + " \n (Note: this can be resolved by declaring an override in " + clazz + " .)" )
499502 else if member.is(Exported ) then
500503 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" )
501506 else
502507 overrideError(" needs `override` modifier" )
503508 else if (other.is(AbsOverride ) && other.isIncompleteIn(clazz) && ! member.is(AbsOverride ))
@@ -878,6 +883,7 @@ object RefChecks {
878883 def isSignatureMatch (sym : Symbol ) = sym.isType || {
879884 val self = clazz.thisType
880885 sym.asSeenFrom(self).matches(member.asSeenFrom(self))
886+ && ! incompatibleRepeatedParam(sym, member)
881887 }
882888
883889 /* The rules for accessing members which have an access boundary are more
@@ -910,8 +916,8 @@ object RefChecks {
910916 }
911917
912918 // 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
915921 if (checks != noPrinter)
916922 for (bc <- clazz.info.baseClasses.tail) {
917923 val sym = bc.info.decl(member.name).symbol
@@ -935,7 +941,7 @@ object RefChecks {
935941 }
936942 member.resetFlag(Override )
937943 member.resetFlag(AbsOverride )
938- }
944+ end if
939945 }
940946
941947 /** Check that we do not "override" anything with a private method
0 commit comments