# HG changeset patch # User mcimadamore # Date 1366031489 -3600 # Node ID b26f36a7ae3b4b248d0e044960c9d5787326b39c # Parent f10cffab99b4d26ebd15e9693c49aea262d09d89 8011383: Symbol.getModifiers omits ACC_ABSTRACT from interface with default methods Summary: Fixup for default method modifiers erroneously applies to class-level modifiers Reviewed-by: jjg diff -r f10cffab99b4 -r b26f36a7ae3b src/share/classes/com/sun/tools/javac/code/Symbol.java --- a/src/share/classes/com/sun/tools/javac/code/Symbol.java Sat Apr 13 18:48:29 2013 -0700 +++ b/src/share/classes/com/sun/tools/javac/code/Symbol.java Mon Apr 15 14:11:29 2013 +0100 @@ -454,8 +454,7 @@ } public Set getModifiers() { - long flags = flags(); - return Flags.asModifierSet((flags & DEFAULT) != 0 ? flags & ~ABSTRACT : flags); + return Flags.asModifierSet(flags()); } public Name getSimpleName() { @@ -1128,6 +1127,12 @@ return m; } + @Override + public Set getModifiers() { + long flags = flags(); + return Flags.asModifierSet((flags & DEFAULT) != 0 ? flags & ~ABSTRACT : flags); + } + /** The Java source which this symbol represents. */ public String toString() { diff -r f10cffab99b4 -r b26f36a7ae3b test/tools/javac/defaultMethods/DefaultMethodFlags.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/defaultMethods/DefaultMethodFlags.java Mon Apr 15 14:11:29 2013 +0100 @@ -0,0 +1,111 @@ +/* + * 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 8011383 + * @summary Symbol.getModifiers omits ACC_ABSTRACT from interface with default methods + */ + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; + +import javax.lang.model.element.*; +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; +import javax.tools.ToolProvider; + +import com.sun.source.util.JavacTask; +import com.sun.source.util.TaskEvent; +import com.sun.source.util.TaskListener; +import com.sun.tools.javac.util.Assert; + +public class DefaultMethodFlags { + + public static void main(String[] args) throws IOException { + new DefaultMethodFlags().run(args); + } + + void run(String[] args) throws IOException { + checkDefaultMethodFlags(); + } + + void checkDefaultMethodFlags() throws IOException { + JavaCompiler c = ToolProvider.getSystemJavaCompiler(); + StandardJavaFileManager fm = c.getStandardFileManager(null, null, null); + Iterable fos = + fm.getJavaFileObjectsFromFiles( + Arrays.asList(new File( + System.getProperty("test.src"), + this.getClass().getSimpleName() + ".java"))); + JavacTask task = (JavacTask) c.getTask(null, fm, null, null, null, fos); + + task.addTaskListener(new TaskListener() { + + @Override + public void started(TaskEvent e) {} + + @Override + public void finished(TaskEvent e) { + if (e.getKind() == TaskEvent.Kind.ANALYZE) { + TypeElement te = e.getTypeElement(); + if (te.getSimpleName().toString().equals("I")) { + checkDefaultInterface(te); + } + } + } + }); + + task.analyze(); + } + + void checkDefaultInterface(TypeElement te) { + System.err.println("Checking " + te.getSimpleName()); + Assert.check(te.getModifiers().contains(Modifier.ABSTRACT)); + for (Element e : te.getEnclosedElements()) { + if (e.getSimpleName().toString().matches("(\\w)_(default|static|abstract)")) { + boolean abstractExpected = false; + String methodKind = e.getSimpleName().toString().substring(2); + switch (methodKind) { + case "default": + case "static": + break; + case "abstract": + abstractExpected = true; + break; + default: + Assert.error("Cannot get here!" + methodKind); + } + Assert.check(e.getModifiers().contains(Modifier.ABSTRACT) == abstractExpected); + } + } + } +} + +interface I { + default void m_default() { } + static void m_static() { } + void m_abstract(); +}