Skip to content

Commit 5f12ab4

Browse files
committed
C++ front-end: use new symbolt constructors
To the extent possible, apply resource-acquisition-is-initialisation. The constructors ensure that at least the most essential fields (name, type, mode) are set.
1 parent 219f11b commit 5f12ab4

8 files changed

+33
-85
lines changed

src/cpp/cpp_declarator_converter.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -442,18 +442,17 @@ symbolt &cpp_declarator_convertert::convert_new_symbol(
442442
{
443443
irep_idt pretty_name=get_pretty_name();
444444

445-
symbolt symbol;
446-
447-
symbol.name=final_identifier;
445+
symbolt symbol{
446+
final_identifier,
447+
final_type,
448+
linkage_spec == ID_auto ? ID_cpp : linkage_spec};
448449
symbol.base_name=base_name;
449450
symbol.value=declarator.value();
450451
symbol.location=declarator.name().source_location();
451452
symbol.is_extern = storage_spec.is_extern();
452453
symbol.is_parameter = declarator.get_is_parameter();
453454
symbol.is_weak = storage_spec.is_weak();
454-
symbol.mode=linkage_spec==ID_auto?ID_cpp:linkage_spec;
455455
symbol.module=cpp_typecheck.module;
456-
symbol.type=final_type;
457456
symbol.is_type=is_typedef;
458457
symbol.is_macro=is_typedef && !is_template_parameter;
459458
symbol.pretty_name=pretty_name;

src/cpp/cpp_instantiate_template.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,9 @@ const symbolt &cpp_typecheckt::class_template_symbol(
182182

183183
// Create as incomplete struct, but mark as
184184
// "template_class_instance", to be elaborated later.
185-
symbolt new_symbol;
186-
new_symbol.name=identifier;
185+
type_symbolt new_symbol{identifier, struct_typet(), template_symbol.mode};
187186
new_symbol.pretty_name=template_symbol.pretty_name;
188187
new_symbol.location=template_symbol.location;
189-
new_symbol.type = struct_typet();
190188
to_struct_type(new_symbol.type).make_incomplete();
191189
new_symbol.type.set(ID_tag, template_symbol.type.find(ID_tag));
192190
if(template_symbol.type.get_bool(ID_C_class))
@@ -197,9 +195,7 @@ const symbolt &cpp_typecheckt::class_template_symbol(
197195
ID_specialization_template_args, specialization_template_args);
198196
new_symbol.type.set(ID_full_template_args, full_template_args);
199197
new_symbol.type.set(ID_identifier, template_symbol.name);
200-
new_symbol.mode=template_symbol.mode;
201198
new_symbol.base_name=template_symbol.base_name;
202-
new_symbol.is_type=true;
203199

204200
symbolt *s_ptr;
205201
symbol_table.move(new_symbol, s_ptr);

src/cpp/cpp_typecheck.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -201,16 +201,13 @@ void cpp_typecheckt::static_and_dynamic_initialization()
201201
dynamic_initializations.clear();
202202

203203
// Create the dynamic initialization procedure
204-
symbolt init_symbol;
205-
206-
init_symbol.name="#cpp_dynamic_initialization#"+id2string(module);
204+
symbolt init_symbol{
205+
"#cpp_dynamic_initialization#" + id2string(module),
206+
code_typet({}, typet(ID_constructor)),
207+
ID_cpp};
207208
init_symbol.base_name="#cpp_dynamic_initialization#"+id2string(module);
208209
init_symbol.value.swap(init_block);
209-
init_symbol.mode=ID_cpp;
210210
init_symbol.module=module;
211-
init_symbol.type = code_typet({}, typet(ID_constructor));
212-
init_symbol.is_type=false;
213-
init_symbol.is_macro=false;
214211

215212
symbol_table.insert(std::move(init_symbol));
216213

src/cpp/cpp_typecheck_compound_type.cpp

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -228,17 +228,10 @@ void cpp_typecheckt::typecheck_compound_type(
228228
else
229229
{
230230
// produce new symbol
231-
symbolt symbol;
232-
233-
symbol.name=symbol_name;
231+
type_symbolt symbol{symbol_name, type, ID_cpp};
234232
symbol.base_name=base_name;
235-
symbol.value.make_nil();
236233
symbol.location=type.source_location();
237-
symbol.mode=ID_cpp;
238234
symbol.module=module;
239-
symbol.type.swap(type);
240-
symbol.is_type=true;
241-
symbol.is_macro=false;
242235
symbol.pretty_name=
243236
cpp_scopes.current_scope().prefix+
244237
id2string(symbol.base_name)+
@@ -576,16 +569,12 @@ void cpp_typecheckt::typecheck_compound_declarator(
576569
if(!symbol_table.has_symbol(vt_name))
577570
{
578571
// first time: create a virtual-table symbol type
579-
symbolt vt_symb_type;
580-
vt_symb_type.name= vt_name;
572+
type_symbolt vt_symb_type{vt_name, struct_typet(), ID_cpp};
581573
vt_symb_type.base_name="virtual_table::"+id2string(symbol.base_name);
582574
vt_symb_type.pretty_name=vt_symb_type.base_name;
583-
vt_symb_type.mode=ID_cpp;
584575
vt_symb_type.module=module;
585576
vt_symb_type.location=symbol.location;
586-
vt_symb_type.type=struct_typet();
587577
vt_symb_type.type.set(ID_name, vt_symb_type.name);
588-
vt_symb_type.is_type=true;
589578

590579
const bool failed=!symbol_table.insert(std::move(vt_symb_type)).second;
591580
CHECK_RETURN(!failed);
@@ -625,15 +614,14 @@ void cpp_typecheckt::typecheck_compound_declarator(
625614
irep_idt virtual_base=*virtual_bases.begin();
626615

627616
// a new function that does 'late casting' of the 'this' parameter
628-
symbolt func_symb;
629-
func_symb.name=
630-
id2string(component.get_name())+"::"+id2string(virtual_base);
617+
symbolt func_symb{
618+
id2string(component.get_name()) + "::" + id2string(virtual_base),
619+
component.type(),
620+
symbol.mode};
631621
func_symb.base_name = component.get_base_name();
632622
func_symb.pretty_name = component.get_base_name();
633-
func_symb.mode = symbol.mode;
634623
func_symb.module=module;
635624
func_symb.location=component.source_location();
636-
func_symb.type=component.type();
637625

638626
// change the type of the 'this' pointer
639627
code_typet &code_type=to_code_type(func_symb.type);
@@ -652,14 +640,13 @@ void cpp_typecheckt::typecheck_compound_declarator(
652640
if(param_base_name.empty())
653641
param_base_name = "arg" + std::to_string(i++);
654642

655-
symbolt arg_symb;
656-
arg_symb.name =
657-
id2string(func_symb.name) + "::" + id2string(param_base_name);
643+
symbolt arg_symb{
644+
id2string(func_symb.name) + "::" + id2string(param_base_name),
645+
arg.type(),
646+
symbol.mode};
658647
arg_symb.base_name = param_base_name;
659648
arg_symb.pretty_name = param_base_name;
660-
arg_symb.mode = symbol.mode;
661649
arg_symb.location=func_symb.location;
662-
arg_symb.type=arg.type();
663650

664651
arg.set_identifier(arg_symb.name);
665652

@@ -724,10 +711,7 @@ void cpp_typecheckt::typecheck_compound_declarator(
724711
if(is_static && !is_method) // static non-method member
725712
{
726713
// add as global variable to symbol_table
727-
symbolt static_symbol;
728-
static_symbol.mode=symbol.mode;
729-
static_symbol.name=identifier;
730-
static_symbol.type=component.type();
714+
symbolt static_symbol{identifier, component.type(), symbol.mode};
731715
static_symbol.base_name = component.get_base_name();
732716
static_symbol.is_lvalue=true;
733717
static_symbol.is_static_lifetime=true;
@@ -1281,8 +1265,6 @@ void cpp_typecheckt::typecheck_member_function(
12811265
const typet &method_qualifier,
12821266
exprt &value)
12831267
{
1284-
symbolt symbol;
1285-
12861268
code_typet &type = to_code_type(component.type());
12871269

12881270
if(component.get_bool(ID_is_static))
@@ -1321,14 +1303,10 @@ void cpp_typecheckt::typecheck_member_function(
13211303
if(value.is_not_nil())
13221304
to_code_type(type).set_inlined(true);
13231305

1324-
symbol.name=identifier;
1306+
symbolt symbol{identifier, type, compound_symbol.mode};
13251307
symbol.base_name=component.get_base_name();
13261308
symbol.value.swap(value);
1327-
symbol.mode = compound_symbol.mode;
13281309
symbol.module=module;
1329-
symbol.type=type;
1330-
symbol.is_type=false;
1331-
symbol.is_macro=false;
13321310
symbol.location=component.source_location();
13331311

13341312
// move early, it must be visible before doing any value

src/cpp/cpp_typecheck_enum_type.cpp

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,15 @@ void cpp_typecheckt::typecheck_enum_body(symbolt &enum_symbol)
5151
exprt value_expr = from_integer(i, c_enum_type.underlying_type());
5252
value_expr.type()=enum_tag_type; // override type
5353

54-
symbolt symbol;
55-
56-
symbol.name=id2string(enum_symbol.name)+"::"+id2string(name);
54+
symbolt symbol{
55+
id2string(enum_symbol.name) + "::" + id2string(name),
56+
enum_tag_type,
57+
enum_symbol.mode};
5758
symbol.base_name=name;
5859
symbol.value=value_expr;
5960
symbol.location = static_cast<const source_locationt &>(
6061
component.find(ID_C_source_location));
61-
symbol.mode = enum_symbol.mode;
6262
symbol.module=module;
63-
symbol.type=enum_tag_type;
64-
symbol.is_type=false;
6563
symbol.is_macro=true;
6664
symbol.is_file_local = true;
6765
symbol.is_thread_local = true;
@@ -167,17 +165,11 @@ void cpp_typecheckt::typecheck_enum_type(typet &type)
167165
}
168166
}
169167

170-
symbolt symbol;
171-
172-
symbol.name=symbol_name;
168+
type_symbolt symbol{symbol_name, type, ID_cpp};
173169
symbol.base_name=base_name;
174170
symbol.value.make_nil();
175171
symbol.location=type.source_location();
176-
symbol.mode=ID_cpp;
177172
symbol.module=module;
178-
symbol.type.swap(type);
179-
symbol.is_type=true;
180-
symbol.is_macro=false;
181173
symbol.pretty_name=pretty_name;
182174

183175
// move early, must be visible before doing body

src/cpp/cpp_typecheck_namespace.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,10 @@ void cpp_typecheckt::convert(cpp_namespace_spect &namespace_spec)
6161
}
6262
else
6363
{
64-
symbolt symbol;
65-
66-
symbol.name=identifier;
64+
symbolt symbol{identifier, typet(ID_namespace), ID_cpp};
6765
symbol.base_name=final_name;
68-
symbol.value.make_nil();
6966
symbol.location=namespace_spec.source_location();
70-
symbol.mode=ID_cpp;
7167
symbol.module=module;
72-
symbol.type=typet(ID_namespace);
7368

7469
if(!symbol_table.insert(std::move(symbol)).second)
7570
{

src/cpp/cpp_typecheck_template.cpp

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -166,15 +166,11 @@ void cpp_typecheckt::typecheck_class_template(
166166

167167
// it's not there yet
168168

169-
symbolt symbol;
170-
171-
symbol.name=symbol_name;
169+
symbolt symbol{symbol_name, typet{}, ID_cpp};
172170
symbol.base_name=base_name;
173171
symbol.location=cpp_name.source_location();
174-
symbol.mode=ID_cpp;
175172
symbol.module=module;
176173
symbol.type.swap(declaration);
177-
symbol.is_macro=false;
178174
symbol.value = exprt(ID_template_decls);
179175

180176
symbol.pretty_name=
@@ -274,14 +270,10 @@ void cpp_typecheckt::typecheck_function_template(
274270
return;
275271
}
276272

277-
symbolt symbol;
278-
symbol.name=symbol_name;
273+
symbolt symbol{symbol_name, typet{}, ID_cpp};
279274
symbol.base_name=base_name;
280275
symbol.location=cpp_name.source_location();
281-
symbol.mode=ID_cpp;
282276
symbol.module=module;
283-
symbol.value.make_nil();
284-
285277
symbol.type.swap(declaration);
286278
symbol.pretty_name=
287279
cpp_scopes.current_scope().prefix+id2string(symbol.base_name);

src/cpp/cpp_typecheck_virtual_table.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,14 @@ void cpp_typecheckt::do_virtual_table(const symbolt &symbol)
6767
const symbolt &vt_symb_type =
6868
lookup("virtual_table::" + id2string(late_cast_symb.name));
6969

70-
symbolt vt_symb_var;
71-
vt_symb_var.name=
72-
id2string(vt_symb_type.name) + "@"+ id2string(symbol.name);
70+
symbolt vt_symb_var{
71+
id2string(vt_symb_type.name) + "@" + id2string(symbol.name),
72+
struct_tag_typet(vt_symb_type.name),
73+
symbol.mode};
7374
vt_symb_var.base_name=
7475
id2string(vt_symb_type.base_name) + "@" + id2string(symbol.base_name);
75-
vt_symb_var.mode = symbol.mode;
7676
vt_symb_var.module=module;
7777
vt_symb_var.location=vt_symb_type.location;
78-
vt_symb_var.type = struct_tag_typet(vt_symb_type.name);
7978
vt_symb_var.is_lvalue=true;
8079
vt_symb_var.is_static_lifetime=true;
8180

0 commit comments

Comments
 (0)