53 op1.
type().
set(ID_C_reference,
true);
58 op1.
op0().
get_sub().back().set(ID_identifier, arg_name);
59 op1.
op0().
get_sub().back().set(ID_C_source_location, source_location);
75 code.
set(ID_statement, ID_expression);
78 code.
op0().
set(ID_statement, ID_assign);
86 op0.
get_sub().back().set(ID_identifier, member_base_name);
87 op0.
get_sub().back().set(ID_C_source_location, source_location);
93 op1.
add(ID_component_cpp_name).
id(ID_cpp_name);
95 op1.
add(ID_component_cpp_name).
get_sub().back().set(
96 ID_identifier, member_base_name);
97 op1.
add(ID_component_cpp_name).
get_sub().back().set(
98 ID_C_source_location, source_location);
102 op1.
op0().
get_sub().back().set(ID_identifier, arg_name);
103 op1.
op0().
get_sub().back().set(ID_C_source_location, source_location);
125 code.
set(ID_statement, ID_expression);
128 code.
op0().
set(ID_statement, ID_assign);
135 op0.
op0().
get_sub().back().set(ID_identifier, member_base_name);
136 op0.
op0().
get_sub().back().set(ID_C_source_location, source_location);
143 op1.
op0().
add(ID_component_cpp_name).
id(ID_cpp_name);
146 ID_identifier, member_base_name);
148 ID_C_source_location, source_location);
152 op1.
op0().
op0().
get_sub().back().set(ID_identifier, arg_name);
153 op1.
op0().
op0().
get_sub().back().set(ID_C_source_location, source_location);
166 name.
set(ID_identifier, base_name);
170 decl.
name().
id(ID_cpp_name);
178 decl.
value().
set(ID_statement, ID_block);
182 ctor.
type().
id(ID_constructor);
183 ctor.
add(ID_storage_spec).
id(ID_cpp_storage_spec);
204 std::string param_identifier(
"ref");
207 irept comp_name(ID_name);
209 comp_name.
set(ID_C_source_location, source_location);
215 exprt param_name(ID_name);
217 param_name.
set(ID_identifier, param_identifier);
225 parameter_tor.
set(ID_name, cpp_parameter);
231 parameter_decl.
set(ID_type, ID_merged_type);
234 static_cast<const typet &>(static_cast<const irept &>(cppcomp)));
235 irept constnd(ID_const);
236 sub.push_back(static_cast<const typet &>(constnd));
241 decl0.
add(ID_type).
add(ID_parameters).
get_sub().push_back(parameter_decl);
244 irept &initializers=decl0.
add(ID_member_initializers);
245 initializers.
id(ID_member_initializers);
254 assert(parent_it->id()==ID_base);
255 assert(parent_it->get(ID_type)==ID_symbol);
258 lookup(parent_it->find(ID_type).get(ID_identifier));
261 copy_parent(source_location, parsymb.base_name, param_identifier, block);
264 irep_idt ctor_name=parsymb.base_name;
268 name.
set(ID_identifier, ctor_name);
274 codet mem_init(ID_member_initializer);
276 mem_init.
set(ID_member, cppname);
278 static_cast<const exprt &>(static_cast<const irept &>(cpp_parameter)));
286 for(struct_typet::componentst::const_iterator mem_it=components.begin();
287 mem_it!=components.end(); mem_it++)
290 if(mem_it->get_bool(
"is_vtptr"))
293 name.
set(ID_identifier, mem_it->get(ID_base_name));
299 const symbolt &virtual_table_symbol_type =
300 lookup(mem_it->type().subtype().get(ID_identifier));
306 exprt var=virtual_table_symbol_var.symbol_expr();
308 assert(address.
type()==mem_it->type());
312 exprt ptrmember(ID_ptrmember);
313 ptrmember.
set(ID_component_name, mem_it->get(ID_name));
321 if( mem_it->get_bool(
"from_base")
322 || mem_it->get_bool(ID_is_type)
323 || mem_it->get_bool(ID_is_static)
324 || mem_it->type().id()==ID_code)
327 irep_idt mem_name=mem_it->get(ID_base_name);
330 name.
set(ID_identifier, mem_name);
336 codet mem_init(ID_member_initializer);
337 mem_init.
set(ID_member, cppname);
340 exprt memberexpr(ID_member);
341 memberexpr.
set(ID_component_cpp_name, cppname);
343 static_cast<const exprt &>(static_cast<const irept &>(cpp_parameter)));
346 if(mem_it->type().id()==ID_array)
347 memberexpr.
set(ID_C_array_ini,
true);
367 std::string arg_name(
"ref");
369 cpctor.
add(ID_storage_spec).
id(ID_cpp_storage_spec);
370 cpctor.
type().
id(ID_symbol);
379 typet &declarator_type=declarator.
type();
383 declarator_name.
id(ID_cpp_name);
384 declarator_name.
get_sub().push_back(
irept(ID_operator));
387 declarator_type.
id(ID_function_type);
401 args_decl.
type().
id(ID_merged_type);
402 args_decl_type_sub.push_back(
typet(ID_cpp_name));
403 args_decl_type_sub.back().get_sub().push_back(
irept(ID_name));
404 args_decl_type_sub.back().get_sub().back().set(
406 args_decl_type_sub.back().get_sub().back().set(
407 ID_C_source_location, source_location);
409 args_decl_type_sub.push_back(
typet(ID_const));
416 args_decl_declor.
name().
id(ID_cpp_name);
418 args_decl_declor.
name().
get_sub().back().add(ID_identifier).id(arg_name);
422 args_decl_declor.
type().
set(ID_C_reference,
true);
436 declarator.
value().
id(ID_code);
437 declarator.
value().
set(ID_statement, ID_block);
442 std::string arg_name(
"ref");
449 assert(parent_it->id()==ID_base);
450 assert(parent_it->get(ID_type)==ID_symbol);
453 lookup(parent_it->find(ID_type).get(ID_identifier));
455 copy_parent(source_location, symb.base_name, arg_name, block);
463 if(mem_it->get_bool(ID_from_base) ||
464 mem_it->get_bool(ID_is_type) ||
465 mem_it->get_bool(ID_is_static) ||
466 mem_it->get_bool(
"is_vtptr") ||
467 mem_it->get(ID_type)==ID_code)
470 irep_idt mem_name=mem_it->get(ID_base_name);
472 if(mem_it->get(ID_type)==ID_array)
474 const exprt &size_expr=
477 if(size_expr.
id()==ID_infinity)
492 copy_array(source_location, mem_name, i, arg_name, block);
495 copy_member(source_location, mem_name, arg_name, block);
499 block.operands().push_back(
exprt(ID_code));
503 ret_code.
set(ID_statement, ID_return);
517 const irept &initializers)
519 assert(initializers.
id()==ID_member_initializers);
523 const irept &initializer=*init_it;
526 assert(initializer.
get(ID_member)==ID_cpp_name);
533 if(has_template_args)
543 assert(parent_it->get(ID_type)==ID_symbol);
545 if(member_type.
get(ID_identifier)
546 ==parent_it->find(ID_type).get(ID_identifier))
556 error() <<
"invalid initializer `" << member_name.to_string()
563 irep_idt base_name=member_name.get_base_name();
566 for(struct_typet::componentst::const_iterator
567 c_it=components.begin();
568 c_it!=components.end();
571 if(c_it->get(ID_base_name)!=base_name)
575 if(!c_it->get_bool(ID_from_base) &&
576 !c_it->get_bool(ID_is_static) &&
577 c_it->get(ID_type)!=ID_code)
584 if(c_it->get_bool(
"is_type"))
586 typet type=
static_cast<const typet&
>(c_it->find(ID_type));
587 if(type.
id()!=ID_symbol)
591 if(symb.
type.
id()!=ID_struct)
597 assert(parent_it->get(ID_type)==ID_symbol);
598 if(symb.
name==parent_it->find(ID_type).get(ID_identifier))
608 if(c_it->get_bool(ID_from_base) &&
609 !c_it->get_bool(ID_is_type) &&
610 !c_it->get_bool(ID_is_static) &&
611 c_it->get(ID_type)==ID_code &&
612 c_it->find(ID_type).get(ID_return_type)==ID_constructor)
620 assert(parent_it->get(ID_type)==ID_symbol);
622 if(member_type.
get(ID_identifier)==
623 parent_it->find(ID_type).get(ID_identifier))
636 error() <<
"invalid initializer `" << base_name <<
"'" <<
eom;
657 assert(initializers.
id()==ID_member_initializers);
659 irept final_initializers(ID_member_initializers);
661 if(struct_union_type.
id()==ID_struct)
665 std::list<irep_idt> vbases;
672 codet cond(ID_ifthenelse);
677 most_derived.
get_sub().back().set(ID_identifier,
"@most_derived");
680 tmp.
swap(most_derived);
686 while(!vbases.empty())
698 codet mem_init(ID_member_initializer);
699 mem_init.
set(ID_member, cppname);
705 final_initializers.move_to_sub(cond);
708 const irept &bases=struct_union_type.
find(ID_bases);
713 assert(parent_it->id()==ID_base);
714 assert(parent_it->get(ID_type)==ID_symbol);
717 lookup(parent_it->find(ID_type).get(ID_identifier));
722 irep_idt ctor_name=ctorsymb.base_name;
730 irept initializer=*m_it;
732 assert(initializer.
get(ID_member)==ID_cpp_name);
739 if(!has_template_args)
741 irep_idt base_name=member_name.get_base_name();
746 for(struct_typet::componentst::const_iterator c_it =
747 components.begin(); c_it!=components.end(); c_it++)
749 if(c_it->get(ID_base_name)==base_name &&
750 c_it->get(ID_type)!=ID_code &&
751 !c_it->get_bool(ID_is_type))
763 static_cast<const typet&
>(initializer.
find(ID_member));
767 if(member_type.
id()!=ID_symbol)
770 if(parent_it->find(ID_type).get(ID_identifier)==
771 member_type.
get(ID_identifier))
773 final_initializers.move_to_sub(initializer);
783 name.
set(ID_identifier, ctor_name);
788 codet mem_init(ID_member_initializer);
789 mem_init.
set(ID_member, cppname);
790 final_initializers.move_to_sub(mem_init);
793 if(parent_it->get_bool(ID_virtual))
797 codet cond(ID_ifthenelse);
802 most_derived.
get_sub().back().set(ID_identifier,
"@most_derived");
805 tmp.
swap(most_derived);
810 codet tmp(ID_member_initializer);
811 tmp.
swap(final_initializers.get_sub().back());
813 final_initializers.get_sub().back().swap(cond);
820 for(struct_typet::componentst::const_iterator mem_it =
821 components.begin(); mem_it!=components.end(); mem_it++)
824 if(mem_it->get_bool(
"is_vtptr"))
827 name.
set(ID_identifier, mem_it->get(ID_base_name));
833 const symbolt &virtual_table_symbol_type =
834 lookup(mem_it->type().subtype().get(ID_identifier));
836 const symbolt &virtual_table_symbol_var =
840 exprt var=virtual_table_symbol_var.symbol_expr();
842 assert(address.
type()==mem_it->type());
846 exprt ptrmember(ID_ptrmember);
847 ptrmember.
set(ID_component_name, mem_it->get(ID_name));
851 final_initializers.move_to_sub(assign);
855 if( mem_it->get_bool(ID_from_base)
856 || mem_it->type().id()==ID_code
857 || mem_it->get_bool(ID_is_type)
858 || mem_it->get_bool(ID_is_static))
861 irep_idt mem_name=mem_it->get(ID_base_name);
868 irept &initializer=*m_it;
870 if(initializer.
get(ID_member)!=ID_cpp_name)
879 if(mem_name==base_name)
881 final_initializers.move_to_sub(initializer);
890 mem_it->find(ID_type).id()==ID_pointer &&
891 mem_it->find(ID_type).get_bool(ID_C_reference))
894 error() <<
"reference must be explicitly initialized" <<
eom;
903 name.
set(ID_identifier, mem_name);
908 codet mem_init(ID_member_initializer);
909 mem_init.
set(ID_member, cppname);
910 final_initializers.move_to_sub(mem_init);
914 initializers.
swap(final_initializers);
924 for(struct_typet::componentst::const_iterator
925 cit=components.begin();
926 cit!=components.end();
932 if(component.
type().
id()!=ID_code ||
937 if(component.
get_bool(ID_from_base))
946 if(parameters.size() < 2)
951 const typet ¶meter1_type=parameter1.
type();
960 for(std::size_t i=2; i<parameters.size(); i++)
962 if(parameters[i].default_value().is_nil())
981 for(std::size_t i=0; i < components.size(); i++)
985 if(component.
get(ID_base_name)!=
"operator=")
988 if(component.
get_bool(ID_is_static))
991 if(component.
get_bool(ID_from_base))
The type of an expression.
irep_idt name
The unique identifier.
bool find_cpctor(const symbolt &symbol) const
void set_function(const irep_idt &function)
void typecheck_type(typet &type)
const std::string & id2string(const irep_idt &d)
pointer_typet pointer_type(const typet &subtype)
static void copy_parent(const source_locationt &source_location, const irep_idt &parent_base_name, const irep_idt &arg_name, exprt &block)
void move_to_sub(irept &irep)
const code_typet & to_code_type(const typet &type)
Cast a generic typet to a code_typet.
void copy_to_operands(const exprt &expr)
void full_member_initialization(const struct_union_typet &struct_union_type, irept &initializers)
Build the full initialization list of the constructor.
cpp_namet & to_cpp_name(irept &cpp_name)
std::vector< componentt > componentst
void move_to_operands(exprt &expr)
std::vector< parametert > parameterst
void already_typechecked(irept &irep)
const componentst & components() const
Symbol table entry.This is a symbol in the symbol table, stored in an object of type symbol_tablet...
#define CHECK_RETURN(CONDITION)
static mstreamt & eom(mstreamt &m)
void check_member_initializers(const irept &bases, const struct_typet::componentst &components, const irept &initializers)
Check a constructor initialization-list.
bool get_bool(const irep_namet &name) const
static void copy_member(const source_locationt &source_location, const irep_idt &member_base_name, const irep_idt &arg_name, exprt &block)
void default_assignop_value(const symbolt &symbol, cpp_declaratort &declarator)
Generate code for the implicit default assignment operator.
const irep_idt & id() const
const declaratorst & declarators() const
reference_typet reference_type(const typet &subtype)
bool has_template_args() const
source_locationt source_location
bool cpp_is_pod(const typet &type) const
API to expression classes.
bool is_reference(const typet &type)
TO_BE_DOCUMENTED.
const irep_idt & get(const irep_namet &name) const
Base class for tree-like data structures with sharing.
C++ Language Type Checking.
bitvector_typet index_type()
#define Forall_irep(it, irep)
const struct_typet & to_struct_type(const typet &type)
Cast a generic typet to a struct_typet.
dstringt has one field, an unsigned integer no which is an index into a static table of strings...
Operator to return the address of an object.
std::vector< typet > subtypest
void default_assignop(const symbolt &symbol, cpp_declarationt &cpctor)
Generate declaration of the implicit default assignment operator.
void default_cpctor(const symbolt &, cpp_declarationt &cpctor) const
Generate code for implicit default copy constructor.
std::vector< exprt > operandst
const source_locationt & source_location() const
irep_idt get_base_name() const
typet type
Type of symbol.
Base type of C structs and unions, and C++ classes.
void default_ctor(const source_locationt &source_location, const irep_idt &base_name, cpp_declarationt &ctor) const
Generate code for implicit default constructors.
void set_statement(const irep_idt &statement)
const array_typet & to_array_type(const typet &type)
Cast a generic typet to an array_typet.
bool find_assignop(const symbolt &symbol) const
Base class for all expressions.
void get_virtual_bases(const struct_typet &type, std::list< irep_idt > &vbases) const
const parameterst & parameters() const
irep_idt base_name
Base (non-scoped) name.
source_locationt & add_source_location()
const source_locationt & source_location() const
irept & add(const irep_namet &name)
source_locationt & add_source_location()
const codet & to_code(const exprt &expr)
A statement in a programming language.
const typet & subtype() const
static void copy_array(const source_locationt &source_location, const irep_idt &member_base_name, mp_integer i, const irep_idt &arg_name, exprt &block)
const irept & find(const irep_namet &name) const
bool lookup(const irep_idt &name, const symbolt *&symbol) const override
See namespace_baset::lookup().
void set(const irep_namet &name, const irep_idt &value)
#define forall_irep(it, irep)