1 /* 2 * Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /** 25 * @test 26 * @bug 6330997 7025789 8000961 8188870 8193290 27 * @summary javac should accept class files with major version of the next release 28 * @author Wei Tao 29 * @modules jdk.compiler/com.sun.tools.javac.api 30 * jdk.compiler/com.sun.tools.javac.code 31 * jdk.compiler/com.sun.tools.javac.comp 32 * jdk.compiler/com.sun.tools.javac.main 33 * jdk.compiler/com.sun.tools.javac.util 34 * @clean T1 T2 35 * @compile -source 11 -target 12 T1.java 36 * @compile -source 11 -target 12 T2.java 37 * @run main/othervm T6330997 38 */ 39 40 import java.nio.*; 41 import java.io.*; 42 import java.nio.channels.*; 43 44 import com.sun.tools.javac.api.JavacTaskImpl; 45 import com.sun.tools.javac.code.ClassFinder.BadClassFile; 46 import com.sun.tools.javac.code.Symtab; 47 import com.sun.tools.javac.util.Names; 48 import javax.tools.ToolProvider; 49 50 public class T6330997 { 51 public static void main(String... args) { 52 increaseMajor("T1.class", 1); 53 increaseMajor("T2.class", 2); 54 javax.tools.JavaCompiler tool = ToolProvider.getSystemJavaCompiler(); 55 JavacTaskImpl task = (JavacTaskImpl)tool.getTask(null, null, null, null, null, null); 56 Symtab syms = Symtab.instance(task.getContext()); 57 Names names = Names.instance(task.getContext()); 58 task.ensureEntered(); 59 try { 60 syms.enterClass(syms.unnamedModule, names.fromString("T1")).complete(); 61 } catch (Exception e) { 62 e.printStackTrace(); 63 throw new RuntimeException("Failed: unexpected exception while reading class T1"); 64 } 65 try { 66 syms.enterClass(syms.unnamedModule, names.fromString("T2")).complete(); 67 } catch (BadClassFile e) { 68 System.err.println("Passed: expected completion failure " + e.getClass().getName()); 69 return; 70 } catch (Exception e) { 71 e.printStackTrace(); 72 throw new RuntimeException("Failed: unexpected exception while reading class T2"); 73 } 74 throw new RuntimeException("Failed: no error reported"); 75 } 76 77 // Increase class file cfile's major version by delta 78 static void increaseMajor(String cfile, int delta) { 79 try (RandomAccessFile cls = 80 new RandomAccessFile(new File(System.getProperty("test.classes", "."), cfile), "rw"); 81 FileChannel fc = cls.getChannel()) { 82 ByteBuffer rbuf = ByteBuffer.allocate(2); 83 fc.read(rbuf, 6); 84 ByteBuffer wbuf = ByteBuffer.allocate(2); 85 wbuf.putShort(0, (short)(rbuf.getShort(0) + delta)); 86 fc.write(wbuf, 6); 87 fc.force(false); 88 } catch (Exception e){ 89 throw new RuntimeException("Failed: unexpected exception"); 90 } 91 } 92 }