Go to the documentation of this file.
18 std::set<irep_idt> bases;
19 std::set<irep_idt> vbases;
30 exprt base_symbol_expr=
36 if(base_symbol_expr.
id()!=ID_type)
39 error() <<
"expected type as struct/class base" <<
eom;
46 if(base_symbol_expr.
type().
id() != ID_struct_tag)
49 error() <<
"expected type symbol as struct/class base" <<
eom;
56 if(base_symbol.
type.
id() != ID_struct)
59 error() <<
"expected struct or class as base, but got '"
67 error() <<
"base type is incomplete" <<
eom;
71 bool virtual_base = base_it->get_bool(ID_virtual);
72 irep_idt class_access = base_it->get(ID_protection);
74 if(class_access.
empty())
75 class_access = default_class_access;
77 base_symbol_expr.
id(ID_base);
78 base_symbol_expr.
set(ID_access, class_access);
81 base_symbol_expr.
set(ID_virtual,
true);
83 base_it->swap(base_symbol_expr);
122 std::set<irep_idt> &bases,
123 std::set<irep_idt> &vbases,
128 if(is_virtual && vbases.find(from_name)!=vbases.end())
131 if(bases.find(from_name)!=bases.end())
134 error() <<
"error: non-virtual base class " << from_name
135 <<
" inherited multiple times" <<
eom;
139 bases.insert(from_name);
142 vbases.insert(from_name);
145 for(
const auto &b : from.
bases())
147 irep_idt sub_access = b.get(ID_access);
149 if(access==ID_private)
150 sub_access=ID_private;
151 else if(access==ID_protected && sub_access!=ID_private)
152 sub_access=ID_protected;
156 const bool is_virtual_base = b.get_bool(ID_virtual);
173 if(c.get_bool(ID_from_base))
185 if(access==ID_public)
187 if(comp_access==ID_private)
190 else if(access == ID_protected)
192 if(comp_access==ID_private)
197 else if(access == ID_private)
199 if(comp_access == ID_noaccess || comp_access == ID_private)
#define UNREACHABLE
This should be used to mark dead code.
const componentst & components() const
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
void elaborate_class_template(const typet &type)
elaborate class template instances
void add_base_components(const struct_typet &from, const irep_idt &access, struct_typet &to, std::set< irep_idt > &bases, std::set< irep_idt > &vbases, bool is_virtual)
const struct_typet & to_struct_type(const typet &type)
Cast a typet to a struct_typet.
void set_access(const irep_idt &access)
typet type
Type of symbol.
irept & add(const irep_namet &name)
void typecheck_compound_bases(struct_typet &type)
const symbolt & lookup(const irep_idt &name) const
Lookup a symbol in the namespace.
Base class for all expressions.
std::vector< componentt > componentst
auto component(T &struct_expr, const irep_idt &name, const namespacet &ns) -> decltype(struct_expr.op0())
irep_idt default_access() const
Return the access specification for members where access has not been modified.
#define Forall_irep(it, irep)
typet & type()
Return the type of the expression.
void add_secondary_scope(cpp_scopet &other)
cpp_scopet & current_scope()
source_locationt source_location
const source_locationt & source_location() const
void set_pretty_name(const irep_idt &name)
void set_base_name(const irep_idt &base_name)
const basest & bases() const
Get the collection of base classes/structs.
void put_compound_into_scope(const struct_union_typet::componentt &component)
const irep_idt & id() const
const struct_tag_typet & to_struct_tag_type(const typet &type)
Cast a typet to a struct_tag_typet.
C++ Language Type Checking.
Structure type, corresponds to C style structs.
const source_locationt & source_location() const
const irep_idt & get(const irep_namet &name) const
void set(const irep_namet &name, const irep_idt &value)
std::string to_string(const typet &) override
source_locationt & add_source_location()
exprt resolve(const cpp_namet &cpp_name, const cpp_typecheck_resolvet::wantt want, const cpp_typecheck_fargst &fargs, bool fail_with_exception=true)
bool is_incomplete() const
A struct/union may be incomplete.
irep_idt name
The unique identifier.
cpp_namet & to_cpp_name(irept &cpp_name)