- 
    CSR 
- 
    Resolution: Approved
- 
     P2 P2
- 
    None
- 
        behavioral
- 
        minimal
- 
        Existing implicit behaviour is now explicitly specified
- 
        Java API
- 
        SE
Summary
StringConcatFactory.makeConcat and StringConcatFactory.makeConcatWithConstants are underspecified with respect to 0 or 1 inputs when invoking the MethodHandle target of a returned CallSite.
Solution
Specify the concatenation behaviour cases for 0 or 1 inputs (note an input may be an argument or a constant). For 0 inputs an empty string is returned, for 1 input the value converted to a String and then returned.
Specification
diff -r 5bb3d34ffeb1 src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java
--- a/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java Mon Nov 27 15:47:27 2017 -0800
+++ b/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java Tue Nov 28 12:55:47 2017 -0800
@@ -385,9 +385,16 @@
      * invoked, it returns the result of String concatenation, taking all
      * function arguments passed to the linkage method as inputs for
      * concatenation. The target signature is given by {@code concatType}.
-     * The arguments are concatenated as per requirements stated in JLS 15.18.1
-     * "String Concatenation Operator +". Notably, the inputs are converted as
-     * per JLS 5.1.11 "String Conversion", and combined from left to right.
+     * For a target accepting:
+     * <ul>
+     *     <li>zero inputs, concatenation results in an empty string;</li>
+     *     <li>one input, concatenation results in the single
+     *     input converted as per JLS 5.1.11 "String Conversion"; otherwise</li>
+     *     <li>two or more inputs, the inputs are concatenated as per
+     *     requirements stated in JLS 15.18.1 "String Concatenation Operator +".
+     *     The inputs are converted as per JLS 5.1.11 "String Conversion",
+     *     and combined from left to right.</li>
+     * </ul>
      *
      * <p>Assume the linkage arguments are as follows:
      *
@@ -452,10 +464,17 @@
      * invoked, it returns the result of String concatenation, taking all
      * function arguments and constants passed to the linkage method as inputs for
      * concatenation. The target signature is given by {@code concatType}, and
-     * does not include constants. The arguments are concatenated as per requirements
-     * stated in JLS 15.18.1 "String Concatenation Operator +". Notably, the inputs
-     * are converted as per JLS 5.1.11 "String Conversion", and combined from left
-     * to right.
+     * does not include constants.
+     * For a target accepting:
+     * <ul>
+     *     <li>zero inputs, concatenation results in an empty string;</li>
+     *     <li>one input, concatenation results in the single
+     *     input converted as per JLS 5.1.11 "String Conversion"; otherwise</li>
+     *     <li>two or more inputs, the inputs are concatenated as per
+     *     requirements stated in JLS 15.18.1 "String Concatenation Operator +".
+     *     The inputs are converted as per JLS 5.1.11 "String Conversion",
+     *     and combined from left to right.</li>
+     * </ul>
      *
      * <p>The concatenation <em>recipe</em> is a String description for the way to
      * construct a concatenated String from the arguments and constants. The- csr of
- 
                    JDK-8187237 Need to define the behaviour for 0 and 1 argument method type in StringConcatFactory.makeConcat -           
- Closed
 
-