52 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);
232 parameter_decl.
set(ID_type, ID_merged_type);
235 static_cast<const typet &>(static_cast<const irept &>(cppcomp)));
236 irept constnd(ID_const);
237 sub.push_back(static_cast<const typet &>(constnd));
242 decl0.
add(ID_type).
add(ID_parameters).
get_sub().push_back(parameter_decl);
245 irept &initializers=decl0.
add(ID_member_initializers);
246 initializers.
id(ID_member_initializers);
255 assert(parent_it->id()==ID_base);
256 assert(parent_it->get(ID_type)==ID_symbol);
259 lookup(parent_it->find(ID_type).get(ID_identifier));
262 copy_parent(source_location, parsymb.base_name, param_identifier, block);
265 irep_idt ctor_name=parsymb.base_name;
269 name.
set(ID_identifier, ctor_name);
275 codet mem_init(ID_member_initializer);
277 mem_init.
set(ID_member, cppname);
279 static_cast<const exprt &>(static_cast<const irept &>(cpp_parameter)));
287 for(struct_typet::componentst::const_iterator mem_it=components.begin();
288 mem_it!=components.end(); mem_it++)
291 if(mem_it->get_bool(
"is_vtptr"))
294 name.
set(ID_identifier, mem_it->get(ID_base_name));
300 const symbolt &virtual_table_symbol_type =
302 mem_it->type().subtype().get(ID_identifier));
304 const symbolt &virtual_table_symbol_var =
311 assert(address.
type()==mem_it->type());
315 exprt ptrmember(ID_ptrmember);
316 ptrmember.
set(ID_component_name, mem_it->get(ID_name));
324 if( mem_it->get_bool(
"from_base")
325 || mem_it->get_bool(ID_is_type)
326 || mem_it->get_bool(ID_is_static)
327 || mem_it->type().id()==ID_code)
330 irep_idt mem_name=mem_it->get(ID_base_name);
333 name.
set(ID_identifier, mem_name);
339 codet mem_init(ID_member_initializer);
340 mem_init.
set(ID_member, cppname);
343 exprt memberexpr(ID_member);
344 memberexpr.
set(ID_component_cpp_name, cppname);
346 static_cast<const exprt &>(static_cast<const irept &>(cpp_parameter)));
349 if(mem_it->type().id()==ID_array)
350 memberexpr.
set(
"#array_ini",
true);
370 std::string arg_name(
"ref");
372 cpctor.
add(ID_storage_spec).
id(ID_cpp_storage_spec);
373 cpctor.
type().
id(ID_symbol);
382 typet &declarator_type=declarator.
type();
386 declarator_name.
id(ID_cpp_name);
387 declarator_name.
get_sub().push_back(
irept(ID_operator));
390 declarator_type.
id(ID_function_type);
405 args_decl.
type().
id(ID_merged_type);
406 args_decl_type_sub.push_back(
typet(ID_cpp_name));
407 args_decl_type_sub.back().get_sub().push_back(
irept(ID_name));
408 args_decl_type_sub.back().get_sub().back().set(
410 args_decl_type_sub.back().get_sub().back().set(
411 ID_C_source_location, source_location);
413 args_decl_type_sub.push_back(
typet(ID_const));
420 args_decl_declor.
name().
id(ID_cpp_name);
422 args_decl_declor.
name().
get_sub().back().add(ID_identifier).id(arg_name);
425 args_decl_declor.
type().
id(ID_pointer);
426 args_decl_declor.
type().
set(ID_C_reference,
true);
441 declarator.
value().
id(ID_code);
442 declarator.
value().
set(ID_statement, ID_block);
447 std::string arg_name(
"ref");
454 assert(parent_it->id()==ID_base);
455 assert(parent_it->get(ID_type)==ID_symbol);
458 lookup(parent_it->find(ID_type).get(ID_identifier));
460 copy_parent(source_location, symb.base_name, arg_name, block);
468 if(mem_it->get_bool(ID_from_base) ||
469 mem_it->get_bool(ID_is_type) ||
470 mem_it->get_bool(ID_is_static) ||
471 mem_it->get_bool(
"is_vtptr") ||
472 mem_it->get(ID_type)==ID_code)
475 irep_idt mem_name=mem_it->get(ID_base_name);
477 if(mem_it->get(ID_type)==ID_array)
479 const exprt &size_expr=
482 if(size_expr.
id()==ID_infinity)
497 copy_array(source_location, mem_name, i, arg_name, block);
500 copy_member(source_location, mem_name, arg_name, block);
508 ret_code.
set(ID_statement, ID_return);
522 const irept &initializers)
524 assert(initializers.
id()==ID_member_initializers);
528 const irept &initializer=*init_it;
531 assert(initializer.
get(ID_member)==ID_cpp_name);
538 if(has_template_args)
548 assert(parent_it->get(ID_type)==ID_symbol);
550 if(member_type.
get(ID_identifier)
551 ==parent_it->find(ID_type).get(ID_identifier))
561 error() <<
"invalid initializer `" << member_name.to_string()
568 irep_idt base_name=member_name.get_base_name();
571 for(struct_typet::componentst::const_iterator
572 c_it=components.begin();
573 c_it!=components.end();
576 if(c_it->get(ID_base_name)!=base_name)
580 if(!c_it->get_bool(ID_from_base) &&
581 !c_it->get_bool(ID_is_static) &&
582 c_it->get(ID_type)!=ID_code)
589 if(c_it->get_bool(
"is_type"))
591 typet type=
static_cast<const typet&
>(c_it->find(ID_type));
592 if(type.
id()!=ID_symbol)
596 if(symb.
type.
id()!=ID_struct)
602 assert(parent_it->get(ID_type)==ID_symbol);
603 if(symb.
name==parent_it->find(ID_type).get(ID_identifier))
613 if(c_it->get_bool(ID_from_base) &&
614 !c_it->get_bool(ID_is_type) &&
615 !c_it->get_bool(ID_is_static) &&
616 c_it->get(ID_type)==ID_code &&
617 c_it->find(ID_type).get(ID_return_type)==ID_constructor)
625 assert(parent_it->get(ID_type)==ID_symbol);
627 if(member_type.
get(ID_identifier)==
628 parent_it->find(ID_type).get(ID_identifier))
641 error() <<
"invalid initializer `" << base_name <<
"'" <<
eom;
662 assert(initializers.
id()==ID_member_initializers);
664 irept final_initializers(ID_member_initializers);
666 if(struct_union_type.
id()==ID_struct)
670 std::list<irep_idt> vbases;
675 codet cond(ID_ifthenelse);
680 most_derived.
get_sub().back().set(ID_identifier,
"@most_derived");
683 tmp.
swap(most_derived);
687 codet block(ID_block);
689 while(!vbases.empty())
701 codet mem_init(ID_member_initializer);
702 mem_init.
set(ID_member, cppname);
708 final_initializers.move_to_sub(cond);
711 const irept &bases=struct_union_type.
find(ID_bases);
716 assert(parent_it->id()==ID_base);
717 assert(parent_it->get(ID_type)==ID_symbol);
720 lookup(parent_it->find(ID_type).get(ID_identifier));
725 irep_idt ctor_name=ctorsymb.base_name;
733 irept initializer=*m_it;
735 assert(initializer.
get(ID_member)==ID_cpp_name);
742 if(!has_template_args)
744 irep_idt base_name=member_name.get_base_name();
749 for(struct_typet::componentst::const_iterator c_it =
750 components.begin(); c_it!=components.end(); c_it++)
752 if(c_it->get(ID_base_name)==base_name &&
753 c_it->get(ID_type)!=ID_code &&
754 !c_it->get_bool(ID_is_type))
766 static_cast<const typet&
>(initializer.
find(ID_member));
770 if(member_type.
id()!=ID_symbol)
773 if(parent_it->find(ID_type).get(ID_identifier)==
774 member_type.
get(ID_identifier))
776 final_initializers.move_to_sub(initializer);
786 name.
set(ID_identifier, ctor_name);
791 codet mem_init(ID_member_initializer);
792 mem_init.
set(ID_member, cppname);
793 final_initializers.move_to_sub(mem_init);
796 if(parent_it->get_bool(ID_virtual))
798 codet cond(ID_ifthenelse);
803 most_derived.
get_sub().back().set(ID_identifier,
"@most_derived");
806 tmp.
swap(most_derived);
811 codet tmp(ID_member_initializer);
812 tmp.
swap(final_initializers.get_sub().back());
814 final_initializers.get_sub().back().swap(cond);
821 for(struct_typet::componentst::const_iterator mem_it =
822 components.begin(); mem_it!=components.end(); mem_it++)
825 if(mem_it->get_bool(
"is_vtptr"))
828 name.
set(ID_identifier, mem_it->get(ID_base_name));
834 const symbolt &virtual_table_symbol_type =
835 lookup(mem_it->type().subtype().get(ID_identifier));
837 const symbolt &virtual_table_symbol_var =
841 exprt var=virtual_table_symbol_var.symbol_expr();
843 assert(address.
type()==mem_it->type());
847 exprt ptrmember(ID_ptrmember);
848 ptrmember.
set(ID_component_name, mem_it->get(ID_name));
852 final_initializers.move_to_sub(assign);
856 if( mem_it->get_bool(ID_from_base)
857 || mem_it->type().id()==ID_code
858 || mem_it->get_bool(ID_is_type)
859 || mem_it->get_bool(ID_is_static))
862 irep_idt mem_name=mem_it->get(ID_base_name);
869 irept &initializer=*m_it;
871 if(initializer.
get(ID_member)!=ID_cpp_name)
880 if(mem_name==base_name)
882 final_initializers.move_to_sub(initializer);
891 mem_it->find(ID_type).id()==ID_pointer &&
892 mem_it->find(ID_type).get_bool(ID_C_reference))
895 error() <<
"reference must be explicitly initialized" <<
eom;
904 name.
set(ID_identifier, mem_name);
909 codet mem_init(ID_member_initializer);
910 mem_init.
set(ID_member, cppname);
911 final_initializers.move_to_sub(mem_init);
915 initializers.
swap(final_initializers);
925 for(struct_typet::componentst::const_iterator
926 cit=components.begin();
927 cit!=components.end();
933 if(component.
type().
id()!=ID_code ||
938 if(component.
get_bool(ID_from_base))
947 if(parameters.size() < 2)
952 const typet ¶meter1_type=parameter1.
type();
961 for(std::size_t i=2; i<parameters.size(); i++)
963 if(parameters[i].default_value().is_nil())
982 for(std::size_t i=0; i < components.size(); i++)
986 if(component.
get(ID_base_name)!=
"operator=")
989 if(component.
get_bool(ID_is_static))
992 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)
virtual bool lookup(const irep_idt &name, const symbolt *&symbol) const
void typecheck_type(typet &type)
const std::string & id2string(const irep_idt &d)
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)
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...
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)
symbol_tablet & symbol_table
void default_assignop_value(const symbolt &symbol, cpp_declaratort &declarator)
Generate code for the implicit default assignment operator.
const irep_idt & id() const
const array_typet & to_array_type(const typet &type)
Cast a generic typet to an array_typet.
class symbol_exprt symbol_expr() const
produces a symbol_exprt for a symbol
const declaratorst & declarators() const
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
namespacet(const symbol_tablet &_symbol_table)
Base class for tree-like data structures with sharing.
C++ Language Type Checking.
bitvector_typet index_type()
#define Forall_irep(it, irep)
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 struct_typet & to_struct_type(const typet &type)
Cast a generic typet to a struct_typet.
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)
bool find_assignop(const symbolt &symbol) const
const typet & as_type() 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)
const code_typet & to_code_type(const typet &type)
Cast a generic typet to a code_typet.
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
void set(const irep_namet &name, const irep_idt &value)
#define forall_irep(it, irep)