提交 a78a4f00 编写于 作者: V vromero

6356530: -Xlint:serial does not flag abstract classes with concrete methods/members

Reviewed-by: mcimadamore
上级 85c00ade
/*
* Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -316,6 +316,7 @@ public class Scope {
public Entry lookup(Name name) {
return lookup(name, noFilter);
}
public Entry lookup(Name name, Filter<Symbol> sf) {
Entry e = table[getIndex(name)];
if (e == null || e == sentinel)
......@@ -361,6 +362,10 @@ public class Scope {
}
}
public boolean anyMatch(Filter<Symbol> sf) {
return getElements(sf).iterator().hasNext();
}
public Iterable<Symbol> getElements() {
return getElements(noFilter);
}
......
......@@ -4301,7 +4301,7 @@ public class Attr extends JCTree.Visitor {
if (env.info.lint.isEnabled(LintCategory.SERIAL) &&
isSerializable(c) &&
(c.flags() & Flags.ENUM) == 0 &&
(c.flags() & ABSTRACT) == 0) {
checkForSerial(c)) {
checkSerialVersionUID(tree, c);
}
if (allowTypeAnnos) {
......@@ -4313,6 +4313,22 @@ public class Attr extends JCTree.Visitor {
}
}
// where
boolean checkForSerial(ClassSymbol c) {
if ((c.flags() & ABSTRACT) == 0) {
return true;
} else {
return c.members().anyMatch(anyNonAbstractOrDefaultMethod);
}
}
public static final Filter<Symbol> anyNonAbstractOrDefaultMethod = new Filter<Symbol>() {
@Override
public boolean accepts(Symbol s) {
return s.kind == Kinds.MTH &&
(s.flags() & (DEFAULT | ABSTRACT)) != ABSTRACT;
}
};
/** get a diagnostic position for an attribute of Type t, or null if attribute missing */
private DiagnosticPosition getDiagnosticPosition(JCClassDecl tree, Type t) {
for(List<JCAnnotation> al = tree.mods.annotations; !al.isEmpty(); al = al.tail) {
......
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 6356530
* @summary -Xlint:serial does not flag abstract classes with concrete methods/members
* @compile/fail/ref=SerializableAbstractClassWithNonAbstractMethodsTest.out -XDrawDiagnostics -Werror -Xlint:serial SerializableAbstractClassWithNonAbstractMethodsTest.java
*/
abstract class SerializableAbstractClassWithNonAbstractMethodsTest implements java.io.Serializable {
void m1() {}
abstract void m2();
abstract class AWithUID implements java.io.Serializable {
private static final long serialVersionUID = 0;
void m(){}
}
interface IDefault extends java.io.Serializable {
default int m() { return 1; }
}
interface IDefaultAndUID extends java.io.Serializable {
static final long serialVersionUID = 0;
default int m() { return 1; }
}
}
SerializableAbstractClassWithNonAbstractMethodsTest.java:40:5: compiler.warn.missing.SVUID: SerializableAbstractClassWithNonAbstractMethodsTest.IDefault
SerializableAbstractClassWithNonAbstractMethodsTest.java:31:10: compiler.warn.missing.SVUID: SerializableAbstractClassWithNonAbstractMethodsTest
- compiler.err.warnings.and.werror
1 error
2 warnings
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册