summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/RefChecks.scala36
-rw-r--r--test/files/neg/bug935.check5
-rw-r--r--test/files/neg/bug935.scala6
3 files changed, 31 insertions, 16 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index 600f4f7953..4c2ae0c53e 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -818,8 +818,8 @@ abstract class RefChecks extends InfoTransform {
if (!tp.isHigherKinded)
checkBoundsWithPos(pre, sym.owner, sym.typeParams, args, pos)
}
- def checkAnnotations(annots: List[Annotation]) {
- for ((tp @ TypeRef(_,_,_), pos) <- annots.map(a => (a.tpe, a.pos)))
+ def checkAnnotations(tpes: List[(Type, Position)]) {
+ for ((tp @ TypeRef(_,_,_), pos) <- tpes)
checkTypeRef(tp, pos)
}
@@ -828,11 +828,23 @@ abstract class RefChecks extends InfoTransform {
val sym = tree.symbol
var result = tree
+ def doTypeTraversal(f: (Type) => Unit) =
+ if (!inPattern) {
+ new TypeTraverser {
+ def traverse(tp: Type) { f(tp) }
+ } traverse tree.tpe
+ }
+
// if this tree can carry modifiers, make sure any annotations also conform to type bounds; bug #935
tree match {
- case x: MemberDef => checkAnnotations(x.mods.annotations)
- case _ =>
+ case x: MemberDef => checkAnnotations(x.mods.annotations.map(a => (a.tpe, a.pos)))
+ case TypeTree() => doTypeTraversal {
+ case AnnotatedType(attribs, _, _) => checkAnnotations(attribs.map(a => (a.atp, tree.pos)))
+ case _ =>
+ }
+ case _ =>
}
+
tree match {
case DefDef(mods, name, tparams, vparams, tpt, EmptyTree) if tree.symbol.hasAttribute(definitions.NativeAttr) =>
tree.symbol.resetFlag(DEFERRED)
@@ -850,17 +862,11 @@ abstract class RefChecks extends InfoTransform {
validateBaseTypes(currentOwner)
checkAllOverrides(currentOwner)
- case TypeTree() =>
- if (!inPattern) {
- new TypeTraverser {
- def traverse(tp: Type) {
- tp match {
- case t: TypeRef => checkTypeRef(t, tree.pos)
- case _ =>
- }
- }
- } traverse tree.tpe
- }
+ case TypeTree() => doTypeTraversal {
+ case t: TypeRef => checkTypeRef(t, tree.pos)
+ case _ =>
+ }
+
case TypeApply(fn, args) =>
checkBounds(NoPrefix, NoSymbol, fn.tpe.typeParams, args map (_.tpe))
if (isCaseApply(sym)) result = toConstructor(tree.pos, tree.tpe)
diff --git a/test/files/neg/bug935.check b/test/files/neg/bug935.check
index e2c2b87be8..505b82ea15 100644
--- a/test/files/neg/bug935.check
+++ b/test/files/neg/bug935.check
@@ -1,4 +1,7 @@
bug935.scala:5: error: type arguments [Test3.B] do not conform to class E's type parameter bounds [T <: String]
@E[B](new B) val b = "hi"
^
-one error found
+bug935.scala:11: error: type arguments [Test4.B] do not conform to class E's type parameter bounds [T <: String]
+ val b: String @E[B](new B) = "hi"
+ ^
+two errors found
diff --git a/test/files/neg/bug935.scala b/test/files/neg/bug935.scala
index 4497e0812e..20654a3f56 100644
--- a/test/files/neg/bug935.scala
+++ b/test/files/neg/bug935.scala
@@ -3,4 +3,10 @@ object Test3 {
class B
// val a = new E[B](new B)
@E[B](new B) val b = "hi"
+}
+
+object Test4 {
+ class E[T <: String](s: T) extends Annotation
+ class B
+ val b: String @E[B](new B) = "hi"
} \ No newline at end of file