Skip to content

Commit 6ac16bf

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 48c7e91 commit 6ac16bf

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
@@ -443,18 +443,17 @@ symbolt &cpp_declarator_convertert::convert_new_symbol(
443443
{
444444
irep_idt pretty_name=get_pretty_name();
445445

446-
symbolt symbol;
447-
448-
symbol.name=final_identifier;
446+
symbolt symbol{
447+
final_identifier,
448+
final_type,
449+
linkage_spec == ID_auto ? ID_cpp : linkage_spec};
449450
symbol.base_name=base_name;
450451
symbol.value=declarator.value();
451452
symbol.location=declarator.name().source_location();
452453
symbol.is_extern = storage_spec.is_extern();
453454
symbol.is_parameter = declarator.get_is_parameter();
454455
symbol.is_weak = storage_spec.is_weak();
455-
symbol.mode=linkage_spec==ID_auto?ID_cpp:linkage_spec;
456456
symbol.module=cpp_typecheck.module;
457-
symbol.type=final_type;
458457
symbol.is_type=is_typedef;
459458
symbol.is_macro=is_typedef && !is_template_parameter;
460459
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
@@ -183,11 +183,9 @@ const symbolt &cpp_typecheckt::class_template_symbol(
183183

184184
// Create as incomplete struct, but mark as
185185
// "template_class_instance", to be elaborated later.
186-
symbolt new_symbol;
187-
new_symbol.name=identifier;
186+
type_symbolt new_symbol{identifier, struct_typet(), template_symbol.mode};
188187
new_symbol.pretty_name=template_symbol.pretty_name;
189188
new_symbol.location=template_symbol.location;
190-
new_symbol.type = struct_typet();
191189
to_struct_type(new_symbol.type).make_incomplete();
192190
new_symbol.type.set(ID_tag, template_symbol.type.find(ID_tag));
193191
if(template_symbol.type.get_bool(ID_C_class))
@@ -198,9 +196,7 @@ const symbolt &cpp_typecheckt::class_template_symbol(
198196
ID_specialization_template_args, specialization_template_args);
199197
new_symbol.type.set(ID_full_template_args, full_template_args);
200198
new_symbol.type.set(ID_identifier, template_symbol.name);
201-
new_symbol.mode=template_symbol.mode;
202199
new_symbol.base_name=template_symbol.base_name;
203-
new_symbol.is_type=true;
204200

205201
symbolt *s_ptr;
206202
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
@@ -199,16 +199,13 @@ void cpp_typecheckt::static_and_dynamic_initialization()
199199
dynamic_initializations.clear();
200200

201201
// Create the dynamic initialization procedure
202-
symbolt init_symbol;
203-
204-
init_symbol.name="#cpp_dynamic_initialization#"+id2string(module);
202+
symbolt init_symbol{
203+
"#cpp_dynamic_initialization#" + id2string(module),
204+
code_typet({}, typet(ID_constructor)),
205+
ID_cpp};
205206
init_symbol.base_name="#cpp_dynamic_initialization#"+id2string(module);
206207
init_symbol.value.swap(init_block);
207-
init_symbol.mode=ID_cpp;
208208
init_symbol.module=module;
209-
init_symbol.type = code_typet({}, typet(ID_constructor));
210-
init_symbol.is_type=false;
211-
init_symbol.is_macro=false;
212209

213210
symbol_table.insert(std::move(init_symbol));
214211

src/cpp/cpp_typecheck_compound_type.cpp

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -229,17 +229,10 @@ void cpp_typecheckt::typecheck_compound_type(
229229
else
230230
{
231231
// produce new symbol
232-
symbolt symbol;
233-
234-
symbol.name=symbol_name;
232+
type_symbolt symbol{symbol_name, type, ID_cpp};
235233
symbol.base_name=base_name;
236-
symbol.value.make_nil();
237234
symbol.location=type.source_location();
238-
symbol.mode=ID_cpp;
239235
symbol.module=module;
240-
symbol.type.swap(type);
241-
symbol.is_type=true;
242-
symbol.is_macro=false;
243236
symbol.pretty_name=
244237
cpp_scopes.current_scope().prefix+
245238
id2string(symbol.base_name)+
@@ -577,16 +570,12 @@ void cpp_typecheckt::typecheck_compound_declarator(
577570
if(!symbol_table.has_symbol(vt_name))
578571
{
579572
// first time: create a virtual-table symbol type
580-
symbolt vt_symb_type;
581-
vt_symb_type.name= vt_name;
573+
type_symbolt vt_symb_type{vt_name, struct_typet(), ID_cpp};
582574
vt_symb_type.base_name="virtual_table::"+id2string(symbol.base_name);
583575
vt_symb_type.pretty_name=vt_symb_type.base_name;
584-
vt_symb_type.mode=ID_cpp;
585576
vt_symb_type.module=module;
586577
vt_symb_type.location=symbol.location;
587-
vt_symb_type.type=struct_typet();
588578
vt_symb_type.type.set(ID_name, vt_symb_type.name);
589-
vt_symb_type.is_type=true;
590579

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

628617
// a new function that does 'late casting' of the 'this' parameter
629-
symbolt func_symb;
630-
func_symb.name=
631-
id2string(component.get_name())+"::"+id2string(virtual_base);
618+
symbolt func_symb{
619+
id2string(component.get_name()) + "::" + id2string(virtual_base),
620+
component.type(),
621+
symbol.mode};
632622
func_symb.base_name = component.get_base_name();
633623
func_symb.pretty_name = component.get_base_name();
634-
func_symb.mode = symbol.mode;
635624
func_symb.module=module;
636625
func_symb.location=component.source_location();
637-
func_symb.type=component.type();
638626

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

656-
symbolt arg_symb;
657-
arg_symb.name =
658-
id2string(func_symb.name) + "::" + id2string(param_base_name);
644+
symbolt arg_symb{
645+
id2string(func_symb.name) + "::" + id2string(param_base_name),
646+
arg.type(),
647+
symbol.mode};
659648
arg_symb.base_name = param_base_name;
660649
arg_symb.pretty_name = param_base_name;
661-
arg_symb.mode = symbol.mode;
662650
arg_symb.location=func_symb.location;
663-
arg_symb.type=arg.type();
664651

665652
arg.set_identifier(arg_symb.name);
666653

@@ -725,10 +712,7 @@ void cpp_typecheckt::typecheck_compound_declarator(
725712
if(is_static && !is_method) // static non-method member
726713
{
727714
// add as global variable to symbol_table
728-
symbolt static_symbol;
729-
static_symbol.mode=symbol.mode;
730-
static_symbol.name=identifier;
731-
static_symbol.type=component.type();
715+
symbolt static_symbol{identifier, component.type(), symbol.mode};
732716
static_symbol.base_name = component.get_base_name();
733717
static_symbol.is_lvalue=true;
734718
static_symbol.is_static_lifetime=true;
@@ -1282,8 +1266,6 @@ void cpp_typecheckt::typecheck_member_function(
12821266
const typet &method_qualifier,
12831267
exprt &value)
12841268
{
1285-
symbolt symbol;
1286-
12871269
code_typet &type = to_code_type(component.type());
12881270

12891271
if(component.get_bool(ID_is_static))
@@ -1322,14 +1304,10 @@ void cpp_typecheckt::typecheck_member_function(
13221304
if(value.is_not_nil())
13231305
to_code_type(type).set_inlined(true);
13241306

1325-
symbol.name=identifier;
1307+
symbolt symbol{identifier, type, compound_symbol.mode};
13261308
symbol.base_name=component.get_base_name();
13271309
symbol.value.swap(value);
1328-
symbol.mode = compound_symbol.mode;
13291310
symbol.module=module;
1330-
symbol.type=type;
1331-
symbol.is_type=false;
1332-
symbol.is_macro=false;
13331311
symbol.location=component.source_location();
13341312

13351313
// 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
@@ -62,15 +62,10 @@ void cpp_typecheckt::convert(cpp_namespace_spect &namespace_spec)
6262
}
6363
else
6464
{
65-
symbolt symbol;
66-
67-
symbol.name=identifier;
65+
symbolt symbol{identifier, typet(ID_namespace), ID_cpp};
6866
symbol.base_name=final_name;
69-
symbol.value.make_nil();
7067
symbol.location=namespace_spec.source_location();
71-
symbol.mode=ID_cpp;
7268
symbol.module=module;
73-
symbol.type=typet(ID_namespace);
7469

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

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
@@ -68,15 +68,14 @@ void cpp_typecheckt::do_virtual_table(const symbolt &symbol)
6868
const symbolt &vt_symb_type =
6969
lookup("virtual_table::" + id2string(late_cast_symb.name));
7070

71-
symbolt vt_symb_var;
72-
vt_symb_var.name=
73-
id2string(vt_symb_type.name) + "@"+ id2string(symbol.name);
71+
symbolt vt_symb_var{
72+
id2string(vt_symb_type.name) + "@" + id2string(symbol.name),
73+
struct_tag_typet(vt_symb_type.name),
74+
symbol.mode};
7475
vt_symb_var.base_name=
7576
id2string(vt_symb_type.base_name) + "@" + id2string(symbol.base_name);
76-
vt_symb_var.mode = symbol.mode;
7777
vt_symb_var.module=module;
7878
vt_symb_var.location=vt_symb_type.location;
79-
vt_symb_var.type = struct_tag_typet(vt_symb_type.name);
8079
vt_symb_var.is_lvalue=true;
8180
vt_symb_var.is_static_lifetime=true;
8281

0 commit comments

Comments
 (0)