T8168480.java revision 3722:aacff1ac75a2
1/*
2 * @test
3 * @bug 8168480
4 * @summary Speculative attribution of lambda causes NPE in Flow
5 * @compile T8168480.java
6 */
7
8import java.util.function.Supplier;
9
10class T8168480 {
11    void f(Runnable r) { }
12    void s(Supplier<Runnable> r) { }
13
14    private void testVoid(boolean cond) {
15        f(() ->
16                new Runnable() {
17                    public void run() {
18                        switch (42) {
19                            default:
20                                break;
21                        }
22                    }
23                }.run());
24
25        f(() ->
26                f(() -> {
27                    switch (42) {
28                        default:
29                            break;
30                    }
31                }));
32
33        f(() -> {
34            if (cond) {
35                new Runnable() {
36                    public void run() {
37                        switch (42) {
38                            default:
39                                break;
40                        }
41                    }
42                }.run();
43            } else {
44                f(() -> {
45                    switch (42) {
46                        default:
47                            break;
48                    }
49                });
50            }
51        });
52    }
53
54    private void testReturn(boolean cond) {
55        s(() ->
56                new Runnable() {
57                    public void run() {
58                        switch (42) {
59                            default:
60                                break;
61                        }
62                    }
63                });
64
65        s(() ->
66                () -> {
67                    switch (42) {
68                        default:
69                            break;
70                    }
71                });
72
73        s(() -> {
74            if (cond) {
75                return new Runnable() {
76                    public void run() {
77                        switch (42) {
78                            default:
79                                break;
80                        }
81                    }
82                };
83            } else {
84                return () -> {
85                    switch (42) {
86                        default:
87                            break;
88                    }
89                };
90            }
91        });
92
93        s(() -> {
94            return cond ?
95                new Runnable() {
96                    public void run() {
97                        switch (42) {
98                            default:
99                                break;
100                        }
101                    }
102                } : () -> {
103                    switch (42) {
104                        default:
105                            break;
106                    }
107                };
108        });
109
110        s(() -> cond ?
111                new Runnable() {
112                    public void run() {
113                        switch (42) {
114                            default:
115                                break;
116                        }
117                    }
118                } : () -> {
119                    switch (42) {
120                        default:
121                            break;
122                    }
123                });
124    }
125}
126