TypeCasts.java revision 2942:08092deced3f
1/*
2 * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24import static com.sun.tools.classfile.TypeAnnotation.TargetType.*;
25
26/*
27 * @test
28 * @bug 8042451
29 * @summary Test population of reference info for type casts
30 * @modules jdk.jdeps/com.sun.tools.classfile
31 * @compile -g Driver.java ReferenceInfoUtil.java TypeCasts.java
32 * @run main Driver TypeCasts
33 */
34public class TypeCasts {
35
36    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
37            typeIndex = 0)
38    public String returnObject() {
39        return "Object returnObject() { return (@TA String)null; }";
40    }
41
42    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
43            typeIndex = 0)
44    @TADescription(annotation = "TB", type = CAST,
45            genericLocation = { 0, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
46            typeIndex = 0)
47    @TADescription(annotation = "TC", type = CAST,
48            genericLocation = { 0, 0, 0, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
49            typeIndex = 0)
50    public String returnObjectArray() {
51        return "Object returnObjectArray() { return (@TC String @TA [] @TB [])null; }";
52    }
53
54    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
55            typeIndex = 0)
56    @TADescription(annotation = "TB", type = CAST,
57            genericLocation = { 3, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
58            typeIndex = 0)
59    public String returnObjectGeneric() {
60        return "Object returnObjectGeneric() { return (@TA List<@TB String>)null; }";
61    }
62
63    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
64            typeIndex = 0)
65    public String returnPrim() {
66        return "Object returnPrim() { return (@TA int)0; }";
67    }
68
69    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
70            typeIndex = 0)
71    @TADescription(annotation = "TB", type = CAST,
72            genericLocation = { 0, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
73            typeIndex = 0)
74    public String returnPrimArray() {
75        return "Object returnPrimArray() { return (@TB int @TA [])null; }";
76    }
77
78    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
79            typeIndex = 0)
80    public String initObject() {
81        return "void initObject() { Object a =  (@TA String)null; }";
82    }
83
84    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
85            typeIndex = 0)
86    @TADescription(annotation = "TB", type = CAST,
87            genericLocation = { 0, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
88            typeIndex = 0)
89    public String initObjectArray() {
90        return "void initObjectArray() { Object a = (@TB String @TA [])null; }";
91    }
92
93    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
94            typeIndex = 0)
95    @TADescription(annotation = "TB", type = CAST,
96            genericLocation = { 3, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
97            typeIndex = 0)
98    public String initObjectGeneric() {
99        return "void initObjectGeneric() { Object a = (@TA List<@TB String>)null; }";
100    }
101
102    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
103            typeIndex = 0)
104    public String initPrim() {
105        return "void initPrim() { Object a =  (@TA int)0; }";
106    }
107
108    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
109            typeIndex = 0)
110    @TADescription(annotation = "TB", type = CAST,
111            genericLocation = { 0, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
112            typeIndex = 0)
113    public String initPrimArray() {
114        return "void initPrimArray() { Object a = (@TB int @TA [])null; }";
115    }
116
117    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
118            typeIndex = 0)
119    public String eqtestObject() {
120        return "void eqtestObject() { if (null == (@TA String)null); }";
121    }
122
123    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
124            typeIndex = 0)
125    @TADescription(annotation = "TB", type = CAST,
126            genericLocation = { 0, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
127            typeIndex = 0)
128    public String eqtestObjectArray() {
129        return "void eqtestObjectArray() { if (null == (@TB String @TA [])null); }";
130    }
131
132    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
133            typeIndex = 0)
134    @TADescription(annotation = "TB", type = CAST,
135            genericLocation = { 3, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
136            typeIndex = 0)
137    public String eqtestObjectGeneric() {
138        return "void eqtestObjectGeneric() { if (null == (@TA List<@TB String >)null); }";
139    }
140
141    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
142            typeIndex = 0)
143    // compiler optimizes away compile time constants casts
144    public String eqtestPrim() {
145        return "void eqtestPrim(int a) { if (0 == (@TA int)a); }";
146    }
147
148    @TADescription(annotation = "TA", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
149            typeIndex = 0)
150    @TADescription(annotation = "TB", type = CAST,
151            genericLocation = { 0, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
152            typeIndex = 0)
153    public String eqtestPrimArray() {
154        return "void eqtestPrimArray() { if (null == (@TB int @TA [])null); }";
155    }
156
157    @TADescription(annotation = "TA", type = CAST,
158            offset = ReferenceInfoUtil.IGNORE_VALUE, typeIndex = 0)
159    @TADescription(annotation = "TB", type = CAST,
160            offset = ReferenceInfoUtil.IGNORE_VALUE, typeIndex = 1)
161    @TADescription(annotation = "TC", type = CAST,
162            offset = ReferenceInfoUtil.IGNORE_VALUE, typeIndex = 1,
163            genericLocation = {3, 0})
164    public String intersection1() {
165        return "void intersection() { Object o = (@TA String & @TB Comparable<@TC String>) null; }";
166    }
167
168    @TADescription(annotation = "TA", type = CAST,
169            offset = ReferenceInfoUtil.IGNORE_VALUE, typeIndex = 0)
170    @TADescription(annotation = "TB", type = CAST,
171            offset = ReferenceInfoUtil.IGNORE_VALUE, typeIndex = 1)
172    @TADescription(annotation = "TC", type = CAST,
173            offset = ReferenceInfoUtil.IGNORE_VALUE, typeIndex = 1,
174            genericLocation = {3, 0})
175    @TADescription(annotation = "TD", type = CAST,
176            offset = ReferenceInfoUtil.IGNORE_VALUE, typeIndex = 2)
177    public String intersection2() {
178        return "void intersection() { Object o = (@TA String & @TB Comparable<@TC String> & @TD CharSequence) null; }";
179    }
180
181    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
182            typeIndex = 0)
183    public String returnObjectRepeatableAnnotation() {
184        return "Object returnObject() { return (@RTA @RTA String)null; }";
185    }
186
187    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
188            typeIndex = 0)
189    @TADescription(annotation = "RTBs", type = CAST,
190            genericLocation = { 0, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
191            typeIndex = 0)
192    @TADescription(annotation = "RTCs", type = CAST,
193            genericLocation = { 0, 0, 0, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
194            typeIndex = 0)
195    public String returnObjectArrayRepeatableAnnotation() {
196        return "Object returnObjectArray() { return (@RTC @RTC String @RTA @RTA [] @RTB @RTB [])null; }";
197    }
198
199    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
200            typeIndex = 0)
201    @TADescription(annotation = "RTBs", type = CAST,
202            genericLocation = { 3, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
203            typeIndex = 0)
204    public String returnObjectGenericRepeatableAnnotation() {
205        return "Object returnObjectGeneric() { return (@RTA @RTA List<@RTB @RTB String>)null; }";
206    }
207
208    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
209            typeIndex = 0)
210    public String returnPrimRepeatableAnnotation() {
211        return "Object returnPrim() { return (@RTA @RTA int)0; }";
212    }
213
214    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
215            typeIndex = 0)
216    @TADescription(annotation = "RTBs", type = CAST,
217            genericLocation = { 0, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
218            typeIndex = 0)
219    public String returnPrimArrayRepeatableAnnotation() {
220        return "Object returnPrimArray() { return (@RTB @RTB int @RTA @RTA [])null; }";
221    }
222
223    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
224            typeIndex = 0)
225    public String initObjectRepeatableAnnotation() {
226        return "void initObject() { Object a =  (@RTA @RTA String)null; }";
227    }
228
229    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
230            typeIndex = 0)
231    @TADescription(annotation = "RTBs", type = CAST,
232            genericLocation = { 0, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
233            typeIndex = 0)
234    public String initObjectArrayRepeatableAnnotation() {
235        return "void initObjectArray() { Object a = (@RTB @RTB String @RTA @RTA [])null; }";
236    }
237
238    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
239            typeIndex = 0)
240    @TADescription(annotation = "RTBs", type = CAST,
241            genericLocation = { 3, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
242            typeIndex = 0)
243    public String initObjectGenericRepeatableAnnotation() {
244        return "void initObjectGeneric() { Object a = (@RTA @RTA List<@RTB @RTB String>)null; }";
245    }
246
247    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
248            typeIndex = 0)
249    public String initPrimRepeatableAnnotation() {
250        return "void initPrim() { Object a =  (@RTA @RTA int)0; }";
251    }
252
253    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
254            typeIndex = 0)
255    @TADescription(annotation = "RTBs", type = CAST,
256            genericLocation = { 0, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
257            typeIndex = 0)
258    public String initPrimArrayRepeatableAnnotation() {
259        return "void initPrimArray() { Object a = (@RTB @RTB int @RTA @RTA [])null; }";
260    }
261
262    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
263            typeIndex = 0)
264    public String eqtestObjectRepeatableAnnotation() {
265        return "void eqtestObject() { if (null == (@RTA @RTA String)null); }";
266    }
267
268    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
269            typeIndex = 0)
270    @TADescription(annotation = "RTBs", type = CAST,
271            genericLocation = { 0, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
272            typeIndex = 0)
273    public String eqtestObjectArrayRepeatableAnnotation() {
274        return "void eqtestObjectArray() { if (null == (@RTB @RTB String @RTA @RTA [])null); }";
275    }
276
277    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
278            typeIndex = 0)
279    @TADescription(annotation = "RTBs", type = CAST,
280            genericLocation = { 3, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
281            typeIndex = 0)
282    public String eqtestObjectGenericRepeatableAnnotation() {
283        return "void eqtestObjectGeneric() { if (null == (@RTA @RTA List<@RTB @RTB String >)null); }";
284    }
285
286    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
287            typeIndex = 0)
288    // compiler optimizes away compile time constants casts
289    public String eqtestPrimRepeatableAnnotation() {
290        return "void eqtestPrim(int a) { if (0 == (@RTA @RTA int)a); }";
291    }
292
293    @TADescription(annotation = "RTAs", type = CAST, offset = ReferenceInfoUtil.IGNORE_VALUE,
294            typeIndex = 0)
295    @TADescription(annotation = "RTBs", type = CAST,
296            genericLocation = { 0, 0 }, offset = ReferenceInfoUtil.IGNORE_VALUE,
297            typeIndex = 0)
298    public String eqtestPrimArrayRepeatableAnnotation() {
299        return "void eqtestPrimArray() { if (null == (@RTB @RTB int @RTA @RTA [])null); }";
300    }
301
302    @TADescription(annotation = "RTAs", type = CAST,
303            offset = ReferenceInfoUtil.IGNORE_VALUE, typeIndex = 0)
304    @TADescription(annotation = "RTBs", type = CAST,
305            offset = ReferenceInfoUtil.IGNORE_VALUE, typeIndex = 1)
306    @TADescription(annotation = "RTCs", type = CAST,
307            offset = ReferenceInfoUtil.IGNORE_VALUE, typeIndex = 1,
308            genericLocation = {3, 0})
309    public String intersectionRepeatableAnnotation1() {
310        return "void intersection() { Object o = (@RTA @RTA String & @RTB @RTB Comparable<@RTC @RTC String>) null; }";
311    }
312
313    @TADescription(annotation = "RTAs", type = CAST,
314            offset = ReferenceInfoUtil.IGNORE_VALUE, typeIndex = 0)
315    @TADescription(annotation = "RTBs", type = CAST,
316            offset = ReferenceInfoUtil.IGNORE_VALUE, typeIndex = 1)
317    @TADescription(annotation = "RTCs", type = CAST,
318            offset = ReferenceInfoUtil.IGNORE_VALUE, typeIndex = 1,
319            genericLocation = {3, 0})
320    @TADescription(annotation = "RTDs", type = CAST,
321            offset = ReferenceInfoUtil.IGNORE_VALUE, typeIndex = 2)
322    public String intersectionRepeatableAnnotation2() {
323        return "void intersection() { Object o = (@RTA @RTA String & @RTB @RTB Comparable<@RTC @RTC String> &" +
324                " @RTD @RTD CharSequence) null; }";
325    }
326}
327