8067914: Redundant type cast nodes in AST (follow up from JDK-8043741)
authormcimadamore
Fri, 09 Jan 2015 15:51:20 +0000
changeset 28339 fa0685d84b74
parent 28338 53f6dcec62d1
child 28340 6869ff192a0e
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
langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java
langtools/test/tools/javac/tree/8067914/E.out
langtools/test/tools/javac/tree/8067914/NukeExtraCast.java
langtools/test/tools/javac/tree/8067914/T8067914.java
--- 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(); }
+}
+