39 op1.
type().
set(ID_C_reference,
true);
61 cpp_namet op0(member_base_name, source_location);
64 op1.
add(ID_component_cpp_name,
cpp_namet(member_base_name, source_location));
93 const cpp_namet array(member_base_name, source_location);
95 exprt member(ID_member);
97 ID_component_cpp_name,
cpp_namet(member_base_name, source_location));
131 ctor.
type().
id(ID_constructor);
132 ctor.
add(ID_storage_spec).
id(ID_cpp_storage_spec);
153 std::string param_identifier(
"ref");
159 const cpp_namet cpp_parameter(param_identifier, source_location);
164 parameter_tor.
set(ID_name, cpp_parameter);
170 parameter_decl.
set(ID_type, ID_merged_type);
172 sub.push_back(cppcomp.
as_type());
173 irept constnd(ID_const);
174 sub.push_back(
static_cast<const typet &
>(constnd));
179 decl0.
add(ID_type).
add(ID_parameters).
get_sub().push_back(parameter_decl);
182 irept &initializers=decl0.
add(ID_member_initializers);
183 initializers.
id(ID_member_initializers);
192 DATA_INVARIANT(b.id() == ID_base,
"base class expression expected");
203 const cpp_namet cppname(ctor_name, source_location);
205 codet mem_init(ID_member_initializer);
207 mem_init.
set(ID_member, cppname);
217 for(
const auto &mem_c : components)
220 if(mem_c.get_bool(ID_is_vtptr))
222 const cpp_namet cppname(mem_c.get_base_name(), source_location);
224 const symbolt &virtual_table_symbol_type =
225 lookup(mem_c.type().subtype().get(ID_identifier));
233 assert(address.
type() == mem_c.type());
237 exprt ptrmember(ID_ptrmember);
238 ptrmember.
set(ID_component_name, mem_c.get_name());
247 mem_c.get_bool(ID_from_base) || mem_c.get_bool(ID_is_type) ||
248 mem_c.get_bool(ID_is_static) || mem_c.type().id() == ID_code)
253 const irep_idt &mem_name = mem_c.get_base_name();
255 const cpp_namet cppname(mem_name, source_location);
257 codet mem_init(ID_member_initializer);
258 mem_init.
set(ID_member, cppname);
261 exprt memberexpr(ID_member);
262 memberexpr.
set(ID_component_cpp_name, cppname);
266 if(mem_c.type().id() == ID_array)
267 memberexpr.
set(ID_C_array_ini,
true);
287 std::string arg_name(
"ref");
289 cpctor.
add(ID_storage_spec).
id(ID_cpp_storage_spec);
290 cpctor.
type().
id(ID_struct_tag);
300 typet &declarator_type=declarator.
type();
304 declarator_name.
id(ID_cpp_name);
305 declarator_name.
get_sub().push_back(
irept(ID_operator));
308 declarator_type.
id(ID_function_type);
322 args_decl.
type().
id(ID_merged_type);
323 args_decl_type_sub.push_back(
326 args_decl_type_sub.push_back(
typet(ID_const));
333 args_decl_declor.
name() =
cpp_namet(arg_name, source_location);
337 args_decl_declor.
type().
set(ID_C_reference,
true);
352 std::string arg_name(
"ref");
357 DATA_INVARIANT(b.id() == ID_base,
"base class expression expected");
368 c.get_bool(ID_from_base) || c.get_bool(ID_is_type) ||
369 c.get_bool(ID_is_static) || c.get_bool(ID_is_vtptr) ||
370 c.type().id() == ID_code)
375 const irep_idt &mem_name = c.get_base_name();
377 if(c.type().id() == ID_array)
381 if(size_expr.
id()==ID_infinity)
389 const auto size = numeric_cast<mp_integer>(size_expr);
394 copy_array(source_location, mem_name, i, arg_name, block);
397 copy_member(source_location, mem_name, arg_name, block);
404 declarator.
value() = std::move(block);
418 const irept &initializers)
420 assert(initializers.
id()==ID_member_initializers);
422 for(
const auto &initializer : initializers.
get_sub())
424 assert(initializer.is_not_nil());
431 if(has_template_args)
439 for(
const auto &b : bases)
453 error() <<
"invalid initializer '" << member_name.
to_string() <<
"'"
463 for(
const auto &c : components)
465 if(c.get_base_name() != base_name)
470 !c.get_bool(ID_from_base) && !c.get_bool(ID_is_static) &&
471 c.type().id() != ID_code)
478 if(c.get_bool(ID_is_type))
480 if(c.type().id() != ID_struct_tag)
485 if(symb.
type.
id()!=ID_struct)
489 for(
const auto &b : bases)
502 c.get_bool(ID_from_base) && !c.get_bool(ID_is_type) &&
503 !c.get_bool(ID_is_static) && c.type().id() == ID_code &&
510 for(
const auto &b : bases)
513 member_type.
get(ID_identifier) ==
527 error() <<
"invalid initializer '" << base_name <<
"'" <<
eom;
547 assert(initializers.
id()==ID_member_initializers);
549 irept final_initializers(ID_member_initializers);
551 if(struct_union_type.
id()==ID_struct)
555 std::list<irep_idt> vbases;
562 while(!vbases.empty())
570 codet mem_init(ID_member_initializer);
571 mem_init.
set(ID_member, cppname);
578 cpp_namet(
"@most_derived").as_expr(), std::move(block));
585 DATA_INVARIANT(b.id() == ID_base,
"base class expression expected");
605 if(!has_template_args)
612 for(
const auto &c : components)
615 c.get_base_name() == base_name && c.type().id() != ID_code &&
616 !c.get_bool(ID_is_type))
628 static_cast<const typet&
>(initializer.find(ID_member));
632 if(member_type.
id() != ID_struct_tag)
650 codet mem_init(ID_member_initializer);
651 mem_init.
set(ID_member, cppname);
655 if(b.get_bool(ID_virtual))
657 codet tmp(ID_member_initializer);
661 cpp_namet(
"@most_derived").as_expr(), std::move(tmp));
663 final_initializers.
get_sub().back().swap(cond);
669 for(
const auto &c : components)
672 if(c.get_bool(ID_is_vtptr))
674 const cpp_namet cppname(c.get_base_name(), c.source_location());
676 const symbolt &virtual_table_symbol_type =
677 lookup(c.type().subtype().get(ID_identifier));
679 const symbolt &virtual_table_symbol_var =
685 assert(address.
type() == c.type());
689 exprt ptrmember(ID_ptrmember);
690 ptrmember.
set(ID_component_name, c.get_name());
699 c.get_bool(ID_from_base) || c.type().id() == ID_code ||
700 c.get_bool(ID_is_type) || c.get_bool(ID_is_static))
705 const irep_idt &mem_name = c.get_base_name();
710 for(
auto &initializer : initializers.
get_sub())
712 if(initializer.get(ID_member)!=ID_cpp_name)
721 if(mem_name==base_name)
732 !found && c.type().id() == ID_pointer &&
733 c.type().get_bool(ID_C_reference))
736 error() <<
"reference must be explicitly initialized" <<
eom;
746 codet mem_init(ID_member_initializer);
747 mem_init.
set(ID_member, cppname);
752 initializers.
swap(final_initializers);
776 if(parameters.size() < 2)
781 const typet ¶meter1_type=parameter1.
type();
790 for(std::size_t i=2; i<parameters.size(); i++)
792 if(parameters[i].default_value().is_nil())
813 if(
component.get_base_name() !=
"operator=")