diff --git a/compiler/src/dotty/tools/dotc/typer/Checking.scala b/compiler/src/dotty/tools/dotc/typer/Checking.scala index 2869f64f33d0..4291a6ebff9a 100644 --- a/compiler/src/dotty/tools/dotc/typer/Checking.scala +++ b/compiler/src/dotty/tools/dotc/typer/Checking.scala @@ -145,7 +145,13 @@ object Checking { val checker = new TypeTraverser: def traverse(tp: Type) = tp match - case AppliedType(tycon, argTypes) => + case AppliedType(tycon, argTypes) + if !(tycon.typeSymbol.is(JavaDefined) && ctx.compilationUnit.isJava) => + // Don't check bounds in Java units that refer to Java type constructors. + // Scala is not obliged to do Java type checking and in fact i17763 goes wrong + // if we attempt to check bounds of F-bounded mutually recursive Java interfaces. + // Do check all bounds in Scala units and those bounds in Java units that + // occur in applications of Scala type constructors. checkAppliedType( untpd.AppliedTypeTree(TypeTree(tycon), argTypes.map(TypeTree(_))) .withType(tp).withSpan(tpt.span.toSynthetic), diff --git a/tests/pos/i17763/CopyableBuilder.java b/tests/pos/i17763/CopyableBuilder.java new file mode 100644 index 000000000000..ad19f3404d7e --- /dev/null +++ b/tests/pos/i17763/CopyableBuilder.java @@ -0,0 +1,2 @@ +public interface CopyableBuilder, T extends ToCopyableBuilder> { +} diff --git a/tests/pos/i17763/Crash.scala b/tests/pos/i17763/Crash.scala new file mode 100644 index 000000000000..e6182c4d2e35 --- /dev/null +++ b/tests/pos/i17763/Crash.scala @@ -0,0 +1 @@ +class Crash diff --git a/tests/pos/i17763/ToCopyableBuilder.java b/tests/pos/i17763/ToCopyableBuilder.java new file mode 100644 index 000000000000..1928385a6cdc --- /dev/null +++ b/tests/pos/i17763/ToCopyableBuilder.java @@ -0,0 +1,2 @@ +public interface ToCopyableBuilder, T extends ToCopyableBuilder> { +}