Bug in com.sun.tools.javac.tree.Pretty

Matthew Dempsky mdempsky at google.com
Mon Sep 9 11:54:49 PDT 2013


Thanks Jonathan!

http://bugs.sun.com/view_bug.do?bug_id=8024415 still tells me "This bug is
not available", and clicking on the FAQ page (http://bugs.sun.com/faq.do)
just gives me a blank page (except for header links).  Can you clarify how
much longer I should expect before the bug report is available?


On Fri, Sep 6, 2013 at 9:08 AM, Jonathan Gibbons <
jonathan.gibbons at oracle.com> wrote:

>  Matthew,
>
> Thank you. This is being tracked as 8024415.  It should show up soon on
> bugs.sun.com.
>
> -- Jon
>
>
> On 09/05/2013 11:10 PM, Matthew Dempsky wrote:
>
>  Hi Java compiler developers,
>
>  I noticed a bug in javac's JCTree pretty printer: it mishandles the
> precedence rules when pretty printing JCConditional trees.  The "condition"
> subexpression should be pretty printed at precedence condPrec+1 instead of
> condPrec.
>
>  I've put together a short test program demonstrating this bug, included
> below.  It constructs and pretty prints two different nested conditional
> trees, but they generate identical output.
>
>  Additionally, but less severely, the "true" subexpression can be printed
> at noPrec without introducing any ambiguity; e.g., "x ? y = 1 : z" will
> parse the same as "x ? (y = 1) : z" anyway, so it's unnecessary (but also
> not incorrect) for Pretty to print the latter.
>
>  I believe (but have not verified) that these can both be fixed by
> changing Pretty.visitConditional() to:
>
>              printExpr(tree.cond, TreeInfo.condPrec + 1);
>              print(" ? ");
>             printExpr(tree.truepart);
>             print(" : ");
>             printExpr(tree.falsepart, TreeInfo.condPrec);
>
>  I discovered this bug in what I believe to be jdk7u40, but it looks like
> it's still present in jdk8 langtools at tip:
> http://hg.openjdk.java.net/jdk8/jdk8/langtools/file/tip/src/share/classes/com/sun/tools/javac/tree/Pretty.java
>
>  Thanks
>
>
>  Test program:
>
>  package prettybug;
>
>  import com.sun.tools.javac.file.JavacFileManager;
> import com.sun.tools.javac.tree.Pretty;
> import com.sun.tools.javac.tree.TreeMaker;
> import com.sun.tools.javac.util.Context;
>
>  import java.io.PrintWriter;
>
>  public class Bug {
>   public static void main(String[] args) throws Exception {
>     Context ctx = new Context();
>     JavacFileManager.preRegister(ctx);
>     TreeMaker maker = TreeMaker.instance(ctx);
>
>      PrintWriter writer = new PrintWriter(System.out);
>     Pretty pretty = new Pretty(writer, true);
>
>      writer.println("These two trees should print differently:");
>
>      pretty.printExpr(
>       maker.Conditional(
>         maker.Conditional(
>            maker.Literal(1),
>           maker.Literal(2),
>           maker.Literal(3)),
>         maker.Literal(4),
>         maker.Literal(5)));
>     writer.println();
>
>      pretty.printExpr(
>       maker.Conditional(
>         maker.Literal(1),
>         maker.Literal(2),
>         maker.Conditional(
>           maker.Literal(3),
>           maker.Literal(4),
>           maker.Literal(5))));
>     writer.println();
>
>      writer.println();
>
>      writer.println("This expression is unambiguous even without the
> parentheses:");
>
>      pretty.printExpr(
>       maker.Conditional(
>         maker.Literal(1),
>         maker.Assign(
>           maker.Literal(2),
>           maker.Literal(3)),
>         maker.Literal(4)));
>     writer.println();
>
>      writer.flush();
>   }
> }
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20130909/30bf2273/attachment-0001.html 


More information about the compiler-dev mailing list