annotate gcc/testsuite/g++.dg/ubsan/pr63956.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // PR sanitizer/63956
kono
parents:
diff changeset
2 // { dg-do compile }
kono
parents:
diff changeset
3 // { dg-options "-std=c++14 -fsanitize=undefined,float-divide-by-zero,float-cast-overflow" }
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 #define SA(X) static_assert((X),#X)
kono
parents:
diff changeset
6 #define INT_MIN (-__INT_MAX__ - 1)
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 constexpr int
kono
parents:
diff changeset
9 fn1 (int a, int b)
kono
parents:
diff changeset
10 {
kono
parents:
diff changeset
11 if (b != 2)
kono
parents:
diff changeset
12 a <<= b;
kono
parents:
diff changeset
13 // { dg-error "5 << -2.. is negative" "" { target *-*-* } .-1 }
kono
parents:
diff changeset
14 // { dg-error "is >= than the precision of the left operand" "" { target *-*-* } .-2 }
kono
parents:
diff changeset
15 // { dg-error "-2 << 4.. is negative" "" { target *-*-* } .-3 }
kono
parents:
diff changeset
16 return a;
kono
parents:
diff changeset
17 }
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 constexpr int i1 = fn1 (5, 3);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
20 constexpr int i2 = fn1 (5, -2); // { dg-message "in .constexpr. expansion" }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
21 constexpr int i3 = fn1 (5, sizeof (int) * __CHAR_BIT__); // { dg-message "in .constexpr. expansion" }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
22 constexpr int i4 = fn1 (5, 256); // { dg-message "in .constexpr. expansion" }
111
kono
parents:
diff changeset
23 constexpr int i5 = fn1 (5, 2);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
24 constexpr int i6 = fn1 (-2, 4); // { dg-message "in .constexpr. expansion" }
111
kono
parents:
diff changeset
25 constexpr int i7 = fn1 (0, 2);
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 SA (i1 == 40);
kono
parents:
diff changeset
28 SA (i5 == 5);
kono
parents:
diff changeset
29 SA (i7 == 0);
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 constexpr int
kono
parents:
diff changeset
32 fn2 (int a, int b)
kono
parents:
diff changeset
33 {
kono
parents:
diff changeset
34 if (b != 2)
kono
parents:
diff changeset
35 a >>= b;
kono
parents:
diff changeset
36 // { dg-error "4 >> -1.. is negative" "" { target *-*-* } .-1 }
kono
parents:
diff changeset
37 // { dg-error "is >= than the precision of the left operand" "" { target *-*-* } .-2 }
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 return a;
kono
parents:
diff changeset
40 }
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 constexpr int j1 = fn2 (4, 1);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
43 constexpr int j2 = fn2 (4, -1); // { dg-message "in .constexpr. expansion" }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
44 constexpr int j3 = fn2 (10, sizeof (int) * __CHAR_BIT__); // { dg-message "in .constexpr. expansion" }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
45 constexpr int j4 = fn2 (1, 256); // { dg-message "in .constexpr. expansion" }
111
kono
parents:
diff changeset
46 constexpr int j5 = fn2 (5, 2);
kono
parents:
diff changeset
47 constexpr int j6 = fn2 (-2, 4);
kono
parents:
diff changeset
48 constexpr int j7 = fn2 (0, 4);
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 SA (j1 == 2);
kono
parents:
diff changeset
51 SA (j5 == 5);
kono
parents:
diff changeset
52 SA (j7 == 0);
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 constexpr int
kono
parents:
diff changeset
55 fn3 (int a, int b)
kono
parents:
diff changeset
56 {
kono
parents:
diff changeset
57 if (b != 2)
kono
parents:
diff changeset
58 a = a / b; // { dg-error "..7 / 0.. is not a constant expression" }
kono
parents:
diff changeset
59 return a;
kono
parents:
diff changeset
60 }
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 constexpr int k1 = fn3 (8, 4);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
63 constexpr int k2 = fn3 (7, 0); // { dg-message "in .constexpr. expansion" }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
64 constexpr int k3 = fn3 (INT_MIN, -1); // { dg-error "overflow in constant expression|in .constexpr. expansion of " }
111
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 SA (k1 == 2);
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 constexpr float
kono
parents:
diff changeset
69 fn4 (float a, float b)
kono
parents:
diff changeset
70 {
kono
parents:
diff changeset
71 if (b != 2.0)
kono
parents:
diff changeset
72 a = a / b; // { dg-error "is not a constant expression" }
kono
parents:
diff changeset
73 return a;
kono
parents:
diff changeset
74 }
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 constexpr float l1 = fn4 (5.0, 3.0);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
77 constexpr float l2 = fn4 (7.0, 0.0); // { dg-message "in .constexpr. expansion" }
111
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 constexpr int
kono
parents:
diff changeset
80 fn5 (const int *a, int b)
kono
parents:
diff changeset
81 {
kono
parents:
diff changeset
82 if (b != 2)
kono
parents:
diff changeset
83 b = a[b];
kono
parents:
diff changeset
84 return b;
kono
parents:
diff changeset
85 }
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 constexpr int m1[4] = { 1, 2, 3, 4 };
kono
parents:
diff changeset
88 constexpr int m2 = fn5 (m1, 3);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
89 constexpr int m3 = fn5 (m1, 4); // { dg-error "array subscript|in .constexpr. expansion of " }
111
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 constexpr int
kono
parents:
diff changeset
92 fn6 (const int &a, int b)
kono
parents:
diff changeset
93 {
kono
parents:
diff changeset
94 if (b != 2)
kono
parents:
diff changeset
95 b = a;
kono
parents:
diff changeset
96 return b;
kono
parents:
diff changeset
97 }
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 constexpr int
kono
parents:
diff changeset
100 fn7 (const int *a, int b)
kono
parents:
diff changeset
101 {
kono
parents:
diff changeset
102 if (b != 3)
kono
parents:
diff changeset
103 return fn6 (*a, b);
kono
parents:
diff changeset
104 return 7;
kono
parents:
diff changeset
105 }
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 constexpr int n1 = 7;
kono
parents:
diff changeset
108 constexpr int n2 = fn7 (&n1, 5);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
109 constexpr int n3 = fn7 ((const int *) 0, 8); // { dg-error "null pointer|in .constexpr. expansion of " }
111
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 constexpr int
kono
parents:
diff changeset
112 fn8 (int i)
kono
parents:
diff changeset
113 {
kono
parents:
diff changeset
114 constexpr int g[10] = { };
kono
parents:
diff changeset
115 return g[i];
kono
parents:
diff changeset
116 }
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 constexpr int o1 = fn8 (9);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
119 constexpr int o2 = fn8 (10); // { dg-error "array subscript|in .constexpr. expansion of " }
111
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 constexpr int
kono
parents:
diff changeset
122 fn9 (int a, int b)
kono
parents:
diff changeset
123 {
kono
parents:
diff changeset
124 if (b != 0)
kono
parents:
diff changeset
125 return a + b;
kono
parents:
diff changeset
126 return a;
kono
parents:
diff changeset
127 }
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 constexpr int p1 = fn9 (42, 7);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
130 constexpr int p2 = fn9 (__INT_MAX__, 1); // { dg-error "overflow in constant expression|in .constexpr. expansion of " }
111
kono
parents:
diff changeset
131 constexpr int p3 = fn9 (__INT_MAX__, -1);
kono
parents:
diff changeset
132 constexpr int p4 = fn9 (INT_MIN, 1);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
133 constexpr int p5 = fn9 (INT_MIN, -1); // { dg-error "overflow in constant expression|in .constexpr. expansion of " }
111
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 SA (p1 == 49);
kono
parents:
diff changeset
136 SA (p3 == __INT_MAX__ - 1);
kono
parents:
diff changeset
137 SA (p4 == INT_MIN + 1);
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 constexpr int
kono
parents:
diff changeset
140 fn10 (int a, int b)
kono
parents:
diff changeset
141 {
kono
parents:
diff changeset
142 if (b != 0)
kono
parents:
diff changeset
143 return a * b;
kono
parents:
diff changeset
144 return a;
kono
parents:
diff changeset
145 }
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 constexpr int q1 = fn10 (10, 10);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
148 constexpr int q2 = fn10 (__INT_MAX__, 2); // { dg-error "overflow in constant expression|in .constexpr. expansion of " }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
149 constexpr int q3 = fn10 (INT_MIN, 2); // { dg-error "overflow in constant expression|in .constexpr. expansion of " }
111
kono
parents:
diff changeset
150 constexpr int q4 = fn10 (-1, -1);
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 SA (q1 == 100);
kono
parents:
diff changeset
153 SA (q4 == 1);
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 constexpr int
kono
parents:
diff changeset
156 fn11 (double d)
kono
parents:
diff changeset
157 {
kono
parents:
diff changeset
158 int i = d;
kono
parents:
diff changeset
159 if (i != 0)
kono
parents:
diff changeset
160 return i;
kono
parents:
diff changeset
161 return i * 2;
kono
parents:
diff changeset
162 }
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 constexpr int r1 = fn11 (3.4);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
165 constexpr int r2 = fn11 (__builtin_inf ()); // { dg-error "overflow in constant expression|in .constexpr. expansion of " }
111
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 constexpr int
kono
parents:
diff changeset
168 fn12 (int i)
kono
parents:
diff changeset
169 {
kono
parents:
diff changeset
170 if (i == 42)
kono
parents:
diff changeset
171 __builtin_unreachable (); // { dg-error "is not a constant expression" }
kono
parents:
diff changeset
172 return i + 10;
kono
parents:
diff changeset
173 }
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 constexpr int s1 = fn12 (1);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
176 constexpr int s2 = fn12 (42); // { dg-message "in .constexpr. expansion of " }
111
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 SA (s1 == 11);