summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/scalac/symtab/Symbol.java2
-rw-r--r--sources/scalac/typechecker/Analyzer.java21
2 files changed, 15 insertions, 8 deletions
diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java
index 92cc061fc4..dbdb0c2ebf 100644
--- a/sources/scalac/symtab/Symbol.java
+++ b/sources/scalac/symtab/Symbol.java
@@ -851,7 +851,7 @@ public abstract class Symbol implements Modifiers, Kinds {
default:
if (symtype.isSubType(sym1type)) return sym1;
else {
- System.out.println(this + locationString() + " does not override " + sym1 + sym1.locationString() + ", since " + symtype + " !<= " + sym1type);//DEBUG
+ if (Type.debugSwitch) System.out.println(this + locationString() + " does not override " + sym1 + sym1.locationString() + ", since " + symtype + " !<= " + sym1type);//DEBUG
return Symbol.NONE;
}
}
diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java
index a89da81175..38e8eb2b16 100644
--- a/sources/scalac/typechecker/Analyzer.java
+++ b/sources/scalac/typechecker/Analyzer.java
@@ -187,10 +187,10 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
CyclicReference cyc = (CyclicReference) ex;
if (cyc.info instanceof LazyTreeType) {
switch (((LazyTreeType) cyc.info).tree) {
- case ValDef(_, _, _, _):
+ case ValDef(_, _, Tree.Empty, _):
error(pos, "recursive " + cyc.sym + " needs type");
break;
- case DefDef(_, _, _, _, _, _):
+ case DefDef(_, _, _, _, Tree.Empty, _):
error(pos, "recursive function " + cyc.sym.name + " needs result type");
}
}
@@ -472,6 +472,12 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
for (int i = 0; i < parents.length; i++) {
checkNonCyclic(pos, parents[i]);
}
+ break;
+ case SingleType(Type pre, Symbol sym):
+ sym.initialize();
+ if ((sym.flags & LOCKED) != 0) {
+ error(pos, "cyclic aliasing or subtyping involving " + sym);
+ }
}
}
@@ -829,7 +835,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
try {
Symbol sym = tree.symbol();
- if (global.debug) System.out.println("defining " + sym);//debug
+ if (global.debug) global.log("defining " + sym);
Type owntype;
switch (tree) {
case ClassDef(int mods, Name name, Tree.TypeDef[] tparams, Tree.ValDef[][] vparams, Tree tpe, Tree.Template templ):
@@ -896,6 +902,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
} else {
owntype = transform(tpe, TYPEmode).type;
}
+ checkNonCyclic(tree.pos, owntype);
break;
case DefDef(int mods, Name name, Tree.TypeDef[] tparams, Tree.ValDef[][] vparams, Tree tpe, Tree rhs):
@@ -911,6 +918,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
restpe = checkNoEscape(
tpe.pos, transform(tpe, TYPEmode).type);
}
+ checkNonCyclic(tree.pos, restpe);
popContext();
owntype = makeMethodType(tparamSyms, vparamSyms, restpe);
//System.out.println("methtype " + name + ":" + owntype);//DEBUG
@@ -944,7 +952,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
}
sym.setInfo(owntype);
validate(sym);
- if (global.debug) System.out.println("defined " + sym);//debug
+ if (global.debug) global.log("defined " + sym);//debug
} catch (Type.Error ex) {
reportTypeError(tree.pos, ex);
tree.type = Type.ErrorType;
@@ -1258,7 +1266,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
/** Attribute a template
*/
public Tree.Template transformTemplate(Tree.Template templ, Symbol owner) {
- //System.out.println("transforming " + owner);//DEBUG
+ if (global.debug) global.log("transforming " + owner);//debug
//System.out.println(owner.info());//DEBUG
Tree[] parents1 = transformConstrInvocations(
templ.pos, templ.parents, false, Type.AnyType);
@@ -1662,8 +1670,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
public Tree transform(Tree tree) {
Symbol sym = tree.symbol();
if (sym != null && !sym.isInitialized()) sym.initialize();
- if (global.debug && TreeInfo.isDefinition(tree))
- System.out.println("transforming " + sym);
+ if (global.debug && TreeInfo.isDefinition(tree)) global.log("transforming " + sym);
try {
switch (tree) {