8067914: Redundant type cast nodes in AST (follow up from JDK-8043741)
Summary: Workaround for redundant (but harmless) synthetic cast generated in TransTypes
Reviewed-by: mcimadamore
Contributed-by: srikanth.adayapalam@oracle.com
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java Fri Jan 09 15:50:22 2015 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java Fri Jan 09 15:51:20 2015 +0000
@@ -755,7 +755,15 @@
tree.clazz = translate(tree.clazz, null);
Type originalTarget = tree.type;
tree.type = erasure(tree.type);
- tree.expr = translate(tree.expr, erasure(tree.expr.type));
+ JCExpression newExpression = translate(tree.expr, erasure(tree.expr.type));
+ if (newExpression != tree.expr) {
+ JCTypeCast typeCast = newExpression.hasTag(Tag.TYPECAST)
+ ? (JCTypeCast) newExpression
+ : null;
+ tree.expr = typeCast != null && types.isSameType(typeCast.type, originalTarget, true)
+ ? typeCast.expr
+ : newExpression;
+ }
if (originalTarget.isCompound()) {
Type.IntersectionClassType ict = (Type.IntersectionClassType)originalTarget;
for (Type c : ict.getExplicitComponents()) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/tree/8067914/E.out Fri Jan 09 15:51:20 2015 +0000
@@ -0,0 +1,16 @@
+
+class E extends S {
+
+ E() {
+ super();
+ }
+ {
+ t = new C();
+ new I(<*nullchk*>((C)t)){
+
+ (.C x0) {
+ x0.super();
+ }
+ };
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/tree/8067914/NukeExtraCast.java Fri Jan 09 15:51:20 2015 +0000
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2014, 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 8067914
+ * @summary Redunant type cast nodes in AST (follow up from JDK-8043741)
+ * @library /tools/lib
+ * @build ToolBox
+ * @run compile -XD-printsource T8067914.java
+ * @run main NukeExtraCast
+ */
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
+public class NukeExtraCast {
+
+ public static void main(String[] args) throws Exception {
+ ToolBox tb = new ToolBox();
+ Path path1 = Paths.get(ToolBox.testClasses, "E.java");
+ List<String> file1 = tb.readAllLines(path1);
+
+ Path path2 = Paths.get(ToolBox.testSrc, "E.out");
+ List<String> file2 = tb.readAllLines(path2);
+ tb.checkEqual(file1, file2);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/tree/8067914/T8067914.java Fri Jan 09 15:51:20 2015 +0000
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2014, 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.
+ */
+
+class S<T> { T t; }
+class C { class I { }; }
+class E extends S<C> {{
+ t = new C();
+ ((C) t).new I() { };
+}};
+class X {
+ public static void main(String[] args) { new E(); }
+}
+