<div dir="ltr"><div>I noticed that the result of string concatenation is different for the invokedynamic and inline strategies when the arguments have side effects.</div><div><br></div><div>With the inline strategy, each subexpression is evaluated and converted to a string in order. With indy each subexpression is evaluated in order *but not converted to a string*, and later each subexpression is converted to a string in order.</div><div><br></div><div>Is one of these behaviours more correct than the other?<br></div><div><br></div>class T {<br>  static String test() {<br>    StringBuilder builder = new StringBuilder("foo");<br>    return "" + builder + builder.append("bar");<br>  }<br><br>  public static void main(String[] args) {<br>    System.err.println(test());<br>  }<br>}<br><br>$ javac -XDstringConcat=inline T.java ; java T<div>foofoobar</div><div><br>$ javac -XDstringConcat=indy T.java ; java T<br>foobarfoobar</div><div><br>I read some of the related discussion about the spec requirements for string concatenation in [1], and also some of the discussion around JEP-280, and didn't find a conclusive answer. There was a bug [2] about the evaluation order of string concat subexpressions with indy, but that was about converting the arguments to strings in the wrong order.</div><div><br></div><div>[1] <a href="http://mail.openjdk.java.net/pipermail/compiler-dev/2015-March/009357.html">http://mail.openjdk.java.net/pipermail/compiler-dev/2015-March/009357.html</a><br>[2] <a href="https://bugs.openjdk.java.net/browse/JDK-8200118">https://bugs.openjdk.java.net/browse/JDK-8200118</a></div></div>