diff options
author | Adriaan Moors <adriaan.moors@epfl.ch> | 2009-08-06 15:36:00 +0000 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@epfl.ch> | 2009-08-06 15:36:00 +0000 |
commit | 381209889a348349f97e414485d5fcf3c8e8931d (patch) | |
tree | a38463726d5e9d54dd222b081dc050e04d25484c /src | |
parent | f22d1313c2527dd87b342e3461b577e51a2f1576 (diff) | |
download | scala-381209889a348349f97e414485d5fcf3c8e8931d.tar.gz scala-381209889a348349f97e414485d5fcf3c8e8931d.tar.bz2 scala-381209889a348349f97e414485d5fcf3c8e8931d.zip |
fixed #2208
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Types.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 8 |
2 files changed, 8 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index 5375f77569..28ca47e6a3 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -1511,6 +1511,8 @@ A type's typeSymbol should never be inspected directly. PolyType(typeParams, typeRef(pre, sym.initialize, higherKindedArgs)) } 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 8056c2794e..f4f73cc1b3 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -3857,11 +3857,15 @@ 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: during uncurry, all types are normalized (after refchecks and before genicode) + result // must not normalize before refchecks, and thus must not do `result setType(restpe)` + // the original type must be ref-checked first, so that bounds of type args of type aliases are checked (see #2208) } def typedTypeConstructor(tree: Tree): Tree = typedTypeConstructor(tree, NOmode) |