2015-05-04 Sandra Loosemore <sandra@codesourcery.com>
[official-gcc.git] / gcc / testsuite / gcc.dg / zero_sign_ext_test.c
blob6a52678f396c849b64b8e15829405a40a92a06ff
1 extern void abort (void);
3 /* { dg-options "-O2" } */
4 /* { dg-do run } */
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){ \
15 RET_TYPE ret = VAL; \
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]. */\
18 arg = arg + VAL; \
19 ret = (CAST_TYPE)arg; \
20 return 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,\
48 TYPE_MAX (char, 1));
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));
68 int main ()
70 /* Signed to signed conversion with value in-range. */
71 /* arg + 1. */
72 if (foo1 (-32) != -31)
73 abort ();
74 /* arg + 1. */
75 if (foo2 (32) != 33)
76 abort ();
78 /* Signed to signed conversion with value not in-range. */
79 /* arg - 1. */
80 if (foo3 (-512) != -513)
81 abort ();
82 /* arg + 1. */
83 if (foo4 (512) != 513)
84 abort ();
86 /* Unsigned to unsigned conversion with value in-range. */
87 /* arg + 1. */
88 if (foo5 (64) != 65)
89 abort ();
90 /* arg + 1. */
91 if (foo6 (64) != 65)
92 abort ();
94 /* Unsigned to unsigned conversion with value not in-range. */
95 /* arg + 1. */
96 if (foo7 (512) != 513)
97 abort ();
98 /* arg + 1. */
99 if (foo8 (512) != 513)
100 abort ();
102 /* Signed to unsigned conversion with value range positive. */
103 /* arg - 1. */
104 if (foo9 (2) != 1)
105 abort ();
106 /* arg + 1. */
107 if (foo10 (2) != 3)
108 abort ();
110 /* Signed to unsigned conversion with value range negative. */
111 /* arg + 1. */
112 if (foo11 (-125) != -124)
113 abort ();
114 /* arg + 1. */
115 if (foo12 (-125) != -124)
116 abort ();
118 /* Unsigned to Signed conversion with value range in signed equiv range. */
119 /* arg + 1. */
120 if (foo13 (125) != 126)
121 abort ();
122 /* arg + 1. */
123 if (foo14 (125) != 126)
124 abort ();
126 /* Unsigned to Signed conversion with value range not-in signed range. */
127 /* arg + 1. */
128 if (foo15 (250) != 251)
129 abort ();
130 /* arg + 1. */
131 if (foo16 (250) != 251)
132 abort ();
134 return 0;