1 extern void abort (void);
3 /* { dg-options "-O2" } */
6 #define TYPE_MAX(type, sign) \
7 ((!sign) ? ((1 << (sizeof (type) * 8 - 1)) - 1) : \
8 ((1 << (sizeof (type) * 8)) - 1))
9 #define TYPE_MIN(type, sign) \
10 ((!sign) ? -(1 << (sizeof (type) * 8 - 1)) : 0)
12 #define TEST_FN(NAME, ARG_TYPE, RET_TYPE, CAST_TYPE, VAL, VR_MIN, VR_MAX)\
13 __attribute__((noinline, noclone)) RET_TYPE \
14 NAME (ARG_TYPE arg){ \
16 if (arg + 1 < VR_MIN || arg + 1 > VR_MAX) return ret; \
17 /* Value Range of arg at this point will be [VR_min, VR_max]. */\
19 ret = (CAST_TYPE)arg; \
23 /* Signed to signed conversion with value in-range. */
24 TEST_FN (foo1
, short, short, char, 1, TYPE_MIN (char, 0), TYPE_MAX (char, 0));
25 TEST_FN (foo2
, short, short, char, 1, TYPE_MIN (char, 0) + 1,\
26 TYPE_MAX (char, 0) - 1);
28 /* Signed to signed conversion with value not in-range. */
29 TEST_FN (foo3
, short, short, char, -1, TYPE_MIN (short, 0) + 1, 100);
30 TEST_FN (foo4
, short, short, char, 1, 12, TYPE_MAX (short, 0) + 1);
32 /* Unsigned to unsigned conversion with value in-range. */
33 TEST_FN (foo5
, unsigned short, unsigned short, unsigned char, 1,\
34 TYPE_MIN (char, 1) + 1, TYPE_MAX (char, 1) - 1);
35 TEST_FN (foo6
, unsigned short, unsigned short, unsigned char, 1,\
36 TYPE_MIN (char, 1), TYPE_MAX (char, 1));
38 /* Unsigned to unsigned conversion with value not in-range. */
39 TEST_FN (foo7
, unsigned short, unsigned short, unsigned char, 1,\
40 TYPE_MIN (short, 1) + 1, TYPE_MAX (short, 1) - 1);
41 TEST_FN (foo8
, unsigned short, unsigned short, unsigned char, 1,\
42 TYPE_MIN (short, 1), TYPE_MAX (short, 1));
44 /* Signed to unsigned conversion with value range positive. */
45 TEST_FN (foo9
, short, short, unsigned char, -1, 1,\
46 TYPE_MAX (char, 1) - 1);
47 TEST_FN (foo10
, short, short, unsigned char, 1, 0,\
50 /* Signed to unsigned conversion with value range negative. */
51 TEST_FN (foo11
, short, short, unsigned char, 1,\
52 TYPE_MIN (char, 0) + 1, TYPE_MAX (char, 0) - 1);
53 TEST_FN (foo12
, short, short, unsigned char, 1,\
54 TYPE_MIN (char, 0), TYPE_MAX (char, 0));
56 /* Unsigned to Signed conversion with value range in signed equiv range. */
57 TEST_FN (foo13
, unsigned short, unsigned short, char, 1,\
58 TYPE_MIN (char, 1) + 1, TYPE_MAX (char, 0) - 1);
59 TEST_FN (foo14
, unsigned short, unsigned short, char, 1,\
60 TYPE_MIN (char, 1), TYPE_MAX (char, 0));
62 /* Unsigned to Signed conversion with value range not-in signed range. */
63 TEST_FN (foo15
, unsigned short, unsigned short, char, 1,\
64 TYPE_MIN (char, 1) + 1, TYPE_MAX (char, 1) - 1);
65 TEST_FN (foo16
, unsigned short, unsigned short, char, 1,\
66 TYPE_MIN (char, 1), TYPE_MAX (char, 1));
70 /* Signed to signed conversion with value in-range. */
72 if (foo1 (-32) != -31)
78 /* Signed to signed conversion with value not in-range. */
80 if (foo3 (-512) != -513)
83 if (foo4 (512) != 513)
86 /* Unsigned to unsigned conversion with value in-range. */
94 /* Unsigned to unsigned conversion with value not in-range. */
96 if (foo7 (512) != 513)
99 if (foo8 (512) != 513)
102 /* Signed to unsigned conversion with value range positive. */
110 /* Signed to unsigned conversion with value range negative. */
112 if (foo11 (-125) != -124)
115 if (foo12 (-125) != -124)
118 /* Unsigned to Signed conversion with value range in signed equiv range. */
120 if (foo13 (125) != 126)
123 if (foo14 (125) != 126)
126 /* Unsigned to Signed conversion with value range not-in signed range. */
128 if (foo15 (250) != 251)
131 if (foo16 (250) != 251)