diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index 1a048537c510..e5ba2534ec93 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -821,11 +821,9 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) { in.skip(attrLen) case tpnme.DeprecatedATTR => - val arg = Literal(Constant("see corresponding Javadoc for more information.")) - sym.addAnnotation(DeprecatedAttr, arg, Literal(Constant(""))) in.skip(attrLen) if (sym == clazz) - staticModule.addAnnotation(DeprecatedAttr, arg, Literal(Constant(""))) + staticModule.addAnnotation(JavaDeprecatedAttr) case tpnme.ConstantValueATTR => completer.constant = pool.getConstant(u2) diff --git a/src/reflect/scala/reflect/internal/Definitions.scala b/src/reflect/scala/reflect/internal/Definitions.scala index fb617e138fed..78abe9df5c2c 100644 --- a/src/reflect/scala/reflect/internal/Definitions.scala +++ b/src/reflect/scala/reflect/internal/Definitions.scala @@ -1200,6 +1200,7 @@ trait Definitions extends api.StandardDefinitions { lazy val UncheckedBoundsClass = getClassIfDefined("scala.reflect.internal.annotations.uncheckedBounds") lazy val UnspecializedClass = requiredClass[scala.annotation.unspecialized] lazy val VolatileAttr = requiredClass[scala.volatile] + lazy val JavaDeprecatedAttr = requiredClass[java.lang.Deprecated] lazy val FunctionalInterfaceClass = requiredClass[java.lang.FunctionalInterface] // Meta-annotations diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala index 64561615e6bf..da507ebe9fbf 100644 --- a/src/reflect/scala/reflect/internal/Symbols.scala +++ b/src/reflect/scala/reflect/internal/Symbols.scala @@ -904,7 +904,7 @@ trait Symbols extends api.Symbols { self: SymbolTable => def isStrictFP: Boolean = !isDeferred && (hasAnnotation(ScalaStrictFPAttr) || originalOwner.isStrictFP) def isSerializable = info.baseClasses.exists(p => p == SerializableClass || p == JavaSerializableClass) def hasBridgeAnnotation = hasAnnotation(BridgeClass) - def isDeprecated = hasAnnotation(DeprecatedAttr) + def isDeprecated = hasAnnotation(DeprecatedAttr) || (isJava && hasAnnotation(JavaDeprecatedAttr)) def deprecationMessage = getAnnotation(DeprecatedAttr) flatMap (_ stringArg 0) def deprecationVersion = getAnnotation(DeprecatedAttr) flatMap (_ stringArg 1) def deprecatedParamName = getAnnotation(DeprecatedNameAttr) flatMap (_ symbolArg 0 orElse Some(nme.NO_NAME)) diff --git a/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala b/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala index 0faf34f3a69d..3b62c69c8a40 100644 --- a/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala +++ b/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala @@ -428,6 +428,7 @@ trait JavaUniverseForce { self: runtime.JavaUniverse => definitions.UncheckedBoundsClass definitions.UnspecializedClass definitions.VolatileAttr + definitions.JavaDeprecatedAttr definitions.FunctionalInterfaceClass definitions.BeanGetterTargetClass definitions.BeanSetterTargetClass diff --git a/test/files/jvm/deprecation.check b/test/files/jvm/deprecation.check index d57b6b55a592..a135a2ef4bcb 100644 --- a/test/files/jvm/deprecation.check +++ b/test/files/jvm/deprecation.check @@ -1,3 +1,2 @@ -warning: there were four deprecation warnings; re-run with -deprecation for details Note: deprecation/Use_2.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. diff --git a/test/files/neg/t10752.check b/test/files/neg/t10752.check index 187909e62455..11c60bed1aff 100644 --- a/test/files/neg/t10752.check +++ b/test/files/neg/t10752.check @@ -1,7 +1,7 @@ -Test_2.scala:2: warning: class DeprecatedClass in package p1 is deprecated: see corresponding Javadoc for more information. +Test_2.scala:2: warning: class DeprecatedClass in package p1 is deprecated def useC = p1.DeprecatedClass.foo ^ -Test_2.scala:3: warning: method foo in class DeprecatedMethod is deprecated: see corresponding Javadoc for more information. +Test_2.scala:3: warning: method foo in class DeprecatedMethod is deprecated def useM = p1.DeprecatedMethod.foo ^ error: No warnings can be incurred under -Xfatal-warnings. diff --git a/test/files/neg/t9617.check b/test/files/neg/t9617.check new file mode 100644 index 000000000000..8db611817e18 --- /dev/null +++ b/test/files/neg/t9617.check @@ -0,0 +1,9 @@ +Test.scala:3: warning: class DeprecatedClass in package p1 is deprecated + def useC = p1.DeprecatedClass.foo + ^ +Test.scala:4: warning: method foo in class DeprecatedMethod is deprecated + def useM = p1.DeprecatedMethod.foo + ^ +error: No warnings can be incurred under -Xfatal-warnings. +two warnings found +one error found diff --git a/test/files/neg/t9617/DeprecatedClass.java b/test/files/neg/t9617/DeprecatedClass.java new file mode 100644 index 000000000000..451fa8b6ebc1 --- /dev/null +++ b/test/files/neg/t9617/DeprecatedClass.java @@ -0,0 +1,6 @@ +package p1; + +@Deprecated +public class DeprecatedClass { + public static void foo() {} +} diff --git a/test/files/neg/t9617/DeprecatedMethod.java b/test/files/neg/t9617/DeprecatedMethod.java new file mode 100644 index 000000000000..49dd1fd6b806 --- /dev/null +++ b/test/files/neg/t9617/DeprecatedMethod.java @@ -0,0 +1,6 @@ +package p1; + +public class DeprecatedMethod { + @Deprecated + public static void foo() {} +} diff --git a/test/files/neg/t9617/Test.flags b/test/files/neg/t9617/Test.flags new file mode 100644 index 000000000000..7de3c0f3eea0 --- /dev/null +++ b/test/files/neg/t9617/Test.flags @@ -0,0 +1 @@ +-Xfatal-warnings -deprecation diff --git a/test/files/neg/t9617/Test.scala b/test/files/neg/t9617/Test.scala new file mode 100644 index 000000000000..6883855c43ad --- /dev/null +++ b/test/files/neg/t9617/Test.scala @@ -0,0 +1,5 @@ +// Joint-compilation copy of test/files/neg/t10752/Test_2.scala +object Test { + def useC = p1.DeprecatedClass.foo + def useM = p1.DeprecatedMethod.foo +}