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_symbol_type)
47 base_symbol_expr.type().id(ID_struct_tag);
49 if(base_symbol_expr.type().id() != ID_struct_tag)
52 error() <<
"expected type symbol as struct/class base" <<
eom;
59 if(base_symbol.
type.
id()==ID_incomplete_struct)
62 error() <<
"base type is incomplete" <<
eom;
65 else if(base_symbol.
type.
id()!=ID_struct)
68 error() <<
"expected struct or class as base, but got `"
73 bool virtual_base = base_it->get_bool(ID_virtual);
74 irep_idt class_access = base_it->get(ID_protection);
76 if(class_access.
empty())
77 class_access = default_class_access;
79 base_symbol_expr.id(ID_base);
80 base_symbol_expr.set(ID_access, class_access);
83 base_symbol_expr.set(ID_virtual,
true);
85 base_it->
swap(base_symbol_expr);
111 most_derived.set_base_name(
"@most_derived");
112 most_derived.set_pretty_name(
"@most_derived");
124 std::set<irep_idt> &bases,
125 std::set<irep_idt> &vbases,
130 if(is_virtual && vbases.find(from_name)!=vbases.end())
133 if(bases.find(from_name)!=bases.end())
136 error() <<
"error: non-virtual base class " << from_name
137 <<
" inherited multiple times" <<
eom;
141 bases.insert(from_name);
144 vbases.insert(from_name);
147 for(
const auto &b : from.
bases())
149 irep_idt sub_access = b.get(ID_access);
151 if(access==ID_private)
152 sub_access=ID_private;
153 else if(access==ID_protected && sub_access!=ID_private)
154 sub_access=ID_protected;
158 const bool is_virtual_base = b.get_bool(ID_virtual);
175 if(c.get_bool(ID_from_base))
187 if(access==ID_public)
189 if(comp_access==ID_private)
192 else if(access == ID_protected)
194 if(comp_access==ID_private)
199 else if(access == ID_private)
201 if(comp_access == ID_noaccess || comp_access == ID_private)