summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@epfl.ch>2009-10-01 15:04:29 +0000
committerAdriaan Moors <adriaan.moors@epfl.ch>2009-10-01 15:04:29 +0000
commita21a60e5b061af05eb6a6bf574052f130d369d4b (patch)
tree01547870b60ee2d7038712b14abf673c48c41a70 /src
parentfe264943efccc2534a65ce0b49ed16a51e597aed (diff)
downloadscala-a21a60e5b061af05eb6a6bf574052f130d369d4b.tar.gz
scala-a21a60e5b061af05eb6a6bf574052f130d369d4b.tar.bz2
scala-a21a60e5b061af05eb6a6bf574052f130d369d4b.zip
fixed #2208
don't expand type aliases that take type arguments in typedTypeConstructor, as that bypasses refchecks have to expand type alias without type arguments, as AnyRef must disappear (problem with cycles during bootstrap)
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Types.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala19
2 files changed, 19 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala
index 0ebd2018fb..e115446147 100644
--- a/src/compiler/scala/tools/nsc/symtab/Types.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Types.scala
@@ -1559,6 +1559,8 @@ A type's typeSymbol should never be inspected directly.
PolyType(typeParams, typeRef(pre, sym.initialize, dummyArgs))
} else if (sym.isRefinementClass) {
sym.info.normalize // @MO to AM: OK?
+ //@M I think this is okay, but changeset 12414 (which fixed #1241) re-introduced another bug (#2208)
+ // see typedTypeConstructor in Typers
} else {
super.normalize
}
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index a552c2ef7c..c3fa5555c4 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -3875,11 +3875,26 @@ trait Typers { self: Analyzer =>
/** Types a type constructor tree used in a new or supertype */
def typedTypeConstructor(tree: Tree, mode: Int): Tree = {
val result = typed(tree, typeMode(mode) | FUNmode, WildcardType)
- val restpe = result.tpe.normalize
+
+ val restpe = result.tpe.normalize // normalize to get rid of type aliases for the following check (#1241)
if (!phase.erasedTypes && restpe.isInstanceOf[TypeRef] && !restpe.prefix.isStable) {
error(tree.pos, restpe.prefix+" is not a legal prefix for a constructor")
}
- result setType restpe // @M: normalization is done during erasure
+
+ //@M fix for #2208
+ // if there are no type arguments, normalization does not bypass any checks, so perform it to get rid of AnyRef
+ if(result.tpe.typeArgs.isEmpty) {
+ // minimal check: if(result.tpe.typeSymbolDirect eq AnyRefClass) {
+ // must expand the fake AnyRef type alias, because bootstrapping (init in Definitions) is not
+ // designed to deal with the cycles in the scala package (ScalaObject extends
+ // AnyRef, but the AnyRef type alias is entered after the scala package is
+ // loaded and completed, so that ScalaObject is unpickled while AnyRef is not
+ // yet defined )
+ result setType(restpe)
+ } else { // must not normalize: type application must be (bounds-)checked (during RefChecks), see #2208
+ // during uncurry (after refchecks), all types are normalized
+ result
+ }
}
def typedTypeConstructor(tree: Tree): Tree = typedTypeConstructor(tree, NOmode)