CastTest.java (791:2199365892b1) CastTest.java (1006:95fc7fd39be2)
1/*
2 * Copyright (c) 2010, 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 *

--- 28 unchanged lines hidden (view full) ---

37
38import static com.sun.tools.javac.code.Flags.*;
39
40/**
41 * Check invariants in cast conversion involving primitive types and arrays
42 */
43public class CastTest extends TypeHarness {
44
1/*
2 * Copyright (c) 2010, 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 *

--- 28 unchanged lines hidden (view full) ---

37
38import static com.sun.tools.javac.code.Flags.*;
39
40/**
41 * Check invariants in cast conversion involving primitive types and arrays
42 */
43public class CastTest extends TypeHarness {
44
45 Type[] allTypes;
45 Type[] types_no_boxing;
46 Type[] types_boxing;
46
47 static final boolean T = true;
48 static final boolean F = false;
49
47
48 static final boolean T = true;
49 static final boolean F = false;
50
50 boolean[][] cast_result = {
51 boolean[][] cast_result_no_boxing = {
51 //byte, short, int, long, float, double, char, bool, C, +C, I, T, byte[], short[], int[], long[], float[], double[], char[], bool[], C[], +C[], I[], T[]
52 /*byte*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F },
53 /*short*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F },
54 /*int*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F },
55 /*long*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F },
56 /*float*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F },
57 /*double*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F },
58 /*char*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F },

--- 10 unchanged lines hidden (view full) ---

69 /*double[]*/{ F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , T , F , F , F , F , F , F },
70 /*char[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , T , F , F , F , F , F },
71 /*bool[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , T , F , F , F , F },
72 /*C[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , F , T , T },
73 /*+C[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , F , T , F , T },
74 /*I[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , F , T , T },
75 /*T[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , T , T , T }};
76
52 //byte, short, int, long, float, double, char, bool, C, +C, I, T, byte[], short[], int[], long[], float[], double[], char[], bool[], C[], +C[], I[], T[]
53 /*byte*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F },
54 /*short*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F },
55 /*int*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F },
56 /*long*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F },
57 /*float*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F },
58 /*double*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F },
59 /*char*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F },

--- 10 unchanged lines hidden (view full) ---

70 /*double[]*/{ F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , T , F , F , F , F , F , F },
71 /*char[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , T , F , F , F , F , F },
72 /*bool[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , T , F , F , F , F },
73 /*C[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , F , T , T },
74 /*+C[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , F , T , F , T },
75 /*I[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , F , T , T },
76 /*T[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , T , T , T }};
77
78 boolean[][] cast_result_boxing = {
79 //byte, short, int, long, float, double, char, bool, Byte, Short, Integer, Long, Float, Double, Character, Boolean, Object
80 /*byte*/ { T , T , T , T , T , T , T , F , T , F , F , F , F , F , F , F , T },
81 /*short*/ { T , T , T , T , T , T , T , F , F , T , F , F , F , F , F , F , T },
82 /*int*/ { T , T , T , T , T , T , T , F , F , F , T , F , F , F , F , F , T },
83 /*long*/ { T , T , T , T , T , T , T , F , F , F , F , T , F , F , F , F , T },
84 /*float*/ { T , T , T , T , T , T , T , F , F , F , F , F , T , F , F , F , T },
85 /*double*/ { T , T , T , T , T , T , T , F , F , F , F , F , F , T , F , F , T },
86 /*char*/ { T , T , T , T , T , T , T , F , F , F , F , F , F , F , T , F , T },
87 /*bool*/ { F , F , F , F , F , F , F , T , F , F , F , F , F , F , F , T , T },
88 /*Byte*/ { T , T , T , T , T , T , F , F , T , F , F , F , F , F , F , F , T },
89 /*Short*/ { F , T , T , T , T , T , F , F , F , T , F , F , F , F , F , F , T },
90 /*Integer*/ { F , F , T , T , T , T , F , F , F , F , T , F , F , F , F , F , T },
91 /*Long*/ { F , F , F , T , T , T , F , F , F , F , F , T , F , F , F , F , T },
92 /*Float*/ { F , F , F , F , T , T , F , F , F , F , F , F , T , F , F , F , T },
93 /*Double*/ { F , F , F , F , F , T , F , F , F , F , F , F , F , T , F , F , T },
94 /*Character*/ { F , F , T , T , T , T , T , F , F , F , F , F , F , F , T , F , T },
95 /*Boolean*/ { F , F , F , F , F , F , F , T , F , F , F , F , F , F , F , T , T },
96 /*Object*/ { T , T , T , T , T , T , T , T , T , T , T , T , T , T , T , T , T }};
77 CastTest() {
78 Type[] primitiveTypes = {
79 predef.byteType,
80 predef.shortType,
81 predef.intType,
82 predef.longType,
83 predef.floatType,
84 predef.doubleType,
85 predef.charType,
86 predef.booleanType };
87
97 CastTest() {
98 Type[] primitiveTypes = {
99 predef.byteType,
100 predef.shortType,
101 predef.intType,
102 predef.longType,
103 predef.floatType,
104 predef.doubleType,
105 predef.charType,
106 predef.booleanType };
107
108 Type[] boxedTypes = new Type[primitiveTypes.length + 1];
109 for (int i = 0 ; i < primitiveTypes.length ; i++) {
110 boxedTypes[i] = box(primitiveTypes[i]);
111 }
112
113 boxedTypes[primitiveTypes.length] = predef.objectType;
114
115 types_boxing = join(Type.class, primitiveTypes, boxedTypes);
116
88 Type[] referenceTypes = {
89 fac.Class(),
90 fac.Class(FINAL),
91 fac.Interface(),
92 fac.TypeVariable() };
93
94 Type[] arrayTypes = new Type[primitiveTypes.length + referenceTypes.length];
95 int idx = 0;
96 for (Type t : join(Type.class, primitiveTypes, referenceTypes)) {
97 arrayTypes[idx++] = fac.Array(t);
98 }
99
117 Type[] referenceTypes = {
118 fac.Class(),
119 fac.Class(FINAL),
120 fac.Interface(),
121 fac.TypeVariable() };
122
123 Type[] arrayTypes = new Type[primitiveTypes.length + referenceTypes.length];
124 int idx = 0;
125 for (Type t : join(Type.class, primitiveTypes, referenceTypes)) {
126 arrayTypes[idx++] = fac.Array(t);
127 }
128
100 allTypes = join(Type.class, primitiveTypes, referenceTypes, arrayTypes);
129 types_no_boxing = join(Type.class, primitiveTypes, referenceTypes, arrayTypes);
101 }
102
130 }
131
103 void test() {
104 for (int i = 0; i < allTypes.length ; i++) {
105 for (int j = 0; j < allTypes.length ; j++) {
106 assertCastable(allTypes[i], allTypes[j], cast_result[i][j]);
132 void test(Type[] all_types, boolean[][] cast_result) {
133 for (int i = 0; i < all_types.length ; i++) {
134 for (int j = 0; j < all_types.length ; j++) {
135 assertCastable(all_types[i], all_types[j], cast_result[i][j]);
107 }
108 }
109 }
110
136 }
137 }
138 }
139
140 void runTests() {
141 test(types_no_boxing, cast_result_no_boxing);
142 test(types_boxing, cast_result_boxing);
143 }
144
111 @SuppressWarnings("unchecked")
112 <T> T[] join(Class<T> type, T[]... args) {
113 int totalLength = 0;
114 for (T[] arr : args) {
115 totalLength += arr.length;
116 }
117 T[] new_arr = (T[])Array.newInstance(type, totalLength);
118 int idx = 0;
119 for (T[] arr : args) {
120 System.arraycopy(arr, 0, new_arr, idx, arr.length);
121 idx += arr.length;
122 }
123 return new_arr;
124 }
125
126 public static void main(String[] args) {
145 @SuppressWarnings("unchecked")
146 <T> T[] join(Class<T> type, T[]... args) {
147 int totalLength = 0;
148 for (T[] arr : args) {
149 totalLength += arr.length;
150 }
151 T[] new_arr = (T[])Array.newInstance(type, totalLength);
152 int idx = 0;
153 for (T[] arr : args) {
154 System.arraycopy(arr, 0, new_arr, idx, arr.length);
155 idx += arr.length;
156 }
157 return new_arr;
158 }
159
160 public static void main(String[] args) {
127 new CastTest().test();
161 new CastTest().runTests();
128 }
129}
162 }
163}