From 5421c4c0364649f028cc39e3b921746095774b68 Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Mon, 13 Jan 2025 19:22:12 +0100 Subject: [PATCH 1/2] Check if a prefix is valid before selecting from a type Co-Authored-By: Katarzyna Marek <26606662+kasiaMarek@users.noreply.github.com> --- compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala | 2 +- tests/neg/i22357.check | 4 ++++ tests/neg/i22357.scala | 2 ++ tests/neg/i22357a.check | 4 ++++ tests/neg/i22357a.scala | 2 ++ 5 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 tests/neg/i22357.check create mode 100644 tests/neg/i22357.scala create mode 100644 tests/neg/i22357a.check create mode 100644 tests/neg/i22357a.scala diff --git a/compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala b/compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala index 6ce0f5f2517c..8448017cbada 100644 --- a/compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala +++ b/compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala @@ -163,7 +163,7 @@ trait TypeAssigner { else qualType.findMember(name, pre) - if reallyExists(mbr) then qualType.select(name, mbr) + if reallyExists(mbr) && NamedType.validPrefix(qualType) then qualType.select(name, mbr) else if qualType.isErroneous || name.toTermName == nme.ERROR then UnspecifiedErrorType else NoType end selectionType diff --git a/tests/neg/i22357.check b/tests/neg/i22357.check new file mode 100644 index 000000000000..213782a7fc6c --- /dev/null +++ b/tests/neg/i22357.check @@ -0,0 +1,4 @@ +-- Error: tests/neg/i22357.scala:1:0 ----------------------------------------------------------------------------------- +1 |@([A] =>> Int) // error + |^^^^^^^^^^^^^^ + |[A] =>> Int does not have a constructor diff --git a/tests/neg/i22357.scala b/tests/neg/i22357.scala new file mode 100644 index 000000000000..d572c150fb81 --- /dev/null +++ b/tests/neg/i22357.scala @@ -0,0 +1,2 @@ +@([A] =>> Int) // error +def i = 1 diff --git a/tests/neg/i22357a.check b/tests/neg/i22357a.check new file mode 100644 index 000000000000..9b2bcd2510d4 --- /dev/null +++ b/tests/neg/i22357a.check @@ -0,0 +1,4 @@ +-- Error: tests/neg/i22357a.scala:2:6 ---------------------------------------------------------------------------------- +2 | new ([A] =>> Int)(2) // error + | ^^^^^^^^^^^^^ + | [A] =>> Int does not have a constructor diff --git a/tests/neg/i22357a.scala b/tests/neg/i22357a.scala new file mode 100644 index 000000000000..b6c9c04fb268 --- /dev/null +++ b/tests/neg/i22357a.scala @@ -0,0 +1,2 @@ +def main = + new ([A] =>> Int)(2) // error From ecf1a86d6ef495d0e87afec69ddb439deece2391 Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Tue, 21 Jan 2025 11:05:46 +0100 Subject: [PATCH 2/2] Ignore i22357a test case in best effort compilation --- compiler/test/dotc/neg-best-effort-unpickling.excludelist | 3 +++ 1 file changed, 3 insertions(+) diff --git a/compiler/test/dotc/neg-best-effort-unpickling.excludelist b/compiler/test/dotc/neg-best-effort-unpickling.excludelist index 1e22d919f25a..d57f7e0176e8 100644 --- a/compiler/test/dotc/neg-best-effort-unpickling.excludelist +++ b/compiler/test/dotc/neg-best-effort-unpickling.excludelist @@ -15,3 +15,6 @@ overrideClass.scala # repeating on a top level type definition i18750.scala + +# Crash on invalid prefix ([A] =>> Int) +i22357a.scala