43 op1.
type().
set(ID_C_reference,
true);
65 cpp_namet op0(member_base_name, source_location);
68 op1.
add(ID_component_cpp_name,
cpp_namet(member_base_name, source_location));
97 const cpp_namet array(member_base_name, source_location);
99 exprt member(ID_member);
101 ID_component_cpp_name,
cpp_namet(member_base_name, source_location));
135 ctor.
type().
id(ID_constructor);
136 ctor.
add(ID_storage_spec).
id(ID_cpp_storage_spec);
157 std::string param_identifier(
"ref");
163 const cpp_namet cpp_parameter(param_identifier, source_location);
168 parameter_tor.
set(ID_name, cpp_parameter);
174 parameter_decl.
set(ID_type, ID_merged_type);
176 sub.push_back(cppcomp.
as_type());
177 irept constnd(ID_const);
178 sub.push_back(
static_cast<const typet &
>(constnd));
183 decl0.
add(ID_type).
add(ID_parameters).
get_sub().push_back(parameter_decl);
186 irept &initializers=decl0.
add(ID_member_initializers);
187 initializers.
id(ID_member_initializers);
196 DATA_INVARIANT(b.id() == ID_base,
"base class expression expected");
207 const cpp_namet cppname(ctor_name, source_location);
209 codet mem_init(ID_member_initializer);
211 mem_init.
set(ID_member, cppname);
221 for(
const auto &mem_c : components)
224 if(mem_c.get_bool(ID_is_vtptr))
226 const cpp_namet cppname(mem_c.get_base_name(), source_location);
228 const symbolt &virtual_table_symbol_type =
229 lookup(mem_c.type().subtype().get(ID_identifier));
237 assert(address.
type() == mem_c.type());
241 exprt ptrmember(ID_ptrmember);
242 ptrmember.
set(ID_component_name, mem_c.get_name());
251 mem_c.get_bool(ID_from_base) || mem_c.get_bool(ID_is_type) ||
252 mem_c.get_bool(ID_is_static) || mem_c.type().id() == ID_code)
257 const irep_idt &mem_name = mem_c.get_base_name();
259 const cpp_namet cppname(mem_name, source_location);
261 codet mem_init(ID_member_initializer);
262 mem_init.
set(ID_member, cppname);
265 exprt memberexpr(ID_member);
266 memberexpr.
set(ID_component_cpp_name, cppname);
270 if(mem_c.type().id() == ID_array)
271 memberexpr.
set(ID_C_array_ini,
true);
291 std::string arg_name(
"ref");
293 cpctor.
add(ID_storage_spec).
id(ID_cpp_storage_spec);
294 cpctor.
type().
id(ID_struct_tag);
304 typet &declarator_type=declarator.
type();
308 declarator_name.
id(ID_cpp_name);
309 declarator_name.
get_sub().push_back(
irept(ID_operator));
312 declarator_type.
id(ID_function_type);
326 args_decl.
type().
id(ID_merged_type);
327 args_decl_type_sub.push_back(
330 args_decl_type_sub.push_back(
typet(ID_const));
337 args_decl_declor.
name() =
cpp_namet(arg_name, source_location);
341 args_decl_declor.
type().
set(ID_C_reference,
true);
356 std::string arg_name(
"ref");
361 DATA_INVARIANT(b.id() == ID_base,
"base class expression expected");
372 c.get_bool(ID_from_base) || c.get_bool(ID_is_type) ||
373 c.get_bool(ID_is_static) || c.get_bool(ID_is_vtptr) ||
374 c.type().id() == ID_code)
379 const irep_idt &mem_name = c.get_base_name();
381 if(c.type().id() == ID_array)
385 if(size_expr.
id()==ID_infinity)
393 const auto size = numeric_cast<mp_integer>(size_expr);
398 copy_array(source_location, mem_name, i, arg_name, block);
401 copy_member(source_location, mem_name, arg_name, block);
408 declarator.
value() = std::move(block);
422 const irept &initializers)
424 assert(initializers.
id()==ID_member_initializers);
426 for(
const auto &initializer : initializers.
get_sub())
428 assert(initializer.is_not_nil());
435 if(has_template_args)
443 for(
const auto &b : bases)
457 error() <<
"invalid initializer '" << member_name.
to_string() <<
"'"
467 for(
const auto &c : components)
469 if(c.get_base_name() != base_name)
474 !c.get_bool(ID_from_base) && !c.get_bool(ID_is_static) &&
475 c.type().id() != ID_code)
482 if(c.get_bool(ID_is_type))
484 if(c.type().id() != ID_struct_tag)
489 if(symb.
type.
id()!=ID_struct)
493 for(
const auto &b : bases)
506 c.get_bool(ID_from_base) && !c.get_bool(ID_is_type) &&
507 !c.get_bool(ID_is_static) && c.type().id() == ID_code &&
514 for(
const auto &b : bases)
517 member_type.
get(ID_identifier) ==
531 error() <<
"invalid initializer '" << base_name <<
"'" <<
eom;
552 assert(initializers.
id()==ID_member_initializers);
554 irept final_initializers(ID_member_initializers);
556 if(struct_union_type.
id()==ID_struct)
560 std::list<irep_idt> vbases;
567 while(!vbases.empty())
575 codet mem_init(ID_member_initializer);
576 mem_init.
set(ID_member, cppname);
583 cpp_namet(
"@most_derived").as_expr(), std::move(block));
590 DATA_INVARIANT(b.id() == ID_base,
"base class expression expected");
610 if(!has_template_args)
617 for(
const auto &c : components)
620 c.get_base_name() == base_name && c.type().id() != ID_code &&
621 !c.get_bool(ID_is_type))
633 static_cast<const typet&
>(initializer.find(ID_member));
637 if(member_type.
id() != ID_struct_tag)
655 codet mem_init(ID_member_initializer);
656 mem_init.
set(ID_member, cppname);
660 if(b.get_bool(ID_virtual))
662 codet tmp(ID_member_initializer);
666 cpp_namet(
"@most_derived").as_expr(), std::move(tmp));
668 final_initializers.
get_sub().back().swap(cond);
674 for(
const auto &c : components)
677 if(c.get_bool(ID_is_vtptr))
679 const cpp_namet cppname(c.get_base_name(), c.source_location());
681 const symbolt &virtual_table_symbol_type =
682 lookup(c.type().subtype().get(ID_identifier));
684 const symbolt &virtual_table_symbol_var =
690 assert(address.
type() == c.type());
694 exprt ptrmember(ID_ptrmember);
695 ptrmember.
set(ID_component_name, c.get_name());
704 c.get_bool(ID_from_base) || c.type().id() == ID_code ||
705 c.get_bool(ID_is_type) || c.get_bool(ID_is_static))
710 const irep_idt &mem_name = c.get_base_name();
715 for(
auto &initializer : initializers.
get_sub())
717 if(initializer.get(ID_member)!=ID_cpp_name)
726 if(mem_name==base_name)
737 !found && c.type().id() == ID_pointer &&
738 c.type().get_bool(ID_C_reference))
741 error() <<
"reference must be explicitly initialized" <<
eom;
751 codet mem_init(ID_member_initializer);
752 mem_init.
set(ID_member, cppname);
757 initializers.
swap(final_initializers);
781 if(parameters.size() < 2)
786 const typet ¶meter1_type=parameter1.
type();
795 for(std::size_t i=2; i<parameters.size(); i++)
797 if(parameters[i].default_value().is_nil())
818 if(
component.get_base_name() !=
"operator=")