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;
551 assert(initializers.
id()==ID_member_initializers);
553 irept final_initializers(ID_member_initializers);
555 if(struct_union_type.
id()==ID_struct)
559 std::list<irep_idt> vbases;
566 while(!vbases.empty())
574 codet mem_init(ID_member_initializer);
575 mem_init.
set(ID_member, cppname);
582 cpp_namet(
"@most_derived").as_expr(), std::move(block));
589 DATA_INVARIANT(b.id() == ID_base,
"base class expression expected");
609 if(!has_template_args)
616 for(
const auto &c : components)
619 c.get_base_name() == base_name && c.type().id() != ID_code &&
620 !c.get_bool(ID_is_type))
632 static_cast<const typet&
>(initializer.find(ID_member));
636 if(member_type.
id() != ID_struct_tag)
654 codet mem_init(ID_member_initializer);
655 mem_init.
set(ID_member, cppname);
659 if(b.get_bool(ID_virtual))
661 codet tmp(ID_member_initializer);
665 cpp_namet(
"@most_derived").as_expr(), std::move(tmp));
667 final_initializers.
get_sub().back().swap(cond);
673 for(
const auto &c : components)
676 if(c.get_bool(ID_is_vtptr))
678 const cpp_namet cppname(c.get_base_name(), c.source_location());
680 const symbolt &virtual_table_symbol_type =
681 lookup(c.type().subtype().get(ID_identifier));
683 const symbolt &virtual_table_symbol_var =
689 assert(address.
type() == c.type());
693 exprt ptrmember(ID_ptrmember);
694 ptrmember.
set(ID_component_name, c.get_name());
703 c.get_bool(ID_from_base) || c.type().id() == ID_code ||
704 c.get_bool(ID_is_type) || c.get_bool(ID_is_static))
709 const irep_idt &mem_name = c.get_base_name();
714 for(
auto &initializer : initializers.
get_sub())
716 if(initializer.get(ID_member)!=ID_cpp_name)
725 if(mem_name==base_name)
736 !found && c.type().id() == ID_pointer &&
737 c.type().get_bool(ID_C_reference))
740 error() <<
"reference must be explicitly initialized" <<
eom;
750 codet mem_init(ID_member_initializer);
751 mem_init.
set(ID_member, cppname);
756 initializers.
swap(final_initializers);
780 if(parameters.size() < 2)
785 const typet ¶meter1_type=parameter1.
type();
794 for(std::size_t i=2; i<parameters.size(); i++)
796 if(parameters[i].default_value().is_nil())
817 if(
component.get_base_name() !=
"operator=")