diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/parser/Parsers.scala | 10 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala | 3 | ||||
-rw-r--r-- | test/files/pos/bug430-feb09.scala | 34 |
3 files changed, 42 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala index e4a042325c..12af98f91d 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala @@ -892,7 +892,7 @@ trait Parsers extends NewScanners with MarkupParsers { if (inToken == ARROW) atPos(inSkipToken) { AppliedTypeTree( - scalaDot(nme.BYNAME_PARAM_CLASS_NAME.toTypeName), List(typ())) + rootScalaDot(nme.BYNAME_PARAM_CLASS_NAME.toTypeName), List(typ())) } else { val t = typ() @@ -900,7 +900,7 @@ trait Parsers extends NewScanners with MarkupParsers { inNextToken atPos(t.pos) { AppliedTypeTree( - scalaDot(nme.REPEATED_PARAM_CLASS_NAME.toTypeName), List(t)) + rootScalaDot(nme.REPEATED_PARAM_CLASS_NAME.toTypeName), List(t)) } } else t } @@ -1762,7 +1762,7 @@ trait Parsers extends NewScanners with MarkupParsers { if (inToken == ARROW) atPos(inSkipToken) { AppliedTypeTree( - scalaDot(nme.BYNAME_PARAM_CLASS_NAME.toTypeName), List(typ())) + rootScalaDot(nme.BYNAME_PARAM_CLASS_NAME.toTypeName), List(typ())) } else { val t = typ() @@ -1770,7 +1770,7 @@ trait Parsers extends NewScanners with MarkupParsers { inNextToken atPos(t.pos) { AppliedTypeTree( - scalaDot(nme.REPEATED_PARAM_CLASS_NAME.toTypeName), List(t)) + rootScalaDot(nme.REPEATED_PARAM_CLASS_NAME.toTypeName), List(t)) } } else t } @@ -1832,7 +1832,7 @@ trait Parsers extends NewScanners with MarkupParsers { def bound(tok: Int, default: Name): Tree = if (inToken == tok) { inNextToken; typ() } - else scalaDot(default.toTypeName) + else rootScalaDot(default.toTypeName) /* -------- DEFS ------------------------------------------- */ diff --git a/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala b/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala index c52e514119..8e8875121c 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala @@ -18,6 +18,9 @@ abstract class TreeBuilder { def freshName(pos : Position, prefix: String): Name def freshName(pos : Position): Name = freshName(pos, "x$") + def rootId(name: Name) = Select(Ident(nme.ROOTPKG), name) + def rootScalaDot(name: Name): Tree = Select(rootId(nme.scala_) setSymbol definitions.ScalaPackage, name) + def scalaDot(name: Name): Tree = Select(Ident(nme.scala_) setSymbol definitions.ScalaPackage, name) def scalaAnyRefConstr: Tree = diff --git a/test/files/pos/bug430-feb09.scala b/test/files/pos/bug430-feb09.scala new file mode 100644 index 0000000000..2daf0b305a --- /dev/null +++ b/test/files/pos/bug430-feb09.scala @@ -0,0 +1,34 @@ +// Compiles +package a { + case class A[T]() +} + +// Compiles +package b.scala { + class B[T] +} + +// Doesn't compile: type Nothing is not a member of c.scala +package c.scala { + case class C[T]() +} + +// Doesn't compile: type Nothing is not a member of d.scala +package d.scala.d { + case class D[T]() +} + +// Doesn't compile: type Any is not a member of e.scala +package e.scala { + case class E[T >: Nothing]() +} + +// Compiles +package f.scala { + case class F[T >: Nothing <: Any]() +} + +// Doesn't compile: type <byname> is not a member of package h.scala +package h.scala { + case class H(s: String)(t: =>String) +}
\ No newline at end of file |