From 80eb2861554f185da87b4764577e8187932befa5 Mon Sep 17 00:00:00 2001 From: Wojciech Mazur Date: Tue, 25 Jun 2024 12:28:10 +0200 Subject: [PATCH 1/3] Check targetName when subtyping Refined Types [Cherry-picked 7596819162a6feec801a455d55727c36cbbf9d6c][modified] --- compiler/src/dotty/tools/dotc/core/TypeComparer.scala | 8 +++++--- tests/neg/i18922.check | 7 +++++++ tests/neg/i18922.scala | 11 +++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 tests/neg/i18922.check create mode 100644 tests/neg/i18922.scala diff --git a/compiler/src/dotty/tools/dotc/core/TypeComparer.scala b/compiler/src/dotty/tools/dotc/core/TypeComparer.scala index 353e7746280d..7687263c0e36 100644 --- a/compiler/src/dotty/tools/dotc/core/TypeComparer.scala +++ b/compiler/src/dotty/tools/dotc/core/TypeComparer.scala @@ -1989,9 +1989,11 @@ class TypeComparer(@constructorOnly initctx: Context) extends ConstraintHandling def qualifies(m: SingleDenotation): Boolean = val info1 = m.info.widenExpr - isSubInfo(info1, tp2.refinedInfo.widenExpr, m.symbol.info.orElse(info1)) - || matchAbstractTypeMember(m.info) - || (tp1.isStable && isSubType(TermRef(tp1, m.symbol), tp2.refinedInfo)) + m.symbol.hasTargetName(m.symbol.name) && ( + isSubInfo(info1, tp2.refinedInfo.widenExpr, m.symbol.info.orElse(info1)) + || matchAbstractTypeMember(m.info) + || (tp1.isStable && isSubType(TermRef(tp1, m.symbol), tp2.refinedInfo)) + ) tp1.member(name) match // inlined hasAltWith for performance case mbr: SingleDenotation => qualifies(mbr) diff --git a/tests/neg/i18922.check b/tests/neg/i18922.check new file mode 100644 index 000000000000..f686d8e2f619 --- /dev/null +++ b/tests/neg/i18922.check @@ -0,0 +1,7 @@ +-- [E007] Type Mismatch Error: tests/neg/i18922.scala:11:27 ------------------------------------------------------------ +11 |def test = doClose(Resource()) // error + | ^^^^^^^^^^ + | Found: Resource + | Required: Object{def close(): Unit} + | + | longer explanation available when compiling with `-explain` diff --git a/tests/neg/i18922.scala b/tests/neg/i18922.scala new file mode 100644 index 000000000000..9c76177a0c7a --- /dev/null +++ b/tests/neg/i18922.scala @@ -0,0 +1,11 @@ +import scala.annotation.targetName + +def doClose(closable: { def close(): Unit }): Unit = + import reflect.Selectable.reflectiveSelectable + closable.close() + +class Resource: + @targetName("foo") + def close(): Unit = ??? + +def test = doClose(Resource()) // error \ No newline at end of file From 518300ac0602b3f1a311ce7618d5dafc11ebe827 Mon Sep 17 00:00:00 2001 From: Hamza Remmal <56235032+hamzaremmal@users.noreply.github.com> Date: Wed, 29 Nov 2023 13:23:52 +0100 Subject: [PATCH 2/3] Move targetName-refine from pos/ to neg/ [Cherry-picked 582192df0149e617fded08119beaab87be59be91] --- tests/neg/targetName-refine.check | 7 +++++++ tests/{pos => neg}/targetName-refine.scala | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 tests/neg/targetName-refine.check rename tests/{pos => neg}/targetName-refine.scala (76%) diff --git a/tests/neg/targetName-refine.check b/tests/neg/targetName-refine.check new file mode 100644 index 000000000000..fe0dd71dfb0a --- /dev/null +++ b/tests/neg/targetName-refine.check @@ -0,0 +1,7 @@ +-- [E007] Type Mismatch Error: tests/neg/targetName-refine.scala:7:27 -------------------------------------------------- +7 |val x: T { def f: Int } = C() // error + | ^^^ + | Found: C + | Required: T{def f: Int} + | + | longer explanation available when compiling with `-explain` diff --git a/tests/pos/targetName-refine.scala b/tests/neg/targetName-refine.scala similarity index 76% rename from tests/pos/targetName-refine.scala rename to tests/neg/targetName-refine.scala index eaa02b8b7976..f9b8f0d72740 100644 --- a/tests/pos/targetName-refine.scala +++ b/tests/neg/targetName-refine.scala @@ -4,5 +4,5 @@ trait T: class C extends T: @targetName("f2") def f: Int = 1 -val x: T { def f: Int } = C() +val x: T { def f: Int } = C() // error From 9575e6ffa0dbd1aa0331ac7fd4d3ee9c524ce51b Mon Sep 17 00:00:00 2001 From: Wojciech Mazur Date: Tue, 25 Jun 2024 12:34:56 +0200 Subject: [PATCH 3/3] Add extend the check for targetName when checking matching members [Cherry-picked ea509f43ef038e981de66d0c9dc2dab57aff9084][modified]