Skip to content

Commit 8646cc1

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 7ece242 commit 8646cc1

8 files changed

+30
-85
lines changed

src/cpp/cpp_declarator_converter.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -441,18 +441,16 @@ symbolt &cpp_declarator_convertert::convert_new_symbol(
441441
{
442442
irep_idt pretty_name=get_pretty_name();
443443

444-
symbolt symbol;
445-
446-
symbol.name=final_identifier;
444+
symbolt symbol{final_identifier,
445+
final_type,
446+
linkage_spec == ID_auto ? ID_cpp : linkage_spec};
447447
symbol.base_name=base_name;
448448
symbol.value=declarator.value();
449449
symbol.location=declarator.name().source_location();
450450
symbol.is_extern = storage_spec.is_extern();
451451
symbol.is_parameter = declarator.get_is_parameter();
452452
symbol.is_weak = storage_spec.is_weak();
453-
symbol.mode=linkage_spec==ID_auto?ID_cpp:linkage_spec;
454453
symbol.module=cpp_typecheck.module;
455-
symbol.type=final_type;
456454
symbol.is_type=is_typedef;
457455
symbol.is_macro=is_typedef && !is_template_parameter;
458456
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: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -194,16 +194,12 @@ void cpp_typecheckt::static_and_dynamic_initialization()
194194
dynamic_initializations.clear();
195195

196196
// Create the dynamic initialization procedure
197-
symbolt init_symbol;
198-
199-
init_symbol.name="#cpp_dynamic_initialization#"+id2string(module);
197+
symbolt init_symbol{"#cpp_dynamic_initialization#" + id2string(module),
198+
code_typet({}, typet(ID_constructor)),
199+
ID_cpp};
200200
init_symbol.base_name="#cpp_dynamic_initialization#"+id2string(module);
201201
init_symbol.value.swap(init_block);
202-
init_symbol.mode=ID_cpp;
203202
init_symbol.module=module;
204-
init_symbol.type = code_typet({}, typet(ID_constructor));
205-
init_symbol.is_type=false;
206-
init_symbol.is_macro=false;
207203

208204
symbol_table.insert(std::move(init_symbol));
209205

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)+
@@ -575,16 +568,12 @@ void cpp_typecheckt::typecheck_compound_declarator(
575568
if(!symbol_table.has_symbol(vt_name))
576569
{
577570
// first time: create a virtual-table symbol type
578-
symbolt vt_symb_type;
579-
vt_symb_type.name= vt_name;
571+
type_symbolt vt_symb_type{vt_name, struct_typet(), ID_cpp};
580572
vt_symb_type.base_name="virtual_table::"+id2string(symbol.base_name);
581573
vt_symb_type.pretty_name=vt_symb_type.base_name;
582-
vt_symb_type.mode=ID_cpp;
583574
vt_symb_type.module=module;
584575
vt_symb_type.location=symbol.location;
585-
vt_symb_type.type=struct_typet();
586576
vt_symb_type.type.set(ID_name, vt_symb_type.name);
587-
vt_symb_type.is_type=true;
588577

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

626615
// a new function that does 'late casting' of the 'this' parameter
627-
symbolt func_symb;
628-
func_symb.name=
629-
id2string(component.get_name())+"::"+id2string(virtual_base);
616+
symbolt func_symb{id2string(component.get_name()) +
617+
"::" + id2string(virtual_base),
618+
component.type(),
619+
symbol.mode};
630620
func_symb.base_name = component.get_base_name();
631621
func_symb.pretty_name = component.get_base_name();
632-
func_symb.mode = symbol.mode;
633622
func_symb.module=module;
634623
func_symb.location=component.source_location();
635-
func_symb.type=component.type();
636624

637625
// change the type of the 'this' pointer
638626
code_typet &code_type=to_code_type(func_symb.type);
@@ -649,14 +637,13 @@ void cpp_typecheckt::typecheck_compound_declarator(
649637
if(param_base_name.empty())
650638
param_base_name = "arg" + std::to_string(i++);
651639

652-
symbolt arg_symb;
653-
arg_symb.name =
654-
id2string(func_symb.name) + "::" + id2string(param_base_name);
640+
symbolt arg_symb{id2string(func_symb.name) +
641+
"::" + id2string(param_base_name),
642+
arg.type(),
643+
symbol.mode};
655644
arg_symb.base_name = param_base_name;
656645
arg_symb.pretty_name = param_base_name;
657-
arg_symb.mode = symbol.mode;
658646
arg_symb.location=func_symb.location;
659-
arg_symb.type=arg.type();
660647

661648
arg.set_identifier(arg_symb.name);
662649

@@ -721,10 +708,7 @@ void cpp_typecheckt::typecheck_compound_declarator(
721708
if(is_static && !is_method) // static non-method member
722709
{
723710
// add as global variable to symbol_table
724-
symbolt static_symbol;
725-
static_symbol.mode=symbol.mode;
726-
static_symbol.name=identifier;
727-
static_symbol.type=component.type();
711+
symbolt static_symbol{identifier, component.type(), symbol.mode};
728712
static_symbol.base_name = component.get_base_name();
729713
static_symbol.is_lvalue=true;
730714
static_symbol.is_static_lifetime=true;
@@ -1278,8 +1262,6 @@ void cpp_typecheckt::typecheck_member_function(
12781262
const typet &method_qualifier,
12791263
exprt &value)
12801264
{
1281-
symbolt symbol;
1282-
12831265
code_typet &type = to_code_type(component.type());
12841266

12851267
if(component.get_bool(ID_is_static))
@@ -1318,14 +1300,10 @@ void cpp_typecheckt::typecheck_member_function(
13181300
if(value.is_not_nil())
13191301
to_code_type(type).set_inlined(true);
13201302

1321-
symbol.name=identifier;
1303+
symbolt symbol{identifier, type, compound_symbol.mode};
13221304
symbol.base_name=component.get_base_name();
13231305
symbol.value.swap(value);
1324-
symbol.mode = compound_symbol.mode;
13251306
symbol.module=module;
1326-
symbol.type=type;
1327-
symbol.is_type=false;
1328-
symbol.is_macro=false;
13291307
symbol.location=component.source_location();
13301308

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

src/cpp/cpp_typecheck_enum_type.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,14 @@ void cpp_typecheckt::typecheck_enum_body(symbolt &enum_symbol)
5151
exprt value_expr=from_integer(i, c_enum_type.subtype());
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{id2string(enum_symbol.name) + "::" + id2string(name),
55+
enum_tag_type,
56+
enum_symbol.mode};
5757
symbol.base_name=name;
5858
symbol.value=value_expr;
5959
symbol.location = static_cast<const source_locationt &>(
6060
component.find(ID_C_source_location));
61-
symbol.mode = enum_symbol.mode;
6261
symbol.module=module;
63-
symbol.type=enum_tag_type;
64-
symbol.is_type=false;
6562
symbol.is_macro=true;
6663
symbol.is_file_local = true;
6764
symbol.is_thread_local = true;
@@ -167,17 +164,11 @@ void cpp_typecheckt::typecheck_enum_type(typet &type)
167164
}
168165
}
169166

170-
symbolt symbol;
171-
172-
symbol.name=symbol_name;
167+
type_symbolt symbol{symbol_name, type, ID_cpp};
173168
symbol.base_name=base_name;
174169
symbol.value.make_nil();
175170
symbol.location=type.source_location();
176-
symbol.mode=ID_cpp;
177171
symbol.module=module;
178-
symbol.type.swap(type);
179-
symbol.is_type=true;
180-
symbol.is_macro=false;
181172
symbol.pretty_name=pretty_name;
182173

183174
// 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{id2string(vt_symb_type.name) + "@" +
71+
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)