summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala1
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala13
-rw-r--r--test/files/neg/bug798.check4
-rw-r--r--test/files/neg/bug798.scala9
-rw-r--r--test/files/neg/bug800.check13
-rw-r--r--test/files/neg/bug800.scala17
6 files changed, 53 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
index c527bb981b..29af968d2a 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
@@ -335,6 +335,7 @@ trait Namers requires Analyzer {
if (settings.debug.value) log("defining " + sym);
val tp = typeSig(tree)
sym.setInfo(tp)
+ if (sym.isType) typer.checkNonCyclic(sym)
if (settings.debug.value) log("defined " + sym);
validate(sym)
}
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 1b1b1823a3..ff4c5f75d4 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -845,6 +845,8 @@ trait Typers requires Analyzer {
val value = vdef.symbol
val getter = if (mods hasFlag DEFERRED) value else value.getter(value.owner)
assert(getter != NoSymbol, stat)
+ if (getter hasFlag OVERLOADED)
+ error(getter.pos, ""+getter+" is defined twice")
val getterDef: DefDef = {
val result = DefDef(getter, vparamss =>
if (mods hasFlag DEFERRED) EmptyTree
@@ -855,11 +857,14 @@ trait Typers requires Analyzer {
result
}
def setterDef: DefDef = {
+ val setr = getter.setter(value.owner)
val result = atPos(vdef.pos)(
- DefDef(getter.setter(value.owner), vparamss =>
- if (mods hasFlag DEFERRED) EmptyTree
- else typed(Assign(Select(This(value.owner), value),
- Ident(vparamss.head.head)))))
+ DefDef(setr, vparamss =>
+ if ((mods hasFlag DEFERRED) || (setr hasFlag OVERLOADED))
+ EmptyTree
+ else
+ typed(Assign(Select(This(value.owner), value),
+ Ident(vparamss.head.head)))))
result.mods setAttr vdef.mods.attributes
result
}
diff --git a/test/files/neg/bug798.check b/test/files/neg/bug798.check
new file mode 100644
index 0000000000..6fd80bcba5
--- /dev/null
+++ b/test/files/neg/bug798.check
@@ -0,0 +1,4 @@
+bug798.scala:5 error: cyclic aliasing or subtyping involving type Bracks
+ type Bracks <: Bracks
+ ^
+one error found
diff --git a/test/files/neg/bug798.scala b/test/files/neg/bug798.scala
new file mode 100644
index 0000000000..9d95ae2ddb
--- /dev/null
+++ b/test/files/neg/bug798.scala
@@ -0,0 +1,9 @@
+package test;
+trait Test {
+ def f(list : Any) = null;
+ class C[T]
+ type Bracks <: Bracks
+ val bracks : Bracks;
+ val singletons = f(bracks);
+
+}
diff --git a/test/files/neg/bug800.check b/test/files/neg/bug800.check
new file mode 100644
index 0000000000..eae84677c9
--- /dev/null
+++ b/test/files/neg/bug800.check
@@ -0,0 +1,13 @@
+bug800.scala:4 error: qualification is already defined as value qualification
+ val qualification = false;
+ ^
+bug800.scala:8 error: method qualification is defined twice
+ val qualification = false;
+ ^
+bug800.scala:12 error: value qualification is defined twice
+ var qualification = false;
+ ^
+bug800.scala:16 error: method qualification is defined twice
+ var qualification = false;
+ ^
+four errors found
diff --git a/test/files/neg/bug800.scala b/test/files/neg/bug800.scala
new file mode 100644
index 0000000000..388574d42d
--- /dev/null
+++ b/test/files/neg/bug800.scala
@@ -0,0 +1,17 @@
+package test;
+trait Test1 {
+ val qualification : String;
+ val qualification = false;
+}
+trait Test2 {
+ var qualification : String;
+ val qualification = false;
+}
+trait Test3 {
+ val qualification : String;
+ var qualification = false;
+}
+trait Test4 {
+ var qualification : String;
+ var qualification = false;
+}