Skip to content

Commit 660ae90

Browse files
committed
Remove unused parameter from cpp_destructor and fix types
Also configure access control properly for implicit destructor calls.
1 parent 0784f77 commit 660ae90

File tree

4 files changed

+24
-33
lines changed

4 files changed

+24
-33
lines changed

src/cpp/cpp_destructor.cpp

+9-21
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ Author: Daniel Kroening, [email protected]
1818
/// \return typechecked code
1919
codet cpp_typecheckt::cpp_destructor(
2020
const source_locationt &source_location,
21-
const typet &type,
2221
const exprt &object)
2322
{
2423
codet new_code;
@@ -74,8 +73,7 @@ codet cpp_typecheckt::cpp_destructor(
7473
index_exprt index(object, constant);
7574
index.add_source_location()=source_location;
7675

77-
exprt i_code =
78-
cpp_destructor(source_location, tmp_type.subtype(), index);
76+
exprt i_code = cpp_destructor(source_location, index);
7977

8078
new_code.move_to_operands(i_code);
8179
}
@@ -119,29 +117,19 @@ codet cpp_typecheckt::cpp_destructor(
119117
cpp_name.get_sub().back().set(ID_identifier, dtor_name);
120118
cpp_name.get_sub().back().set(ID_C_source_location, source_location);
121119

120+
exprt member(ID_member);
121+
member.add(ID_component_cpp_name) = cpp_name;
122+
member.copy_to_operands(object);
123+
122124
side_effect_expr_function_callt function_call;
123125
function_call.add_source_location()=source_location;
124-
function_call.function().swap(static_cast<exprt&>(cpp_name));
126+
function_call.function().swap(member);
125127

126128
typecheck_side_effect_function_call(function_call);
127-
assert(function_call.get(ID_statement)==ID_temporary_object);
128-
129-
exprt &initializer =
130-
static_cast<exprt &>(function_call.add(ID_initializer));
131-
132-
assert(initializer.id()==ID_code
133-
&& initializer.get(ID_statement)==ID_expression);
134-
135-
side_effect_expr_function_callt &func_ini=
136-
to_side_effect_expr_function_call(initializer.op0());
137-
138-
exprt &tmp_this=func_ini.arguments().front();
139-
assert(tmp_this.id()==ID_address_of
140-
&& tmp_this.op0().id()=="new_object");
141-
142-
tmp_this=address_of_exprt(object, pointer_type(object.type()));
129+
already_typechecked(function_call);
143130

144-
new_code.swap(initializer);
131+
new_code = code_expressiont(function_call);
132+
new_code.add_source_location() = source_location;
145133
}
146134

147135
return new_code;

src/cpp/cpp_typecheck.h

-1
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,6 @@ class cpp_typecheckt:public c_typecheck_baset
432432

433433
codet cpp_destructor(
434434
const source_locationt &source_location,
435-
const typet &type,
436435
const exprt &object);
437436

438437
// expressions

src/cpp/cpp_typecheck_destructor.cpp

+15-10
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ Author: Daniel Kroening, [email protected]
1111

1212
#include "cpp_typecheck.h"
1313

14+
#include <util/c_types.h>
15+
1416
bool cpp_typecheckt::find_dtor(const symbolt &symbol) const
1517
{
1618
const irept &components=
@@ -134,13 +136,16 @@ codet cpp_typecheckt::dtor(const symbolt &symbol)
134136
cpp_namet cppname;
135137
cppname.get_sub().push_back(name);
136138

137-
exprt member(ID_ptrmember);
139+
exprt member(ID_ptrmember, type);
138140
member.set(ID_component_cpp_name, cppname);
139-
member.operands().push_back(exprt("cpp-this"));
141+
member.operands().push_back(
142+
symbol_exprt(ID_this, pointer_type(symbol.type)));
140143
member.add_source_location() = source_location;
141144

142-
codet dtor_code=
143-
cpp_destructor(source_location, cit->type(), member);
145+
const bool disabled_access_control = disable_access_control;
146+
disable_access_control = true;
147+
codet dtor_code = cpp_destructor(source_location, member);
148+
disable_access_control = disabled_access_control;
144149

145150
if(dtor_code.is_not_nil())
146151
block.move_to_operands(dtor_code);
@@ -158,14 +163,14 @@ codet cpp_typecheckt::dtor(const symbolt &symbol)
158163
assert(bit->find(ID_type).id()==ID_symbol);
159164
const symbolt &psymb = lookup(bit->find(ID_type).get(ID_identifier));
160165

161-
// TODO(tautschnig): object is not type checked before passing it to
162-
// cpp_destructor even though cpp_destructor makes heavy use of the .type()
163-
// member
164-
dereference_exprt object(exprt("cpp-this"), nil_typet());
166+
symbol_exprt this_ptr(ID_this, pointer_type(symbol.type));
167+
dereference_exprt object(this_ptr, psymb.type);
165168
object.add_source_location() = source_location;
166169

167-
exprt dtor_code =
168-
cpp_destructor(source_location, psymb.type, object);
170+
const bool disabled_access_control = disable_access_control;
171+
disable_access_control = true;
172+
exprt dtor_code = cpp_destructor(source_location, object);
173+
disable_access_control = disabled_access_control;
169174

170175
if(dtor_code.is_not_nil())
171176
block.move_to_operands(dtor_code);

src/cpp/cpp_typecheck_expr.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -1073,7 +1073,6 @@ void cpp_typecheckt::typecheck_expr_delete(exprt &expr)
10731073

10741074
codet destructor_code=cpp_destructor(
10751075
expr.source_location(),
1076-
pointer_type.subtype(),
10771076
new_object);
10781077

10791078
// this isn't typechecked yet

0 commit comments

Comments
 (0)