@@ -73,15 +73,17 @@ bool cpp_typecheckt::standard_conversion_array_to_pointer(
7373{
7474 assert (expr.type ().id ()==ID_array);
7575
76- exprt index (ID_index, expr.type ().subtype ());
77- index.copy_to_operands (expr, from_integer (0 , index_type ()));
76+ index_exprt index (
77+ expr,
78+ from_integer (0 , index_type ()),
79+ expr.type ().subtype ());
80+
7881 index.set (ID_C_lvalue, true );
7982
80- pointer_typet pointer;
81- pointer. subtype ()= expr.type ().subtype ();
83+ pointer_typet pointer=
84+ pointer_type ( expr.type ().subtype () );
8285
83- new_expr=exprt (ID_address_of, pointer);
84- new_expr.move_to_operands (index);
86+ new_expr=address_of_exprt (index, pointer);
8587
8688 return true ;
8789}
@@ -101,12 +103,9 @@ bool cpp_typecheckt::standard_conversion_function_to_pointer(
101103 if (!expr.get_bool (ID_C_lvalue))
102104 return false ;
103105
104- pointer_typet pointer;
105- pointer.subtype ()=func_type;
106+ pointer_typet pointer=pointer_type (func_type);
106107
107- new_expr=exprt (ID_address_of);
108- new_expr.copy_to_operands (expr);
109- new_expr.type ()=pointer;
108+ new_expr=address_of_exprt (expr, pointer);
110109
111110 return true ;
112111}
@@ -887,16 +886,13 @@ bool cpp_typecheckt::user_defined_conversion_sequence(
887886
888887 if (subtype_typecast (from_struct, to_struct))
889888 {
890- exprt address (ID_address_of, pointer_typet ());
891- address.copy_to_operands (expr);
892- address.type ().subtype ()=expr.type ();
889+ exprt address=address_of_exprt (expr, pointer_type (expr.type ()));
893890
894891 // simplify address
895892 if (expr.id ()==ID_dereference)
896893 address=expr.op0 ();
897894
898- pointer_typet ptr_sub;
899- ptr_sub.subtype ()=type;
895+ pointer_typet ptr_sub=pointer_type (type);
900896 c_qualifierst qual_from;
901897 qual_from.read (expr.type ());
902898 qual_from.write (ptr_sub.subtype ());
@@ -1019,62 +1015,60 @@ bool cpp_typecheckt::user_defined_conversion_sequence(
10191015 }
10201016 else if (from_struct.is_not_nil () && arg1_struct.is_not_nil ())
10211017 {
1022- // try derived-to-base conversion
1023- exprt expr_pfrom (ID_address_of, pointer_typet ());
1024- expr_pfrom.type ().subtype ()=expr.type ();
1025- expr_pfrom.copy_to_operands (expr);
1026-
1027- pointer_typet pto;
1028- pto.subtype ()=arg1_type;
1029-
1030- exprt expr_ptmp;
1031- tmp_rank=0 ;
1032- if (standard_conversion_sequence (
1033- expr_pfrom, pto, expr_ptmp, tmp_rank))
1018+ // try derived-to-base conversion
1019+ exprt expr_pfrom=
1020+ address_of_exprt (expr, pointer_type (expr.type ()));
1021+
1022+ pointer_typet pto=pointer_type (arg1_type);
1023+
1024+ exprt expr_ptmp;
1025+ tmp_rank=0 ;
1026+ if (standard_conversion_sequence (
1027+ expr_pfrom, pto, expr_ptmp, tmp_rank))
1028+ {
1029+ // check if it's ambiguous
1030+ if (found)
1031+ return false ;
1032+ found=true ;
1033+
1034+ rank+=tmp_rank;
1035+
1036+ // create temporary object
1037+ exprt expr_deref=
1038+ exprt (ID_dereference, expr_ptmp.type ().subtype ());
1039+ expr_deref.set (ID_C_lvalue, true );
1040+ expr_deref.copy_to_operands (expr_ptmp);
1041+ expr_deref.add_source_location ()=expr.source_location ();
1042+
1043+ exprt new_object (" new_object" , type);
1044+ new_object.set (ID_C_lvalue, true );
1045+ new_object.type ().set (ID_C_constant, false );
1046+
1047+ exprt func_symb=cpp_symbol_expr (lookup (component.get (ID_name)));
1048+ func_symb.type ()=comp_type;
10341049 {
1035- // check if it's ambiguous
1036- if (found)
1037- return false ;
1038- found=true ;
1039-
1040- rank+=tmp_rank;
1041-
1042- // create temporary object
1043- exprt expr_deref=
1044- exprt (ID_dereference, expr_ptmp.type ().subtype ());
1045- expr_deref.set (ID_C_lvalue, true );
1046- expr_deref.copy_to_operands (expr_ptmp);
1047- expr_deref.add_source_location ()=expr.source_location ();
1048-
1049- exprt new_object (" new_object" , type);
1050- new_object.set (ID_C_lvalue, true );
1051- new_object.type ().set (ID_C_constant, false );
1052-
1053- exprt func_symb=cpp_symbol_expr (lookup (component.get (ID_name)));
1054- func_symb.type ()=comp_type;
1055- {
1056- exprt tmp (" already_typechecked" );
1057- tmp.copy_to_operands (func_symb);
1058- func_symb.swap (func_symb);
1059- }
1060-
1061- side_effect_expr_function_callt ctor_expr;
1062- ctor_expr.add_source_location ()=expr.source_location ();
1063- ctor_expr.function ().swap (func_symb);
1064- ctor_expr.arguments ().push_back (expr_deref);
1065- typecheck_side_effect_function_call (ctor_expr);
1066-
1067- new_expr.swap (ctor_expr);
1068-
1069- assert (new_expr.get (ID_statement)==ID_temporary_object);
1070-
1071- if (to.get_bool (ID_C_constant))
1072- new_expr.type ().set (ID_C_constant, true );
1050+ exprt tmp (" already_typechecked" );
1051+ tmp.copy_to_operands (func_symb);
1052+ func_symb.swap (func_symb);
10731053 }
1054+
1055+ side_effect_expr_function_callt ctor_expr;
1056+ ctor_expr.add_source_location ()=expr.source_location ();
1057+ ctor_expr.function ().swap (func_symb);
1058+ ctor_expr.arguments ().push_back (expr_deref);
1059+ typecheck_side_effect_function_call (ctor_expr);
1060+
1061+ new_expr.swap (ctor_expr);
1062+
1063+ assert (new_expr.get (ID_statement)==ID_temporary_object);
1064+
1065+ if (to.get_bool (ID_C_constant))
1066+ new_expr.type ().set (ID_C_constant, true );
10741067 }
10751068 }
1076- if (found)
1077- return true ;
1069+ }
1070+ if (found)
1071+ return true ;
10781072 }
10791073 }
10801074
@@ -1297,9 +1291,8 @@ bool cpp_typecheckt::reference_binding(
12971291 address_of_exprt tmp;
12981292 tmp.add_source_location ()=expr.source_location ();
12991293 tmp.object ()=expr;
1300- tmp.type ()=pointer_typet ( );
1294+ tmp.type ()=pointer_type (tmp. op0 (). type () );
13011295 tmp.type ().set (ID_C_reference, true );
1302- tmp.type ().subtype ()=tmp.op0 ().type ();
13031296 new_expr.swap (tmp);
13041297 }
13051298
@@ -1427,10 +1420,9 @@ bool cpp_typecheckt::reference_binding(
14271420 if (user_defined_conversion_sequence (arg_expr, type.subtype (), new_expr, rank))
14281421 {
14291422 address_of_exprt tmp;
1430- tmp.type ()=pointer_typet ( );
1423+ tmp.type ()=pointer_type (new_expr. type () );
14311424 tmp.object ()=new_expr;
14321425 tmp.type ().set (ID_C_reference, true );
1433- tmp.type ().subtype ()= new_expr.type ();
14341426 tmp.add_source_location ()=new_expr.source_location ();
14351427 new_expr.swap (tmp);
14361428 return true ;
@@ -1449,11 +1441,11 @@ bool cpp_typecheckt::reference_binding(
14491441 new_expr.swap (tmp);
14501442 }
14511443
1452- exprt tmp (ID_address_of, pointer_typet ());
1453- tmp. copy_to_operands (new_expr);
1444+ exprt tmp=
1445+ address_of_exprt (new_expr, pointer_type (new_expr. type ()) );
14541446 tmp.type ().set (ID_C_reference, true );
1455- tmp.type ().subtype ()= new_expr.type ();
14561447 tmp.add_source_location ()=new_expr.source_location ();
1448+
14571449 new_expr.swap (tmp);
14581450 return true ;
14591451 }
@@ -1880,9 +1872,7 @@ bool cpp_typecheckt::reinterpret_typecast(
18801872
18811873 if (is_reference (type) && e.get_bool (ID_C_lvalue))
18821874 {
1883- exprt tmp (ID_address_of, pointer_typet ());
1884- tmp.type ().subtype ()=e.type ();
1885- tmp.copy_to_operands (e);
1875+ exprt tmp=address_of_exprt (e, pointer_type (e.type ()));
18861876 tmp.make_typecast (type);
18871877 new_expr.swap (tmp);
18881878 return true ;
@@ -1946,10 +1936,8 @@ bool cpp_typecheckt::static_typecast(
19461936 return true ;
19471937 }
19481938
1949- exprt address_of (ID_address_of, pointer_typet ());
1950- address_of.type ().subtype ()=e.type ();
1951- address_of.copy_to_operands (e);
1952- make_ptr_typecast (address_of , type);
1939+ exprt address_of=address_of_exprt (e, pointer_type (e.type ()));
1940+ make_ptr_typecast (address_of, type);
19531941 new_expr.swap (address_of);
19541942 return true ;
19551943 }
0 commit comments