15#include <unordered_set>
37 const exprt &e = it->second;
45 static_cast<exprt &
>(s) = e;
52 const exprt &expr)
const
59 const typet &type)
const
80 const typet &type)
const
102 const typet &subtype =
c.type();
107 if(!
c.get_base_name().empty())
139 debug() <<
"<BEGIN DEPTH " << depth <<
">" <<
eom;
148 msg=
"type classes differ";
170 msg=
"pointer types differ";
172 msg=
"array types differ";
187 msg=
"number of members is different (";
200 msg=
"names of member "+std::to_string(
i)+
" differ (";
207 typedef std::unordered_set<typet, irep_hash>
type_sett;
242 msg=
"type of member "+
279 msg=
"enum value types are different (";
289 msg=
"number of enum members is different (";
290 msg+=std::to_string(
members1.size())+
'/';
291 msg+=std::to_string(
members2.size())+
')';
299 msg=
"names of member "+std::to_string(
i)+
" differ (";
306 msg=
"values of member "+std::to_string(
i)+
" differ (";
314 msg+=
"\nenum declarations at\n";
315 msg+=
t1.source_location().as_string()+
" and\n";
316 msg+=
t1.source_location().as_string();
331 msg=
"parameter counts differ (";
350 msg=
"return types differ";
374 msg=
"parameter types differ";
382 msg=
"conflict on POD";
387 error() <<
"reason for conflict at "
396 debug() <<
"<END DEPTH " << depth <<
">" <<
eom;
403 const std::string &msg)
409 error() <<
"old definition in module '" << old_symbol.module <<
"' "
412 error() <<
"new definition in module '" << new_symbol.module <<
"' "
420 const std::string &msg)
424 warning() <<
"warning: " << msg <<
" \""
427 warning() <<
"old definition in module " << old_symbol.module <<
" "
430 warning() <<
"new definition in module " << new_symbol.module <<
" "
493 "implicit function declaration");
498 "implicit function declaration");
511 "ignoring conflicting implicit function declaration");
516 "implicit function declaration");
520 ((
old_t.parameters().empty() &&
521 old_t.has_ellipsis() &&
523 (
new_t.parameters().empty() &&
524 new_t.has_ellipsis() &&
527 if(
old_t.parameters().empty() &&
528 old_t.has_ellipsis() &&
543 "function declaration conflicts with with weak definition");
557 "ignoring conflicting weak function declaration");
571 "ignoring conflicting function alias declaration");
582 "ignoring conflicting function declarations");
584 if(
old_t.parameters().size()<
new_t.parameters().size())
592 else if((
old_t.parameters().size()<
new_t.parameters().size() &&
594 !
old_t.has_ellipsis()) ||
595 (
old_t.parameters().size()>
new_t.parameters().size() &&
597 !
new_t.has_ellipsis()))
602 "conflicting parameter counts of function declarations");
613 typedef std::deque<std::pair<typet, typet> >
conflictst;
618 std::make_pair(
old_t.return_type(),
new_t.return_type()));
620 code_typet::parameterst::const_iterator
630 std::make_pair(
o_it->type(),
n_it->type()));
639 "conflicting parameter counts of function declarations");
654 "conflicting parameter counts of function declarations");
674 warn_msg=
"void/non-void return type conflict on function";
685 warn_msg=
"different pointer types in extern function";
695 warn_msg=
"pointer parameter types differ between "
696 "declaration and definition";
725 warn_msg=
"conflict on transparent union parameter in function";
739 warn_msg=
"non-pointer parameter types differ between "
740 "declaration and definition";
760 "conflicting function declarations");
801 warning() <<
"function '" << old_symbol.
name <<
"' in module '"
803 <<
"' is shadowed by a definition in module '"
804 << old_symbol.module <<
"'" <<
eom;
810 "duplicate definition of function");
828 if(
info.o_symbols.insert(identifier).second)
832 info.o_symbols.erase(identifier);
845 if(
info.n_symbols.insert(identifier).second)
849 info.n_symbols.erase(identifier);
858 info.set_to_new=
true;
871 info.set_to_new=
true;
879 info.set_to_new =
true;
897 else if(
t1.id()!=
t2.id())
906 bool s=
info.set_to_new;
912 "conflicting pointer types for variable");
919 "conflicting pointer types for variable");
922 if(
info.old_symbol.is_extern && !
info.new_symbol.is_extern)
924 info.set_to_new =
true;
940 info.old_symbol.is_weak)
942 info.set_to_new=
true;
946 info.new_symbol.is_weak)
959 "conflicting array sizes for variable");
976 struct_union_typet::componentst::const_iterator
982 if(
it1->get_name()!=
it2->get_name() ||
1005 set_to_new=
info.set_to_new;
1015 bool set_to_new =
false;
1041 "conflicting types for variable");
1081 warning() <<
"warning: conflicting initializers for"
1082 <<
" variable \"" << old_symbol.
name <<
"\"\n";
1083 warning() <<
"using old value in module " << old_symbol.module <<
" "
1086 warning() <<
"ignoring new value in module " << new_symbol.module <<
" "
1114 "conflicting definition for symbol");
1145 "conflicting definition for symbol");
1151 if(old_symbol.
type==new_symbol.
type)
1228 "unexpected difference between type symbols");
1240 if(old_symbol.
type==new_symbol.
type)
1313 std::deque<irep_idt> queue(
1316 while(!queue.empty())
1321 const std::unordered_set<irep_idt> &
u =
used_by[id];
1323 for(
const auto &
dep :
u)
1326 queue.push_back(
dep);
1328 debug() <<
"LINKING: needs to be renamed (dependency): "
1355 debug() <<
"LINKING: renaming " <<
id <<
" to "
1381 symbol.
name = it->second;
1446 symbol_tablet::symbolst::const_iterator
m_it =
1478 return linking.typecheck_main();
void base_type(typet &type, const namespacet &ns)
bool base_type_eq(const typet &type1, const typet &type2, const namespacet &ns)
Check types for equality across all levels of hierarchy.
const c_enum_typet & to_c_enum_type(const typet &type)
Cast a typet to a c_enum_typet.
const c_enum_tag_typet & to_c_enum_tag_type(const typet &type)
Cast a typet to a c_enum_tag_typet.
const union_typet & to_union_type(const typet &type)
Cast a typet to a union_typet.
const union_tag_typet & to_union_tag_type(const typet &type)
Cast a typet to a union_tag_typet.
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
const exprt & size() const
const typet & element_type() const
The type of the elements of the array.
const memberst & members() const
std::vector< c_enum_membert > memberst
bool replace_symbol_expr(symbol_exprt &dest) const override
std::vector< parametert > parameterst
const parameterst & parameters() const
const typet & return_type() const
A constant literal expression.
Operator to dereference a pointer.
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Base class for all expressions.
const source_locationt & find_source_location() const
Get a source_locationt from the expression or from its operands (non-recursively).
typet & type()
Return the type of the expression.
Unbounded, signed integers (mathematical integers, not bitvectors)
bool get_bool(const irep_idt &name) const
const irep_idt & id() const
void duplicate_non_type_symbol(symbolt &old_symbol, symbolt &new_symbol)
bool adjust_object_type(const symbolt &old_symbol, const symbolt &new_symbol, bool &set_to_new)
bool needs_renaming_type(const symbolt &old_symbol, const symbolt &new_symbol)
rename_symbolt rename_symbol
void copy_symbols(const std::unordered_map< irep_idt, irep_idt > &)
bool adjust_object_type_rec(const typet &type1, const typet &type2, adjust_type_infot &info)
bool needs_renaming_non_type(const symbolt &old_symbol, const symbolt &new_symbol)
std::unordered_map< irep_idt, irep_idt > rename_symbols(const std::unordered_set< irep_idt > &needs_to_be_renamed)
irep_idt rename(const irep_idt &)
symbol_table_baset & main_symbol_table
std::unordered_map< irep_idt, std::unordered_set< irep_idt > > used_byt
std::string expr_to_string(const irep_idt &identifier, const exprt &expr) const
void detailed_conflict_report_rec(const symbolt &old_symbol, const symbolt &new_symbol, const typet &type1, const typet &type2, unsigned depth, exprt &conflict_path)
void do_type_dependencies(std::unordered_set< irep_idt > &)
const symbol_table_baset & src_symbol_table
void link_warning(const symbolt &old_symbol, const symbolt &new_symbol, const std::string &msg)
void duplicate_object_symbol(symbolt &old_symbol, symbolt &new_symbol)
casting_replace_symbolt object_type_updates
std::string type_to_string(const irep_idt &identifier, const typet &type) const
std::unordered_set< irep_idt > renamed_ids
void duplicate_type_symbol(symbolt &old_symbol, const symbolt &new_symbol)
std::string type_to_string_verbose(const symbolt &symbol, const typet &type) const
void detailed_conflict_report(const symbolt &old_symbol, const symbolt &new_symbol, const typet &type1, const typet &type2)
bool needs_renaming(const symbolt &old_symbol, const symbolt &new_symbol)
void duplicate_code_symbol(symbolt &old_symbol, symbolt &new_symbol)
void link_error(const symbolt &old_symbol, const symbolt &new_symbol, const std::string &msg)
Extract member of struct or union.
const exprt & compound() const
source_locationt source_location
mstreamt & warning() const
mstreamt & result() const
const union_typet & follow_tag(const union_tag_typet &) const
Follow type tag of union type.
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
void insert_type(const irep_idt &old_id, const irep_idt &new_id)
void insert_expr(const irep_idt &old_id, const irep_idt &new_id)
void insert(const class symbol_exprt &old_expr, const exprt &new_expr)
Sets old_expr to be replaced by new_expr if we don't already have a replacement; otherwise does nothi...
const componentst & components() const
bool is_incomplete() const
A struct/union may be incomplete.
std::vector< componentt > componentst
Expression to hold a symbol (variable)
static symbol_exprt typeless(const irep_idt &id)
Generate a symbol_exprt without a proper type.
const irep_idt & get_identifier() const
symbolt & get_writeable_ref(const irep_idt &name)
Find a symbol in the symbol table for read-write access.
const symbolst & symbols
Read-only field, used to look up symbols given their names.
bool has_symbol(const irep_idt &name) const
Check whether a symbol exists in the symbol table.
bool add(const symbolt &symbol)
Add a new symbol to the symbol table.
source_locationt location
Source code location of definition of symbol.
class symbol_exprt symbol_expr() const
Produces a symbol_exprt for a symbol.
typet type
Type of symbol.
irep_idt name
The unique identifier.
const irep_idt & display_name() const
Return language specific display name if present.
exprt value
Initial value of symbol.
const irep_idt & get_identifier() const
Semantic type conversion.
static exprt conditional_cast(const exprt &expr, const typet &type)
The type of an expression, extends irept.
void find_type_and_expr_symbols(const exprt &src, find_symbols_sett &dest)
std::unordered_set< irep_idt > find_symbols_sett
std::string get_base_name(const std::string &in, bool strip_suffix)
cleans a filename from path and extension
const std::string & id2string(const irep_idt &d)
std::string from_expr(const namespacet &ns, const irep_idt &identifier, const exprt &expr)
std::string type_to_name(const namespacet &ns, const irep_idt &identifier, const typet &type)
std::string from_type(const namespacet &ns, const irep_idt &identifier, const typet &type)
bool linking(symbol_tablet &dest_symbol_table, const symbol_tablet &new_symbol_table, message_handlert &message_handler)
Merges the symbol table new_symbol_table into dest_symbol_table, renaming symbols from new_symbol_tab...
static const typet & follow_tags_symbols(const namespacet &ns, const typet &type)
bool is_true(const literalt &l)
API to expression classes for Pointers.
const pointer_typet & to_pointer_type(const typet &type)
Cast a typet to a pointer_typet.
const dereference_exprt & to_dereference_expr(const exprt &expr)
Cast an exprt to a dereference_exprt.
optionalt< mp_integer > pointer_offset_bits(const typet &type, const namespacet &ns)
bool simplify(exprt &expr, const namespacet &ns)
exprt simplify_expr(exprt src, const namespacet &ns)
#define UNREACHABLE
This should be used to mark dead code.
const index_exprt & to_index_expr(const exprt &expr)
Cast an exprt to an index_exprt.
const member_exprt & to_member_expr(const exprt &expr)
Cast an exprt to a member_exprt.
const code_typet & to_code_type(const typet &type)
Cast a typet to a code_typet.
const struct_typet & to_struct_type(const typet &type)
Cast a typet to a struct_typet.
const struct_tag_typet & to_struct_tag_type(const typet &type)
Cast a typet to a struct_tag_typet.
const array_typet & to_array_type(const typet &type)
Cast a typet to an array_typet.
const struct_union_typet & to_struct_union_type(const typet &type)
Cast a typet to a struct_union_typet.
const tag_typet & to_tag_type(const typet &type)
Cast a typet to a tag_typet.
void replace(const union_find_replacet &replace_map, string_not_contains_constraintt &constraint)
static bool failed(bool error_indicator)
const type_with_subtypet & to_type_with_subtype(const typet &type)