42 op1.
type().
set(ID_C_reference,
true);
64 cpp_namet op0(member_base_name, source_location);
67 op1.
add(ID_component_cpp_name,
cpp_namet(member_base_name, source_location));
98 const cpp_namet array(member_base_name, source_location);
100 exprt member(ID_member);
102 ID_component_cpp_name,
cpp_namet(member_base_name, source_location));
133 decl.
value().
set(ID_statement, ID_block);
137 ctor.
type().
id(ID_constructor);
138 ctor.
add(ID_storage_spec).
id(ID_cpp_storage_spec);
159 std::string param_identifier(
"ref");
165 const cpp_namet cpp_parameter(param_identifier, source_location);
170 parameter_tor.
set(ID_name, cpp_parameter);
176 parameter_decl.
set(ID_type, ID_merged_type);
178 sub.push_back(cppcomp.
as_type());
179 irept constnd(ID_const);
180 sub.push_back(static_cast<const typet &>(constnd));
185 decl0.
add(ID_type).
add(ID_parameters).
get_sub().push_back(parameter_decl);
188 irept &initializers=decl0.
add(ID_member_initializers);
189 initializers.
id(ID_member_initializers);
197 DATA_INVARIANT(b.id() == ID_base,
"base class expression expected");
202 copy_parent(source_location, parsymb.base_name, param_identifier, block);
205 irep_idt ctor_name=parsymb.base_name;
208 const cpp_namet cppname(ctor_name, source_location);
210 codet mem_init(ID_member_initializer);
212 mem_init.
set(ID_member, cppname);
222 for(
const auto &mem_c : components)
225 if(mem_c.get_bool(ID_is_vtptr))
227 const cpp_namet cppname(mem_c.get_base_name(), source_location);
229 const symbolt &virtual_table_symbol_type =
230 lookup(mem_c.type().subtype().get(ID_identifier));
233 id2string(virtual_table_symbol_type.name) +
"@" +
236 exprt var=virtual_table_symbol_var.symbol_expr();
238 assert(address.
type() == mem_c.type());
242 exprt ptrmember(ID_ptrmember);
243 ptrmember.
set(ID_component_name, mem_c.get_name());
252 mem_c.get_bool(ID_from_base) || mem_c.get_bool(ID_is_type) ||
253 mem_c.get_bool(ID_is_static) || mem_c.type().id() == ID_code)
258 const irep_idt &mem_name = mem_c.get_base_name();
260 const cpp_namet cppname(mem_name, source_location);
262 codet mem_init(ID_member_initializer);
263 mem_init.
set(ID_member, cppname);
266 exprt memberexpr(ID_member);
267 memberexpr.
set(ID_component_cpp_name, cppname);
271 if(mem_c.type().id() == ID_array)
272 memberexpr.
set(ID_C_array_ini,
true);
292 std::string arg_name(
"ref");
294 cpctor.
add(ID_storage_spec).
id(ID_cpp_storage_spec);
295 cpctor.
type().
id(ID_symbol_type);
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);
316 exprt &args=static_cast<exprt&>(declarator.
type().
add(ID_parameters));
322 static_cast<cpp_declarationt&>(args.
get_sub().back());
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));
335 static_cast<cpp_declaratort&>(args_decl.
operands().back());
337 args_decl_declor.
name() =
cpp_namet(arg_name, source_location);
341 args_decl_declor.
type().
set(ID_C_reference,
true);
355 declarator.
value().
id(ID_code);
356 declarator.
value().
set(ID_statement, ID_block);
361 std::string arg_name(
"ref");
366 DATA_INVARIANT(b.id() == ID_base,
"base class expression expected");
370 copy_parent(source_location, symb.base_name, arg_name, block);
377 c.get_bool(ID_from_base) || c.get_bool(ID_is_type) ||
378 c.get_bool(ID_is_static) || c.get_bool(ID_is_vtptr) ||
379 c.type().id() == ID_code)
384 const irep_idt &mem_name = c.get_base_name();
386 if(c.type().id() == ID_array)
390 if(size_expr.
id()==ID_infinity)
398 const auto size = numeric_cast<mp_integer>(size_expr);
403 copy_array(source_location, mem_name, i, arg_name, block);
406 copy_member(source_location, mem_name, arg_name, block);
410 block.operands().push_back(
exprt(ID_code));
414 ret_code.
set(ID_statement, ID_return);
428 const irept &initializers)
430 assert(initializers.
id()==ID_member_initializers);
434 const irept &initializer=*init_it;
442 if(has_template_args)
450 for(
const auto &b : bases)
464 error() <<
"invalid initializer `" << member_name.to_string()
471 irep_idt base_name=member_name.get_base_name();
474 for(
const auto &c : components)
476 if(c.get_base_name() != base_name)
481 !c.get_bool(ID_from_base) && !c.get_bool(ID_is_static) &&
482 c.type().id() != ID_code)
489 if(c.get_bool(ID_is_type))
491 if(c.type().id() != ID_symbol_type)
495 if(symb.
type.
id()!=ID_struct)
499 for(
const auto &b : bases)
512 c.get_bool(ID_from_base) && !c.get_bool(ID_is_type) &&
513 !c.get_bool(ID_is_static) && c.type().id() == ID_code &&
520 for(
const auto &b : bases)
523 member_type.
get(ID_identifier) ==
537 error() <<
"invalid initializer `" << base_name <<
"'" <<
eom;
558 assert(initializers.
id()==ID_member_initializers);
560 irept final_initializers(ID_member_initializers);
562 if(struct_union_type.
id()==ID_struct)
566 std::list<irep_idt> vbases;
573 codet cond(ID_ifthenelse);
579 while(!vbases.empty())
587 codet mem_init(ID_member_initializer);
588 mem_init.
set(ID_member, cppname);
594 final_initializers.move_to_sub(cond);
600 DATA_INVARIANT(b.id() == ID_base,
"base class expression expected");
607 irep_idt ctor_name=ctorsymb.base_name;
615 irept initializer=*m_it;
622 if(!has_template_args)
629 for(
const auto &c : components)
632 c.get_base_name() == base_name && c.type().id() != ID_code &&
633 !c.get_bool(ID_is_type))
645 static_cast<const typet&>(initializer.
find(ID_member));
649 if(member_type.
id() != ID_symbol_type)
656 final_initializers.move_to_sub(initializer);
667 codet mem_init(ID_member_initializer);
668 mem_init.
set(ID_member, cppname);
669 final_initializers.move_to_sub(mem_init);
672 if(b.get_bool(ID_virtual))
676 codet cond(ID_ifthenelse);
681 codet tmp(ID_member_initializer);
682 tmp.
swap(final_initializers.get_sub().back());
684 final_initializers.get_sub().back().swap(cond);
691 for(
const auto &c : components)
694 if(c.get_bool(ID_is_vtptr))
696 const cpp_namet cppname(c.get_base_name(), c.source_location());
698 const symbolt &virtual_table_symbol_type =
699 lookup(c.type().subtype().get(ID_identifier));
701 const symbolt &virtual_table_symbol_var =
705 exprt var=virtual_table_symbol_var.symbol_expr();
707 assert(address.
type() == c.type());
711 exprt ptrmember(ID_ptrmember);
712 ptrmember.
set(ID_component_name, c.get_name());
716 final_initializers.move_to_sub(assign);
721 c.get_bool(ID_from_base) || c.type().id() == ID_code ||
722 c.get_bool(ID_is_type) || c.get_bool(ID_is_static))
727 const irep_idt &mem_name = c.get_base_name();
734 irept &initializer=*m_it;
736 if(initializer.
get(ID_member)!=ID_cpp_name)
745 if(mem_name==base_name)
747 final_initializers.move_to_sub(initializer);
756 !found && c.type().id() == ID_pointer &&
757 c.type().get_bool(ID_C_reference))
760 error() <<
"reference must be explicitly initialized" <<
eom;
770 codet mem_init(ID_member_initializer);
771 mem_init.
set(ID_member, cppname);
772 final_initializers.move_to_sub(mem_init);
776 initializers.
swap(final_initializers);
800 if(parameters.size() < 2)
805 const typet ¶meter1_type=parameter1.
type();
814 for(std::size_t i=2; i<parameters.size(); i++)
816 if(parameters[i].default_value().is_nil())
837 if(
component.get_base_name() !=
"operator=")