diff options
author | Paul Phillips <paulp@improving.org> | 2011-01-20 18:19:28 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-01-20 18:19:28 +0000 |
commit | a8a7481ab79430bef3ca9524538fa5217e0e14d8 (patch) | |
tree | c2c3dd346052b91c1186d773b073e4c4af96525f | |
parent | 919d4e1f3163496d725f7731d2ccd30d47ecee82 (diff) | |
download | scala-a8a7481ab79430bef3ca9524538fa5217e0e14d8.tar.gz scala-a8a7481ab79430bef3ca9524538fa5217e0e14d8.tar.bz2 scala-a8a7481ab79430bef3ca9524538fa5217e0e14d8.zip |
Look even harder for attempts to sneak "this" i...
Look even harder for attempts to sneak "this" into superconstructor
arguments, and improve positioning. Closes #4166, no review.
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 11 | ||||
-rw-r--r-- | test/files/neg/bug3913.check | 2 | ||||
-rw-r--r-- | test/files/neg/bug4166.check | 4 | ||||
-rw-r--r-- | test/files/neg/bug4166.scala | 11 | ||||
-rw-r--r-- | test/files/neg/bug473.check | 2 |
5 files changed, 26 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 3b9a845126..b5986f704a 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -1543,8 +1543,15 @@ trait Typers extends Modes { // because of initialization issues; bug #473 for (arg <- superArgs ; tree <- arg) { val sym = tree.symbol - if (sym != null && sym.isModule && (sym.info.baseClasses contains clazz)) - error(rhs.pos, "super constructor cannot be passed a self reference unless parameter is declared by-name") + if (sym != null && (sym.info.baseClasses contains clazz)) { + if (sym.isModule) + error(tree.pos, "super constructor cannot be passed a self reference unless parameter is declared by-name") + tree match { + case This(qual) => + error(tree.pos, "super constructor arguments cannot reference unconstructed `this`") + case _ => () + } + } } if (superConstr.symbol.isPrimaryConstructor) { diff --git a/test/files/neg/bug3913.check b/test/files/neg/bug3913.check index 0ab8708bc8..e6df31fb23 100644 --- a/test/files/neg/bug3913.check +++ b/test/files/neg/bug3913.check @@ -1,4 +1,4 @@ bug3913.scala:2: error: super constructor cannot be passed a self reference unless parameter is declared by-name object LimboStage extends Stage( Set( LimboStage )) - ^ + ^ one error found diff --git a/test/files/neg/bug4166.check b/test/files/neg/bug4166.check new file mode 100644 index 0000000000..938dad1488 --- /dev/null +++ b/test/files/neg/bug4166.check @@ -0,0 +1,4 @@ +bug4166.scala:3: error: super constructor arguments cannot reference unconstructed `this` +class Demo extends Base(new { Demo.this }) { + ^ +one error found diff --git a/test/files/neg/bug4166.scala b/test/files/neg/bug4166.scala new file mode 100644 index 0000000000..c20796c43c --- /dev/null +++ b/test/files/neg/bug4166.scala @@ -0,0 +1,11 @@ +class Base(a: Any) + +class Demo extends Base(new { Demo.this }) { + val x: Any = () +} + + +class Demo2 extends Base(new { this }) { + val x: Any = () +} + diff --git a/test/files/neg/bug473.check b/test/files/neg/bug473.check index 7d21dfb210..7e3c4a4ed5 100644 --- a/test/files/neg/bug473.check +++ b/test/files/neg/bug473.check @@ -1,4 +1,4 @@ bug473.scala:3: error: super constructor cannot be passed a self reference unless parameter is declared by-name case object Voop extends Foo(Voop) - ^ + ^ one error found |