Skip to content

Commit 90d5651

Browse files
committed
C++ front-end: put "this" parameter in the symbol table
The "this" parameter must carry a unique name for each class and must be stored in the symbol table.
1 parent 42efbd7 commit 90d5651

File tree

3 files changed

+9
-3
lines changed

3 files changed

+9
-3
lines changed

src/cpp/cpp_declarator_converter.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,15 @@ symbolt &cpp_declarator_convertert::convert(
104104
{
105105
// adjust type if it's a non-static member function
106106
if(final_type.id()==ID_code)
107+
{
108+
cpp_save_scopet save_scope(cpp_typecheck.cpp_scopes);
109+
cpp_typecheck.cpp_scopes.go_to(*scope);
110+
107111
cpp_typecheck.add_this_to_method_type(
108112
cpp_typecheck.lookup(scope->identifier),
109113
to_code_type(final_type),
110114
method_qualifier);
115+
}
111116

112117
get_final_identifier();
113118

src/cpp/cpp_typecheck_compound_type.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -1360,9 +1360,10 @@ void cpp_typecheckt::add_this_to_method_type(
13601360
subtype.set(ID_C_volatile, true);
13611361

13621362
code_typet::parametert parameter(pointer_type(subtype));
1363-
parameter.set_identifier(ID_this); // check? Not qualified
1363+
parameter.set_identifier(ID_this);
13641364
parameter.set_base_name(ID_this);
13651365
parameter.set_this();
1366+
convert_parameter(compound_symbol.mode, parameter);
13661367

13671368
code_typet::parameterst &parameters = type.parameters();
13681369
parameters.insert(parameters.begin(), parameter);

src/cpp/cpp_typecheck_function.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ void cpp_typecheckt::convert_parameter(
3131
parameter.set_base_name(base_name);
3232
}
3333

34+
PRECONDITION(!cpp_scopes.current_scope().prefix.empty());
3435
irep_idt identifier=cpp_scopes.current_scope().prefix+
3536
id2string(base_name);
3637

@@ -171,8 +172,7 @@ irep_idt cpp_typecheckt::function_identifier(const typet &type)
171172
code_typet::parameterst::const_iterator it=
172173
parameters.begin();
173174

174-
if(it!=parameters.end() &&
175-
it->get_identifier()==ID_this)
175+
if(it != parameters.end() && it->get_base_name() == ID_this)
176176
{
177177
const typet &pointer=it->type();
178178
const typet &symbol =pointer.subtype();

0 commit comments

Comments
 (0)