@@ -71,6 +71,13 @@ TEST_CASE("struct encoding of types", "[core][smt2_incremental]")
7171 }
7272}
7373
74+ exprt make_member_name_expression (const irep_idt component_name)
75+ {
76+ exprt result{ID_member_name};
77+ result.set (ID_component_name, component_name);
78+ return result;
79+ }
80+
7481TEST_CASE (" struct encoding of expressions" , " [core][smt2_incremental]" )
7582{
7683 const struct_union_typet::componentst component_types{
@@ -150,6 +157,168 @@ TEST_CASE("struct encoding of expressions", "[core][smt2_incremental]")
150157 REQUIRE (test.struct_encoding .encode (input) == expected);
151158 }
152159 }
160+ SECTION (" with expression producing new struct with substituted member" )
161+ {
162+ SECTION (" First member" )
163+ {
164+ const with_exprt with{
165+ symbol_expr,
166+ make_member_name_expression (" green" ),
167+ from_integer (0 , signedbv_typet{32 })};
168+ const concatenation_exprt expected{
169+ {from_integer (0 , signedbv_typet{32 }),
170+ extractbits_exprt{symbol_expr_as_bv, 39 , 24 , unsignedbv_typet{16 }},
171+ extractbits_exprt{symbol_expr_as_bv, 23 , 0 , signedbv_typet{24 }}},
172+ bv_typet{72 }};
173+ REQUIRE (test.struct_encoding .encode (with) == expected);
174+ }
175+ SECTION (" Second member" )
176+ {
177+ const with_exprt with{
178+ symbol_expr,
179+ make_member_name_expression (" eggs" ),
180+ from_integer (0 , unsignedbv_typet{16 })};
181+ const concatenation_exprt expected{
182+ {extractbits_exprt{symbol_expr_as_bv, 71 , 40 , signedbv_typet{32 }},
183+ from_integer (0 , unsignedbv_typet{16 }),
184+ extractbits_exprt{symbol_expr_as_bv, 23 , 0 , signedbv_typet{24 }}},
185+ bv_typet{72 }};
186+ REQUIRE (test.struct_encoding .encode (with) == expected);
187+ }
188+ SECTION (" Third member" )
189+ {
190+ const with_exprt with{
191+ symbol_expr,
192+ make_member_name_expression (" ham" ),
193+ from_integer (0 , signedbv_typet{24 })};
194+ const concatenation_exprt expected{
195+ {extractbits_exprt{symbol_expr_as_bv, 71 , 40 , signedbv_typet{32 }},
196+ extractbits_exprt{symbol_expr_as_bv, 39 , 24 , unsignedbv_typet{16 }},
197+ from_integer (0 , signedbv_typet{24 })},
198+ bv_typet{72 }};
199+ REQUIRE (test.struct_encoding .encode (with) == expected);
200+ }
201+ SECTION (" First and second members" )
202+ {
203+ const concatenation_exprt expected{
204+ {from_integer (0 , signedbv_typet{32 }),
205+ from_integer (1 , unsignedbv_typet{16 }),
206+ extractbits_exprt{symbol_expr_as_bv, 23 , 0 , signedbv_typet{24 }}},
207+ bv_typet{72 }};
208+ SECTION (" Operands in field order" )
209+ {
210+ with_exprt with_in_order{
211+ symbol_expr,
212+ make_member_name_expression (" green" ),
213+ from_integer (0 , signedbv_typet{32 })};
214+ with_in_order.operands ().push_back (make_member_name_expression (" eggs" ));
215+ with_in_order.operands ().push_back (
216+ from_integer (1 , unsignedbv_typet{16 }));
217+ REQUIRE (test.struct_encoding .encode (with_in_order) == expected);
218+ }
219+ SECTION (" Operands in reverse order vs fields" )
220+ {
221+ with_exprt with_reversed{
222+ symbol_expr,
223+ make_member_name_expression (" eggs" ),
224+ from_integer (1 , unsignedbv_typet{16 })};
225+ with_reversed.operands ().push_back (
226+ make_member_name_expression (" green" ));
227+ with_reversed.operands ().push_back (from_integer (0 , signedbv_typet{32 }));
228+ REQUIRE (test.struct_encoding .encode (with_reversed) == expected);
229+ }
230+ }
231+ SECTION (" First and third members" )
232+ {
233+ const concatenation_exprt expected{
234+ {from_integer (0 , signedbv_typet{32 }),
235+ extractbits_exprt{symbol_expr_as_bv, 39 , 24 , unsignedbv_typet{16 }},
236+ from_integer (1 , signedbv_typet{24 })},
237+ bv_typet{72 }};
238+ SECTION (" Operands in field order" )
239+ {
240+ with_exprt with_in_order{
241+ symbol_expr,
242+ make_member_name_expression (" green" ),
243+ from_integer (0 , signedbv_typet{32 })};
244+ with_in_order.operands ().push_back (make_member_name_expression (" ham" ));
245+ with_in_order.operands ().push_back (from_integer (1 , signedbv_typet{24 }));
246+ REQUIRE (test.struct_encoding .encode (with_in_order) == expected);
247+ }
248+ SECTION (" Operands in reverse order vs fields" )
249+ {
250+ with_exprt with_reversed{
251+ symbol_expr,
252+ make_member_name_expression (" ham" ),
253+ from_integer (1 , signedbv_typet{24 })};
254+ with_reversed.operands ().push_back (
255+ make_member_name_expression (" green" ));
256+ with_reversed.operands ().push_back (from_integer (0 , signedbv_typet{32 }));
257+ REQUIRE (test.struct_encoding .encode (with_reversed) == expected);
258+ }
259+ }
260+ SECTION (" Second and third members" )
261+ {
262+ const concatenation_exprt expected{
263+ {extractbits_exprt{symbol_expr_as_bv, 71 , 40 , signedbv_typet{32 }},
264+ from_integer (0 , unsignedbv_typet{16 }),
265+ from_integer (1 , signedbv_typet{24 })},
266+ bv_typet{72 }};
267+ SECTION (" Operands in field order" )
268+ {
269+ with_exprt with_in_order{
270+ symbol_expr,
271+ make_member_name_expression (" eggs" ),
272+ from_integer (0 , unsignedbv_typet{16 })};
273+ with_in_order.operands ().push_back (make_member_name_expression (" ham" ));
274+ with_in_order.operands ().push_back (from_integer (1 , signedbv_typet{24 }));
275+ REQUIRE (test.struct_encoding .encode (with_in_order) == expected);
276+ }
277+ SECTION (" Operands in reverse order vs fields" )
278+ {
279+ with_exprt with_reversed{
280+ symbol_expr,
281+ make_member_name_expression (" ham" ),
282+ from_integer (1 , signedbv_typet{24 })};
283+ with_reversed.operands ().push_back (make_member_name_expression (" eggs" ));
284+ with_reversed.operands ().push_back (
285+ from_integer (0 , unsignedbv_typet{16 }));
286+ REQUIRE (test.struct_encoding .encode (with_reversed) == expected);
287+ }
288+ }
289+ SECTION (" All members" )
290+ {
291+ const concatenation_exprt expected{
292+ {from_integer (1 , signedbv_typet{32 }),
293+ from_integer (2 , unsignedbv_typet{16 }),
294+ from_integer (3 , signedbv_typet{24 })},
295+ bv_typet{72 }};
296+ SECTION (" Operands in field order" )
297+ {
298+ with_exprt with{
299+ symbol_expr,
300+ make_member_name_expression (" green" ),
301+ from_integer (1 , signedbv_typet{32 })};
302+ with.operands ().push_back (make_member_name_expression (" eggs" ));
303+ with.operands ().push_back (from_integer (2 , unsignedbv_typet{16 }));
304+ with.operands ().push_back (make_member_name_expression (" ham" ));
305+ with.operands ().push_back (from_integer (3 , signedbv_typet{24 }));
306+ REQUIRE (test.struct_encoding .encode (with) == expected);
307+ }
308+ SECTION (" Operands out of order vs fields" )
309+ {
310+ with_exprt with{
311+ symbol_expr,
312+ make_member_name_expression (" eggs" ),
313+ from_integer (2 , unsignedbv_typet{16 })};
314+ with.operands ().push_back (make_member_name_expression (" ham" ));
315+ with.operands ().push_back (from_integer (3 , signedbv_typet{24 }));
316+ with.operands ().push_back (make_member_name_expression (" green" ));
317+ with.operands ().push_back (from_integer (1 , signedbv_typet{32 }));
318+ REQUIRE (test.struct_encoding .encode (with) == expected);
319+ }
320+ }
321+ }
153322}
154323
155324TEST_CASE (
0 commit comments