Mon, 15 Apr 2013 14:11:29 +0100
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
1.1 --- a/src/share/classes/com/sun/tools/javac/code/Symbol.java Sat Apr 13 18:48:29 2013 -0700 1.2 +++ b/src/share/classes/com/sun/tools/javac/code/Symbol.java Mon Apr 15 14:11:29 2013 +0100 1.3 @@ -454,8 +454,7 @@ 1.4 } 1.5 1.6 public Set<Modifier> getModifiers() { 1.7 - long flags = flags(); 1.8 - return Flags.asModifierSet((flags & DEFAULT) != 0 ? flags & ~ABSTRACT : flags); 1.9 + return Flags.asModifierSet(flags()); 1.10 } 1.11 1.12 public Name getSimpleName() { 1.13 @@ -1128,6 +1127,12 @@ 1.14 return m; 1.15 } 1.16 1.17 + @Override 1.18 + public Set<Modifier> getModifiers() { 1.19 + long flags = flags(); 1.20 + return Flags.asModifierSet((flags & DEFAULT) != 0 ? flags & ~ABSTRACT : flags); 1.21 + } 1.22 + 1.23 /** The Java source which this symbol represents. 1.24 */ 1.25 public String toString() {
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/test/tools/javac/defaultMethods/DefaultMethodFlags.java Mon Apr 15 14:11:29 2013 +0100 2.3 @@ -0,0 +1,111 @@ 2.4 +/* 2.5 + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. 2.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 2.7 + * 2.8 + * This code is free software; you can redistribute it and/or modify it 2.9 + * under the terms of the GNU General Public License version 2 only, as 2.10 + * published by the Free Software Foundation. 2.11 + * 2.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 2.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 2.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 2.15 + * version 2 for more details (a copy is included in the LICENSE file that 2.16 + * accompanied this code). 2.17 + * 2.18 + * You should have received a copy of the GNU General Public License version 2.19 + * 2 along with this work; if not, write to the Free Software Foundation, 2.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2.21 + * 2.22 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2.23 + * or visit www.oracle.com if you need additional information or have any 2.24 + * questions. 2.25 + */ 2.26 + 2.27 +/* 2.28 + * @test 2.29 + * @bug 8011383 2.30 + * @summary Symbol.getModifiers omits ACC_ABSTRACT from interface with default methods 2.31 + */ 2.32 + 2.33 +import java.io.File; 2.34 +import java.io.IOException; 2.35 +import java.util.Arrays; 2.36 + 2.37 +import javax.lang.model.element.*; 2.38 +import javax.tools.JavaCompiler; 2.39 +import javax.tools.JavaFileObject; 2.40 +import javax.tools.StandardJavaFileManager; 2.41 +import javax.tools.ToolProvider; 2.42 + 2.43 +import com.sun.source.util.JavacTask; 2.44 +import com.sun.source.util.TaskEvent; 2.45 +import com.sun.source.util.TaskListener; 2.46 +import com.sun.tools.javac.util.Assert; 2.47 + 2.48 +public class DefaultMethodFlags { 2.49 + 2.50 + public static void main(String[] args) throws IOException { 2.51 + new DefaultMethodFlags().run(args); 2.52 + } 2.53 + 2.54 + void run(String[] args) throws IOException { 2.55 + checkDefaultMethodFlags(); 2.56 + } 2.57 + 2.58 + void checkDefaultMethodFlags() throws IOException { 2.59 + JavaCompiler c = ToolProvider.getSystemJavaCompiler(); 2.60 + StandardJavaFileManager fm = c.getStandardFileManager(null, null, null); 2.61 + Iterable<? extends JavaFileObject> fos = 2.62 + fm.getJavaFileObjectsFromFiles( 2.63 + Arrays.asList(new File( 2.64 + System.getProperty("test.src"), 2.65 + this.getClass().getSimpleName() + ".java"))); 2.66 + JavacTask task = (JavacTask) c.getTask(null, fm, null, null, null, fos); 2.67 + 2.68 + task.addTaskListener(new TaskListener() { 2.69 + 2.70 + @Override 2.71 + public void started(TaskEvent e) {} 2.72 + 2.73 + @Override 2.74 + public void finished(TaskEvent e) { 2.75 + if (e.getKind() == TaskEvent.Kind.ANALYZE) { 2.76 + TypeElement te = e.getTypeElement(); 2.77 + if (te.getSimpleName().toString().equals("I")) { 2.78 + checkDefaultInterface(te); 2.79 + } 2.80 + } 2.81 + } 2.82 + }); 2.83 + 2.84 + task.analyze(); 2.85 + } 2.86 + 2.87 + void checkDefaultInterface(TypeElement te) { 2.88 + System.err.println("Checking " + te.getSimpleName()); 2.89 + Assert.check(te.getModifiers().contains(Modifier.ABSTRACT)); 2.90 + for (Element e : te.getEnclosedElements()) { 2.91 + if (e.getSimpleName().toString().matches("(\\w)_(default|static|abstract)")) { 2.92 + boolean abstractExpected = false; 2.93 + String methodKind = e.getSimpleName().toString().substring(2); 2.94 + switch (methodKind) { 2.95 + case "default": 2.96 + case "static": 2.97 + break; 2.98 + case "abstract": 2.99 + abstractExpected = true; 2.100 + break; 2.101 + default: 2.102 + Assert.error("Cannot get here!" + methodKind); 2.103 + } 2.104 + Assert.check(e.getModifiers().contains(Modifier.ABSTRACT) == abstractExpected); 2.105 + } 2.106 + } 2.107 + } 2.108 +} 2.109 + 2.110 +interface I { 2.111 + default void m_default() { } 2.112 + static void m_static() { } 2.113 + void m_abstract(); 2.114 +}