@@ -336,6 +336,22 @@ object RefChecks {
336
336
next == other || isInheritedAccessor(next, other)
337
337
}
338
338
339
+ /** Detect any param section where params in last position do not agree isRepeatedParam.
340
+ */
341
+ def incompatibleRepeatedParam (member : Symbol , other : Symbol ): Boolean =
342
+ def loop (mParamInfoss : List [List [Type ]], oParamInfoss : List [List [Type ]]): Boolean =
343
+ mParamInfoss match
344
+ case Nil => false
345
+ case h :: t =>
346
+ oParamInfoss match
347
+ case Nil => false
348
+ case h2 :: t2 => h.nonEmpty && h2.nonEmpty && h.last.isRepeatedParam != h2.last.isRepeatedParam
349
+ || loop(t, t2)
350
+ member.is(Method , butNot = JavaDefined )
351
+ && other.is(Method , butNot = JavaDefined )
352
+ && atPhase(typerPhase):
353
+ loop(member.info.paramInfoss, other.info.paramInfoss)
354
+
339
355
/* Check that all conditions for overriding `other` by `member`
340
356
* of class `clazz` are met.
341
357
*/
@@ -425,10 +441,8 @@ object RefChecks {
425
441
// Console.println(infoString(member) + " overrides " + infoString(other) + " in " + clazz);//DEBUG
426
442
427
443
/* 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
- }
444
+ def intersectionIsEmpty (syms1 : Iterator [Symbol ], syms2 : Iterator [Symbol ]) =
445
+ ! syms1.exists(syms2.toSet.contains)
432
446
433
447
// o: public | protected | package-protected (aka java's default access)
434
448
// ^-may be overridden by member with access privileges-v
@@ -498,6 +512,8 @@ object RefChecks {
498
512
+ " \n (Note: this can be resolved by declaring an override in " + clazz + " .)" )
499
513
else if member.is(Exported ) then
500
514
overrideError(" cannot override since it comes from an export" )
515
+ else if incompatibleRepeatedParam(member, other) then
516
+ report.error(DoubleDefinition (member, other, clazz), member.srcPos)
501
517
else
502
518
overrideError(" needs `override` modifier" )
503
519
else if (other.is(AbsOverride ) && other.isIncompleteIn(clazz) && ! member.is(AbsOverride ))
@@ -878,6 +894,7 @@ object RefChecks {
878
894
def isSignatureMatch (sym : Symbol ) = sym.isType || {
879
895
val self = clazz.thisType
880
896
sym.asSeenFrom(self).matches(member.asSeenFrom(self))
897
+ && ! incompatibleRepeatedParam(sym, member)
881
898
}
882
899
883
900
/* The rules for accessing members which have an access boundary are more
@@ -910,8 +927,8 @@ object RefChecks {
910
927
}
911
928
912
929
// 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)))) {
930
+ for member <- clazz.info.decls do
931
+ if member.isAnyOverride && ! clazz.thisType.baseClasses. exists(hasMatchingSym(_, member)) then
915
932
if (checks != noPrinter)
916
933
for (bc <- clazz.info.baseClasses.tail) {
917
934
val sym = bc.info.decl(member.name).symbol
@@ -935,7 +952,7 @@ object RefChecks {
935
952
}
936
953
member.resetFlag(Override )
937
954
member.resetFlag(AbsOverride )
938
- }
955
+ end if
939
956
}
940
957
941
958
/** Check that we do not "override" anything with a private method
0 commit comments