From e7c9fce1f1297bbf7d5f71d2e1c1503a5299d00d Mon Sep 17 00:00:00 2001 From: Jasper Moeys Date: Fri, 28 Sep 2018 13:22:56 +0200 Subject: [PATCH 1/2] Fix #5044: guard against forward references in the TypeTree of New trees --- compiler/src/dotty/tools/dotc/typer/RefChecks.scala | 8 ++++++-- tests/neg/i5044a.scala | 7 +++++++ tests/neg/i5044b.scala | 8 ++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 tests/neg/i5044a.scala create mode 100644 tests/neg/i5044b.scala diff --git a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala index 5f04152c62b1..d25617da85c8 100644 --- a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala +++ b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala @@ -1010,9 +1010,14 @@ class RefChecks extends MiniPhase { thisPhase => } override def transformNew(tree: New)(implicit ctx: Context) = { - val sym = tree.tpe.typeSymbol + val tpe = tree.tpe + val sym = tpe.typeSymbol checkUndesiredProperties(sym, tree.pos) currentLevel.enterReference(sym, tree.pos) + tpe.dealias.foreachPart { + case TermRef(_, s: Symbol) => currentLevel.enterReference(s, tree.pos) + case _ => + } tree } } @@ -1643,4 +1648,3 @@ class RefChecks extends MiniPhase { thisPhase => } } */ - diff --git a/tests/neg/i5044a.scala b/tests/neg/i5044a.scala new file mode 100644 index 000000000000..897c9e5e6d96 --- /dev/null +++ b/tests/neg/i5044a.scala @@ -0,0 +1,7 @@ +class I0 { + class I1 + def i3 = { + val i4 = new i5.I1 // error: `i5` is a forward reference extending over the definition of `i4` + val i5 = new I0 + } +} diff --git a/tests/neg/i5044b.scala b/tests/neg/i5044b.scala new file mode 100644 index 000000000000..1e1391b8d0a7 --- /dev/null +++ b/tests/neg/i5044b.scala @@ -0,0 +1,8 @@ +class I0 { + class I1 + def i3 = { + type T = i5.I1 + val i4 = new T // error: `i5` is a forward reference extending over the definition of `i4` + val i5 = new I0 + } +} From 91eaf201d97e5e774cea98bb43918e143fd022e3 Mon Sep 17 00:00:00 2001 From: Jasper Moeys Date: Fri, 28 Sep 2018 16:45:03 +0200 Subject: [PATCH 2/2] address review --- tests/neg/i5044.scala | 26 ++++++++++++++++++++++++++ tests/neg/i5044a.scala | 7 ------- tests/neg/i5044b.scala | 8 -------- 3 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 tests/neg/i5044.scala delete mode 100644 tests/neg/i5044a.scala delete mode 100644 tests/neg/i5044b.scala diff --git a/tests/neg/i5044.scala b/tests/neg/i5044.scala new file mode 100644 index 000000000000..efcfdd31db64 --- /dev/null +++ b/tests/neg/i5044.scala @@ -0,0 +1,26 @@ +class I0 { + class I1 + def test0 = { + val x = new y.I1 // error: `y` is a forward reference extending over the definition of `x` + val y = new I0 + } + + def test1 = { + type T = y.I1 + val x = new T // error: `y` is a forward reference extending over the definition of `x` + val y = new I0 + } + + class I2[T1, T2] + def test2 = { + type A[T] = y.I2[T, String] + val x = new A[Int] // error: `y` is a forward reference extending over the definition of `x` + val y = new I0 + } + + def test3 = { + val x = new T // error: `T` is a forward reference extending over the definition of `x` + val y = new I0 + type T = y.I1 + } +} diff --git a/tests/neg/i5044a.scala b/tests/neg/i5044a.scala deleted file mode 100644 index 897c9e5e6d96..000000000000 --- a/tests/neg/i5044a.scala +++ /dev/null @@ -1,7 +0,0 @@ -class I0 { - class I1 - def i3 = { - val i4 = new i5.I1 // error: `i5` is a forward reference extending over the definition of `i4` - val i5 = new I0 - } -} diff --git a/tests/neg/i5044b.scala b/tests/neg/i5044b.scala deleted file mode 100644 index 1e1391b8d0a7..000000000000 --- a/tests/neg/i5044b.scala +++ /dev/null @@ -1,8 +0,0 @@ -class I0 { - class I1 - def i3 = { - type T = i5.I1 - val i4 = new T // error: `i5` is a forward reference extending over the definition of `i4` - val i5 = new I0 - } -}