test/langtools/tools/javac/lambda/MostSpecific09.java
author vromero
Tue, 03 Apr 2018 23:58:52 -0400
changeset 49518 d0ff431a596e
parent 47216 71c04702a3d5
permissions -rw-r--r--
8198314: javac hidden options violate standard syntax for options Reviewed-by: jjg
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24066
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
     1
/*
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
     2
 * @test /nodynamiccopyright/
43030
a3d5b201d899 8065800: javac, fix diagnostic position for statement-bodied lambdas
cushon
parents: 40835
diff changeset
     3
 * @bug 8029718 8065800
24066
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
     4
 * @summary Should always use lambda body structure to disambiguate overload resolution
49518
d0ff431a596e 8198314: javac hidden options violate standard syntax for options
vromero
parents: 47216
diff changeset
     5
 * @compile/fail/ref=MostSpecific09.out -XDrawDiagnostics --should-stop=at=ATTR --debug=verboseResolution=applicable,success MostSpecific09.java
24066
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
     6
 */
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
     7
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
     8
class MostSpecific09 {
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
     9
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    10
    interface I {
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    11
        String xoo(String x);
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    12
    }
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    13
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    14
    interface J {
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    15
        void xoo(int x);
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    16
    }
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    17
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    18
    static void foo(I i) {}
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    19
    static void foo(J j) {}
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    20
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    21
    static void moo(I i) {}
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    22
    static void moo(J j) {}
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    23
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    24
    void m() {
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    25
        foo((x) -> { return x += 1; });
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    26
        foo((x) -> { return ""; });
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    27
        foo((x) -> { System.out.println(""); });
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    28
        foo((x) -> { return ""; System.out.println(""); });
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    29
        foo((x) -> { throw new RuntimeException(); });
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    30
        foo((x) -> { while (true); });
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    31
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    32
        foo((x) -> x += 1);
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    33
        foo((x) -> "");
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    34
    }
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    35
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    36
    /* any return statement that is not in the body of the lambda but in an
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    37
     * inner class or another lambda should be ignored for value void compatibility
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    38
     * determination.
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    39
     */
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    40
    void m1() {
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    41
        boolean cond = true;
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    42
        foo((x) -> {
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    43
            if (cond) {
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    44
                return "";
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    45
            }
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    46
            System.out.println("");
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    47
        });
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    48
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    49
        foo((x)->{
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    50
            class Bar {
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    51
                String m() {
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    52
                    return "from Bar.m()";
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    53
                }
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    54
            }
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    55
            class Boo {
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    56
                Bar b = new Bar (){
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    57
                    String m() {
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    58
                        return "from Bar$1.m()";
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    59
                    }
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    60
                };
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    61
            }
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    62
            moo((y) -> { return ""; });
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    63
            return;
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    64
        });
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    65
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    66
        foo((x)->{
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    67
            class Bar {
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    68
                void m() {}
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    69
            }
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    70
            class Boo {
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    71
                Bar b = new Bar (){
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    72
                    void m() {
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    73
                        return;
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    74
                    }
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    75
                };
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    76
            }
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    77
            moo((y) -> { System.out.println(""); });
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    78
            return "";
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    79
        });
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    80
    }
1dfb66929538 8029718: Should always use lambda body structure to disambiguate overload resolution
vromero
parents:
diff changeset
    81
}