@@ -99,31 +99,13 @@ void goto_convertt::remove_assignment(
99
99
100
100
const typet &op0_type = expr.op0 ().type ();
101
101
102
- if (op0_type.id ()==ID_c_bool)
103
- {
104
- // C/C++ Booleans get very special treatment.
105
- binary_exprt tmp (expr.op0 (), new_id, expr.op1 (), expr.op1 ().type ());
106
- tmp.op0 ().make_typecast (expr.op1 ().type ());
107
- rhs=typecast_exprt (is_not_zero (tmp, ns), expr.op0 ().type ());
108
- }
109
- else if (op0_type.id () == ID_c_enum_tag)
110
- {
111
- // We convert c_enums to their underlying type, do the
112
- // operation, and then convert back
113
- const auto &enum_type = ns.follow_tag (to_c_enum_tag_type (op0_type));
114
- auto underlying_type = enum_type.subtype ();
115
- auto op0 = typecast_exprt (expr.op0 (), underlying_type);
116
- auto op1 = typecast_exprt (expr.op1 (), underlying_type);
117
- binary_exprt tmp (op0, new_id, op1, underlying_type);
118
- rhs = typecast_exprt (tmp, expr.op0 ().type ());
119
- }
120
- else
121
- {
122
- rhs.id (new_id);
123
- rhs.copy_to_operands (expr.op0 (), expr.op1 ());
124
- rhs.type ()=expr.op0 ().type ();
125
- rhs.add_source_location ()=expr.source_location ();
126
- }
102
+ PRECONDITION (
103
+ op0_type.id () != ID_c_enum_tag && op0_type.id () != ID_c_enum &&
104
+ op0_type.id () != ID_c_bool && op0_type.id () != ID_bool);
105
+ rhs.id (new_id);
106
+ rhs.copy_to_operands (expr.op0 (), expr.op1 ());
107
+ rhs.type () = expr.op0 ().type ();
108
+ rhs.add_source_location () = expr.source_location ();
127
109
128
110
code_assignt assignment (expr.op0 (), rhs);
129
111
assignment.add_source_location ()=expr.source_location ();
@@ -171,45 +153,34 @@ void goto_convertt::remove_pre(
171
153
172
154
const typet &op_type = expr.op0 ().type ();
173
155
174
- if (op_type.id ()==ID_bool)
175
- {
176
- rhs.copy_to_operands (expr.op0 (), from_integer (1 , signed_int_type ()));
177
- rhs.op0 ().make_typecast (signed_int_type ());
178
- rhs.type ()=signed_int_type ();
179
- rhs=is_not_zero (rhs, ns);
180
- }
181
- else if (op_type.id ()==ID_c_bool)
156
+ PRECONDITION (
157
+ op_type.id () != ID_c_enum_tag && op_type.id () != ID_c_enum &&
158
+ op_type.id () != ID_c_bool && op_type.id () != ID_bool);
159
+
160
+ typet constant_type;
161
+
162
+ if (op_type.id () == ID_pointer)
163
+ constant_type = index_type ();
164
+ else if (is_number (op_type))
165
+ constant_type = op_type;
166
+ else
182
167
{
183
- rhs.copy_to_operands (expr.op0 (), from_integer (1 , signed_int_type ()));
184
- rhs.op0 ().make_typecast (signed_int_type ());
185
- rhs.type ()=signed_int_type ();
186
- rhs=is_not_zero (rhs, ns);
187
- rhs.make_typecast (op_type);
168
+ UNREACHABLE;
188
169
}
189
- else if (op_type.id ()==ID_c_enum ||
190
- op_type.id ()==ID_c_enum_tag)
170
+
171
+ exprt constant;
172
+
173
+ if (constant_type.id () == ID_complex)
191
174
{
192
- rhs.copy_to_operands (expr.op0 (), from_integer (1 , signed_int_type ()));
193
- rhs.op0 ().make_typecast (signed_int_type ());
194
- rhs.type ()=signed_int_type ();
195
- rhs.make_typecast (op_type);
175
+ exprt real = from_integer (1 , constant_type.subtype ());
176
+ exprt imag = from_integer (0 , constant_type.subtype ());
177
+ constant = complex_exprt (real, imag, to_complex_type (constant_type));
196
178
}
197
179
else
198
- {
199
- typet constant_type;
200
-
201
- if (op_type.id ()==ID_pointer)
202
- constant_type=index_type ();
203
- else if (is_number (op_type) || op_type.id ()==ID_c_bool)
204
- constant_type=op_type;
205
- else
206
- {
207
- UNREACHABLE;
208
- }
180
+ constant = from_integer (1 , constant_type);
209
181
210
- rhs.add_to_operands (expr.op0 (), from_integer (1 , constant_type));
211
- rhs.type ()=expr.op0 ().type ();
212
- }
182
+ rhs.add_to_operands (expr.op0 (), std::move (constant));
183
+ rhs.type () = expr.op0 ().type ();
213
184
214
185
code_assignt assignment (expr.op0 (), rhs);
215
186
assignment.add_source_location ()=expr.find_source_location ();
@@ -257,56 +228,34 @@ void goto_convertt::remove_post(
257
228
258
229
const typet &op_type = expr.op0 ().type ();
259
230
260
- if (op_type.id ()==ID_bool)
261
- {
262
- rhs.copy_to_operands (expr.op0 (), from_integer (1 , signed_int_type ()));
263
- rhs.op0 ().make_typecast (signed_int_type ());
264
- rhs.type ()=signed_int_type ();
265
- rhs=is_not_zero (rhs, ns);
266
- }
267
- else if (op_type.id ()==ID_c_bool)
231
+ PRECONDITION (
232
+ op_type.id () != ID_c_enum_tag && op_type.id () != ID_c_enum &&
233
+ op_type.id () != ID_c_bool && op_type.id () != ID_bool);
234
+
235
+ typet constant_type;
236
+
237
+ if (op_type.id () == ID_pointer)
238
+ constant_type = index_type ();
239
+ else if (is_number (op_type))
240
+ constant_type = op_type;
241
+ else
268
242
{
269
- rhs.copy_to_operands (expr.op0 (), from_integer (1 , signed_int_type ()));
270
- rhs.op0 ().make_typecast (signed_int_type ());
271
- rhs.type ()=signed_int_type ();
272
- rhs=is_not_zero (rhs, ns);
273
- rhs.make_typecast (op_type);
243
+ UNREACHABLE;
274
244
}
275
- else if (op_type.id ()==ID_c_enum ||
276
- op_type.id ()==ID_c_enum_tag)
245
+
246
+ exprt constant;
247
+
248
+ if (constant_type.id () == ID_complex)
277
249
{
278
- rhs.copy_to_operands (expr.op0 (), from_integer (1 , signed_int_type ()));
279
- rhs.op0 ().make_typecast (signed_int_type ());
280
- rhs.type ()=signed_int_type ();
281
- rhs.make_typecast (op_type);
250
+ exprt real = from_integer (1 , constant_type.subtype ());
251
+ exprt imag = from_integer (0 , constant_type.subtype ());
252
+ constant = complex_exprt (real, imag, to_complex_type (constant_type));
282
253
}
283
254
else
284
- {
285
- typet constant_type;
255
+ constant = from_integer (1 , constant_type);
286
256
287
- if (op_type.id ()==ID_pointer)
288
- constant_type=index_type ();
289
- else if (is_number (op_type) || op_type.id ()==ID_c_bool)
290
- constant_type=op_type;
291
- else
292
- {
293
- UNREACHABLE;
294
- }
295
-
296
- exprt constant;
297
-
298
- if (constant_type.id ()==ID_complex)
299
- {
300
- exprt real=from_integer (1 , constant_type.subtype ());
301
- exprt imag=from_integer (0 , constant_type.subtype ());
302
- constant=complex_exprt (real, imag, to_complex_type (constant_type));
303
- }
304
- else
305
- constant=from_integer (1 , constant_type);
306
-
307
- rhs.add_to_operands (expr.op0 (), std::move (constant));
308
- rhs.type ()=expr.op0 ().type ();
309
- }
257
+ rhs.add_to_operands (expr.op0 (), std::move (constant));
258
+ rhs.type () = expr.op0 ().type ();
310
259
311
260
code_assignt assignment (expr.op0 (), rhs);
312
261
assignment.add_source_location ()=expr.find_source_location ();
0 commit comments