diff --git a/compiler/src/dotty/tools/dotc/ast/Desugar.scala b/compiler/src/dotty/tools/dotc/ast/Desugar.scala index 3d6965ba47a9..9db12e21913a 100644 --- a/compiler/src/dotty/tools/dotc/ast/Desugar.scala +++ b/compiler/src/dotty/tools/dotc/ast/Desugar.scala @@ -522,7 +522,7 @@ object desugar { if enumTParams.nonEmpty then defaultGetters = defaultGetters.map: case ddef: DefDef => - val tParams = enumTParams.map(tparam => toMethParam(tparam, KeepAnnotations.All)) + val tParams = enumTParams.map(tparam => toDefParam(tparam, keepAnnotations = true)) cpy.DefDef(ddef)(paramss = joinParams(tParams, ddef.trailingParamss)) val (normalizedBody, enumCases, enumCompanionRef) = { diff --git a/compiler/src/dotty/tools/dotc/typer/Applications.scala b/compiler/src/dotty/tools/dotc/typer/Applications.scala index 864c98dd475a..a109a2f3f621 100644 --- a/compiler/src/dotty/tools/dotc/typer/Applications.scala +++ b/compiler/src/dotty/tools/dotc/typer/Applications.scala @@ -885,6 +885,8 @@ trait Applications extends Compatibility { val app1 = if !success then app0.withType(UnspecifiedErrorType) else { + if isAnnotConstr(methRef.symbol) && !isJavaAnnotConstr(methRef.symbol) then + typedArgs if !sameSeq(args, orderedArgs) && !isJavaAnnotConstr(methRef.symbol) && !typedArgs.forall(isSafeArg) diff --git a/compiler/src/dotty/tools/dotc/typer/Typer.scala b/compiler/src/dotty/tools/dotc/typer/Typer.scala index cad729da7e55..d46c85b38e9d 100644 --- a/compiler/src/dotty/tools/dotc/typer/Typer.scala +++ b/compiler/src/dotty/tools/dotc/typer/Typer.scala @@ -234,6 +234,12 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer // special cases: definitions beat imports, and named imports beat // wildcard imports, provided both are in contexts with same scope found + else if newPrec == WildImport && ctx.outersIterator.exists: ctx => + ctx.isImportContext && namedImportRef(ctx.importInfo.uncheckedNN).exists + then + // Don't let two ambiguous wildcard imports rule over + // a winning named import. See pos/i18529. + found else if !scala2pkg && !previous.isError && !found.isError then fail(AmbiguousReference(name, newPrec, prevPrec, prevCtx)) diff --git a/tests/pos/i18529/JCode1.java b/tests/pos/i18529/JCode1.java new file mode 100644 index 000000000000..e1f12f852c00 --- /dev/null +++ b/tests/pos/i18529/JCode1.java @@ -0,0 +1,9 @@ +package bug.code; + +import bug.util.List; +import bug.util.*; +import java.util.*; + +public class JCode1 { + public void m1(List xs) { return; } +} diff --git a/tests/pos/i18529/JCode2.java b/tests/pos/i18529/JCode2.java new file mode 100644 index 000000000000..2a1ec812852c --- /dev/null +++ b/tests/pos/i18529/JCode2.java @@ -0,0 +1,9 @@ +package bug.code; + +import bug.util.*; +import bug.util.List; +import java.util.*; + +public class JCode2 { + public void m1(List xs) { return; } +} diff --git a/tests/pos/i18529/List.java b/tests/pos/i18529/List.java new file mode 100644 index 000000000000..caf3c0b8036b --- /dev/null +++ b/tests/pos/i18529/List.java @@ -0,0 +1,3 @@ +package bug.util; + +public final class List {} diff --git a/tests/pos/i18529/SCode1.scala b/tests/pos/i18529/SCode1.scala new file mode 100644 index 000000000000..b6796b1540c6 --- /dev/null +++ b/tests/pos/i18529/SCode1.scala @@ -0,0 +1,9 @@ +package bug.code + +import bug.util.List +import bug.util.* +import java.util.* + +class SCode1 { + def work(xs: List[Int]): Unit = {} +} diff --git a/tests/pos/i18529/SCode2.scala b/tests/pos/i18529/SCode2.scala new file mode 100644 index 000000000000..30fc7d0e6f91 --- /dev/null +++ b/tests/pos/i18529/SCode2.scala @@ -0,0 +1,9 @@ +package bug.code + +import bug.util.* +import bug.util.List +import java.util.* + +class SCode2 { + def work(xs: List[Int]): Unit = {} +} diff --git a/tests/pos/i18529/Test.scala b/tests/pos/i18529/Test.scala new file mode 100644 index 000000000000..be7795442a7a --- /dev/null +++ b/tests/pos/i18529/Test.scala @@ -0,0 +1 @@ +class Test diff --git a/tests/printing/dependent-annot-default-args.check b/tests/printing/dependent-annot-default-args.check index f457d5d62edb..44c1fe31e2d1 100644 --- a/tests/printing/dependent-annot-default-args.check +++ b/tests/printing/dependent-annot-default-args.check @@ -8,39 +8,16 @@ package { final module class annot() extends AnyRef() { this: annot.type => def $lessinit$greater$default$2: Any @uncheckedVariance = 42 } - class annot2(x: Any, y: Array[Any]) extends annotation.Annotation() { - private[this] val x: Any - private[this] val y: Array[Any] - } - final lazy module val annot2: annot2 = new annot2() - final module class annot2() extends AnyRef() { this: annot2.type => - def $lessinit$greater$default$1: Any @uncheckedVariance = -1 - def $lessinit$greater$default$2: Array[Any] @uncheckedVariance = - Array.apply[Any](["Hello" : Any]*)(scala.reflect.ClassTag.Any) - } final lazy module val dependent-annot-default-args$package: dependent-annot-default-args$package = new dependent-annot-default-args$package() final module class dependent-annot-default-args$package() extends Object() { this: dependent-annot-default-args$package.type => def f(x: Int): Int @annot(x) = x - def f2(x: Int): - Int @annot2( - y = Array.apply[Any](["Hello",x : Any]*)(scala.reflect.ClassTag.Any)) - = x def test: Unit = { val y: Int = ??? val z: Int @annot(y) = f(y) - val z2: - Int @annot2( - y = Array.apply[Any](["Hello",y : Any]*)(scala.reflect.ClassTag.Any) - ) - = f2(y) - @annot(44) val z3: Int = 45 - @annot2( - y = Array.apply[Any](["Hello",y : Any]*)(scala.reflect.ClassTag.Any)) - val z4: Int = 45 () } } diff --git a/tests/printing/dependent-annot-default-args.scala b/tests/printing/dependent-annot-default-args.scala index 11fc9ef52cc9..075913a63689 100644 --- a/tests/printing/dependent-annot-default-args.scala +++ b/tests/printing/dependent-annot-default-args.scala @@ -1,15 +1,6 @@ class annot(x: Any, y: Any = 42) extends annotation.Annotation -class annot2(x: Any = -1, y: Array[Any] = Array("Hello")) extends annotation.Annotation - def f(x: Int): Int @annot(x) = x -def f2(x: Int): Int @annot2(y = Array("Hello", x)) = x def test = val y: Int = ??? - val z = f(y) - val z2 = f2(y) - - @annot(44) val z3 = 45 - @annot2(y = Array("Hello", y)) val z4 = 45 -