summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-08-06 14:24:59 +0000
committerPaul Phillips <paulp@improving.org>2011-08-06 14:24:59 +0000
commitead69ed24557ff42966a2bd5f71b6434ac5343b6 (patch)
treea908dcd39aa2707c1a745cd84031e2366c170633
parent4f4a80ad5b85ce3922c80bbc9524f2540918187e (diff)
downloadscala-ead69ed24557ff42966a2bd5f71b6434ac5343b6.tar.gz
scala-ead69ed24557ff42966a2bd5f71b6434ac5343b6.tar.bz2
scala-ead69ed24557ff42966a2bd5f71b6434ac5343b6.zip
Disallowed implicit modifier on auxiliary const...
Disallowed implicit modifier on auxiliary constructors, since it either silently accomplishes nothing or crashes the compiler. If it should do something useful let me know. Closes SI-4882, review by odersky.
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala9
-rw-r--r--test/files/neg/bug4882.check4
-rw-r--r--test/files/neg/bug4882.scala3
3 files changed, 14 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
index 7a42d6e519..2ebfdc7426 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
@@ -1343,6 +1343,13 @@ trait Namers { self: Analyzer =>
" for: " + sym);
}
+ if (sym.isConstructor) {
+ if (sym.hasFlag(OVERRIDE | ABSOVERRIDE))
+ context.error(sym.pos, "`override' modifier not allowed for constructors")
+ if (sym.isImplicit)
+ context.error(sym.pos, "`implicit' modifier not allowed for constructors")
+ }
+
if (sym.hasFlag(IMPLICIT) && !sym.isTerm)
context.error(sym.pos, "`implicit' modifier can be used only for values, variables and methods")
if (sym.hasFlag(IMPLICIT) && sym.owner.isPackageClass)
@@ -1354,8 +1361,6 @@ trait Namers { self: Analyzer =>
"\nit should be omitted for abstract members")
if (sym.hasFlag(OVERRIDE | ABSOVERRIDE) && !sym.hasFlag(TRAIT) && sym.isClass)
context.error(sym.pos, "`override' modifier not allowed for classes")
- if (sym.hasFlag(OVERRIDE | ABSOVERRIDE) && sym.isConstructor)
- context.error(sym.pos, "`override' modifier not allowed for constructors")
if (sym.hasFlag(ABSOVERRIDE) && !sym.owner.isTrait)
context.error(sym.pos, "`abstract override' modifier only allowed for members of traits")
if (sym.isLazy && sym.hasFlag(PRESUPER))
diff --git a/test/files/neg/bug4882.check b/test/files/neg/bug4882.check
new file mode 100644
index 0000000000..2987cabe7f
--- /dev/null
+++ b/test/files/neg/bug4882.check
@@ -0,0 +1,4 @@
+bug4882.scala:2: error: `implicit' modifier not allowed for constructors
+ implicit def this(a: String) = this(a.toInt)
+ ^
+one error found
diff --git a/test/files/neg/bug4882.scala b/test/files/neg/bug4882.scala
new file mode 100644
index 0000000000..4e58ef7879
--- /dev/null
+++ b/test/files/neg/bug4882.scala
@@ -0,0 +1,3 @@
+class Foo(value: Int) {
+ implicit def this(a: String) = this(a.toInt)
+}