本文整理汇总了C++中typet::subtype方法的典型用法代码示例。如果您正苦于以下问题:C++ typet::subtype方法的具体用法?C++ typet::subtype怎么用?C++ typet::subtype使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类typet
的用法示例。
在下文中一共展示了typet::subtype方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: is_string_type
bool is_string_type(const typet &t) const
{
return
(t.id()==ID_pointer || t.id()==ID_array) &&
(t.subtype().id()==ID_signedbv || t.subtype().id()==ID_unsignedbv) &&
(to_bitvector_type(t.subtype()).get_width()==config.ansi_c.char_width);
}
示例2: typecheck_c_bit_field_type
void c_typecheck_baset::typecheck_c_bit_field_type(typet &type)
{
typecheck_type(type.subtype());
exprt &width_expr=static_cast<exprt &>(type.add(ID_size));
typecheck_expr(width_expr);
make_constant_index(width_expr);
mp_integer i;
if(to_integer(width_expr, i))
{
err_location(type);
throw "failed to convert bit field width";
}
if(i<0)
{
err_location(type);
throw "bit field width is negative";
}
const typet &base_type=follow(type.subtype());
if(base_type.id()==ID_bool)
{
if(i>1)
{
err_location(type);
throw "bit field width too large";
}
// We don't use bool, as it's really a byte long.
type.id(ID_unsignedbv);
type.set(ID_width, integer2long(i));
}
else if(base_type.id()==ID_signedbv ||
base_type.id()==ID_unsignedbv ||
base_type.id()==ID_c_enum)
{
unsigned width=base_type.get_int(ID_width);
if(i>width)
{
err_location(type);
throw "bit field width too large";
}
typet tmp(base_type);
type.swap(tmp);
type.set(ID_width, integer2string(i));
}
else
{
err_location(type);
str << "bit field with non-integer type: "
<< to_string(base_type);
throw 0;
}
}
示例3: is_complete_type
bool c_typecheck_baset::is_complete_type(const typet &type) const
{
if(type.id()==ID_incomplete_struct ||
type.id()==ID_incomplete_union)
return false;
else if(type.id()==ID_array)
{
if(to_array_type(type).size().is_nil()) return false;
return is_complete_type(type.subtype());
}
else if(type.id()==ID_struct || type.id()==ID_union)
{
const struct_union_typet::componentst &components=
to_struct_union_type(type).components();
for(struct_union_typet::componentst::const_iterator
it=components.begin();
it!=components.end();
it++)
if(!is_complete_type(it->type()))
return false;
}
else if(type.id()==ID_vector)
return is_complete_type(type.subtype());
else if(type.id()==ID_symbol)
return is_complete_type(follow(type));
return true;
}
示例4: is_void_pointer
bool is_void_pointer(const typet &type)
{
if(type.id()==ID_pointer)
{
if(type.subtype().id()==ID_empty)
return true;
return is_void_pointer(type.subtype());
}
else
return false;
}
示例5: gen_one
exprt gen_one(const typet &type)
{
const irep_idt type_id=type.id();
exprt result=constant_exprt(type);
if(type_id==ID_bool ||
type_id==ID_rational ||
type_id==ID_real ||
type_id==ID_integer ||
type_id==ID_natural)
{
result.set(ID_value, ID_1);
}
else if(type_id==ID_unsignedbv ||
type_id==ID_signedbv ||
type_id==ID_c_enum)
{
std::string value;
unsigned width=to_bitvector_type(type).get_width();
for(unsigned i=0; i<width-1; i++)
value+='0';
value+='1';
result.set(ID_value, value);
}
else if(type_id==ID_fixedbv)
{
fixedbvt fixedbv;
fixedbv.spec=to_fixedbv_type(type);
fixedbv.from_integer(1);
result=fixedbv.to_expr();
}
else if(type_id==ID_floatbv)
{
ieee_floatt ieee_float;
ieee_float.spec=to_floatbv_type(type);
ieee_float.from_integer(1);
result=ieee_float.to_expr();
}
else if(type_id==ID_complex)
{
result=exprt(ID_complex, type);
result.operands().resize(2);
result.op0()=gen_one(type.subtype());
result.op1()=gen_zero(type.subtype());
}
else
result.make_nil();
return result;
}
示例6: get_class_refs_rec
void java_bytecode_parsert::get_class_refs_rec(const typet &src)
{
if(src.id()==ID_code)
{
const code_typet &ct=to_code_type(src);
const typet &rt=ct.return_type();
get_class_refs_rec(rt);
for(const auto &p : ct.parameters())
get_class_refs_rec(p.type());
}
else if(src.id()==ID_symbol)
{
irep_idt name=src.get(ID_C_base_name);
if(has_prefix(id2string(name), "array["))
{
const typet &element_type=
static_cast<const typet &>(src.find(ID_C_element_type));
get_class_refs_rec(element_type);
}
else
parse_tree.class_refs.insert(name);
}
else if(src.id()==ID_struct)
{
const struct_typet &struct_type=to_struct_type(src);
for(const auto &c : struct_type.components())
get_class_refs_rec(c.type());
}
else if(src.id()==ID_pointer)
get_class_refs_rec(src.subtype());
}
示例7: check_template_restrictions
void cpp_typecheckt::check_template_restrictions(
const irept &cpp_name,
const irep_idt &final_identifier,
const typet &final_type)
{
if(final_type.id()==ID_template)
{
// subtype must be class or function
if(final_type.subtype().id()!=ID_struct &&
final_type.subtype().id()!=ID_code)
{
err_location(cpp_name);
str << "template only allowed with classes or functions,"
" but got `" << to_string(final_type.subtype()) << "'";
throw 0;
}
}
}
示例8: typecheck_type
void c_typecheck_baset::typecheck_type(typet &type)
{
// we first convert, and then check
// do we have alignment?
if(type.find(ID_C_alignment).is_not_nil())
{
exprt &alignment=static_cast<exprt &>(type.add(ID_C_alignment));
if(alignment.id()!=ID_default)
{
typecheck_expr(alignment);
make_constant(alignment);
}
}
if(type.id()==ID_code)
typecheck_code_type(to_code_type(type));
else if(type.id()==ID_array)
typecheck_array_type(to_array_type(type));
else if(type.id()==ID_pointer)
typecheck_type(type.subtype());
else if(type.id()==ID_struct ||
type.id()==ID_union)
typecheck_compound_type(to_struct_union_type(type));
else if(type.id()==ID_c_enum)
{
}
else if(type.id()==ID_c_bitfield)
typecheck_c_bit_field_type(type);
else if(type.id()==ID_typeof)
typecheck_typeof_type(type);
else if(type.id()==ID_symbol)
typecheck_symbol_type(type);
else if(type.id()==ID_vector)
typecheck_vector_type(to_vector_type(type));
else if(type.id()==ID_custom_unsignedbv ||
type.id()==ID_custom_signedbv ||
type.id()==ID_custom_floatbv ||
type.id()==ID_custom_fixedbv)
typecheck_custom_type(type);
// do a bit of rule checking
if(type.get_bool(ID_C_restricted) &&
type.id()!=ID_pointer &&
type.id()!=ID_array)
{
err_location(type);
error("only a pointer can be 'restrict'");
throw 0;
}
}
示例9: typecheck_type
void java_bytecode_typecheckt::typecheck_type(typet &type)
{
if(type.id()==ID_symbol)
{
irep_idt identifier=to_symbol_type(type).get_identifier();
symbol_tablet::symbolst::const_iterator s_it=
symbol_table.symbols.find(identifier);
// must exist already in the symbol table
if(s_it==symbol_table.symbols.end())
{
error() << "failed to find type symbol "<< identifier << eom;
throw 0;
}
assert(s_it->second.is_type);
}
else if(type.id()==ID_pointer)
{
typecheck_type(type.subtype());
}
else if(type.id()==ID_array)
{
typecheck_type(type.subtype());
typecheck_expr(to_array_type(type).size());
}
else if(type.id()==ID_code)
{
code_typet &code_type=to_code_type(type);
typecheck_type(code_type.return_type());
code_typet::parameterst ¶meters=code_type.parameters();
for(code_typet::parameterst::iterator
it=parameters.begin(); it!=parameters.end(); it++)
typecheck_type(it->type());
}
}
示例10: is_const_type
bool remove_const_function_pointerst::is_const_type(const typet &type) const
{
c_qualifierst qualifers(type);
if(type.id()==ID_array)
{
c_qualifierst array_type_qualifers(type.subtype());
return qualifers.is_constant || array_type_qualifers.is_constant;
}
else
{
return qualifers.is_constant;
}
}
示例11: gen_zero
exprt gen_zero(const typet &type)
{
exprt result;
const irep_idt type_id=type.id();
result=constant_exprt(type);
if(type_id==ID_rational ||
type_id==ID_real ||
type_id==ID_integer ||
type_id==ID_natural ||
type_id==ID_complex ||
type_id==ID_c_enum)
{
result.set(ID_value, ID_0);
}
else if(type_id==ID_unsignedbv ||
type_id==ID_signedbv ||
type_id==ID_verilogbv ||
type_id==ID_floatbv ||
type_id==ID_fixedbv)
{
std::string value;
unsigned width=to_bitvector_type(type).get_width();
for(unsigned i=0; i<width; i++)
value+='0';
result.set(ID_value, value);
}
else if(type_id==ID_complex)
{
result=exprt(ID_complex, type);
exprt sub_zero=gen_zero(type.subtype());
result.operands().resize(2, sub_zero);
}
else if(type_id==ID_bool)
{
result.make_false();
}
else if(type_id==ID_pointer)
{
result.set(ID_value, ID_NULL);
}
else
result.make_nil();
return result;
}
示例12: restrict_bv_size
bool restrict_bv_size(typet &type, const size_t width_in_bits)
{
const irep_idt &type_id=type.id();
if (ID_code == type_id)
return restrict_bv_size(to_code_type(type), width_in_bits);
if (ID_struct == type_id || ID_union == type_id)
return restrict_bv_size(to_struct_union_type(type), width_in_bits);
if (static_cast<const typet &>(type).subtype().is_not_nil())
restrict_bv_size(type.subtype(), width_in_bits);
if (!is_bv_type(type)) return false;
bitvector_typet &bvtype=to_bitvector_type(type);
if (width_in_bits >= bvtype.get_width()) return false;
to_bitvector_type(type).set_width(width_in_bits);
return true;
}
示例13: replace
bool replace_symbolt::replace(typet &dest)
{
if(dest.has_subtype())
replace(dest.subtype());
Forall_subtypes(it, dest)
replace(*it);
if(dest.id()=="struct" ||
dest.id()=="union")
{
struct_typet &struct_type = to_struct_type(dest);
struct_typet::componentst &components = struct_type.components();
for (struct_typet::componentst::iterator it = components.begin();
it!=components.end();
it++)
replace(*it);
}
else if(dest.is_code())
{
code_typet &code_type=to_code_type(dest);
code_typet::argumentst &arguments=code_type.arguments();
for (code_typet::argumentst::iterator it = arguments.begin();
it!=arguments.end();
it++)
replace(*it);
}
if(dest.id()=="symbol")
{
type_mapt::const_iterator it=
type_map.find(dest.identifier());
if(it!=type_map.end())
{
dest=it->second;
return false;
}
}
return true;
}
示例14: alignment
unsigned alignment(const typet &type, const namespacet &ns)
{
if(type.id()==ID_array ||
type.id()==ID_incomplete_array)
return alignment(type.subtype(), ns);
else if(type.id()==ID_struct || type.id()==ID_union)
{
const struct_union_typet::componentst &components=
to_struct_union_type(type).components();
unsigned result=1;
// get the max
// (should really be the smallest common denominator)
for(struct_union_typet::componentst::const_iterator
it=components.begin();
it!=components.end();
it++)
result=std::max(result, alignment(it->type(), ns));
return result;
}
else if(type.id()==ID_unsignedbv ||
type.id()==ID_signedbv ||
type.id()==ID_fixedbv ||
type.id()==ID_floatbv)
{
unsigned width=type.get_int(ID_width);
return width%8?width/8+1:width/8;
}
else if(type.id()==ID_pointer)
{
unsigned width=config.ansi_c.pointer_width;
return width%8?width/8+1:width/8;
}
else if(type.id()==ID_symbol)
return alignment(ns.follow(type), ns);
return 1;
}
示例15: sizeof_rec
exprt c_sizeoft::sizeof_rec(const typet &type)
{
exprt dest;
if(type.id()==ID_signedbv ||
type.id()==ID_unsignedbv ||
type.id()==ID_floatbv ||
type.id()==ID_fixedbv ||
type.id()==ID_c_enum ||
type.id()==ID_incomplete_c_enum)
{
// We round up to bytes.
// See special treatment for bit-fields below.
unsigned bits=type.get_int(ID_width);
unsigned bytes=bits/8;
if((bits%8)!=0) bytes++;
dest=from_integer(bytes, size_type());
}
else if(type.id()==ID_pointer)
{
// the following is an MS extension
if(type.get_bool(ID_C_ptr32))
return from_integer(4, size_type());
unsigned bits=config.ansi_c.pointer_width;
unsigned bytes=bits/8;
if((bits%8)!=0) bytes++;
dest=from_integer(bytes, size_type());
}
else if(type.id()==ID_bool)
{
// We fit booleans into a byte.
dest=from_integer(1, size_type());
}
else if(type.id()==ID_array)
{
const exprt &size_expr=
to_array_type(type).size();
if(size_expr.is_nil())
{
// treated like an empty array
dest=from_integer(0, size_type());
}
else
{
exprt tmp_dest=sizeof_rec(type.subtype());
if(tmp_dest.is_nil())
return tmp_dest;
mp_integer a, b;
if(!to_integer(tmp_dest, a) &&
!to_integer(size_expr, b))
{
dest=from_integer(a*b, size_type());
}
else
{
dest.id(ID_mult);
dest.type()=size_type();
dest.copy_to_operands(size_expr);
dest.move_to_operands(tmp_dest);
c_implicit_typecast(dest.op0(), dest.type(), ns);
c_implicit_typecast(dest.op1(), dest.type(), ns);
}
}
}
else if(type.id()==ID_struct)
{
const struct_typet::componentst &components=
to_struct_type(type).components();
dest=from_integer(0, size_type());
mp_integer bit_field_width=0;
for(struct_typet::componentst::const_iterator
it=components.begin();
it!=components.end();
it++)
{
const typet &sub_type=ns.follow(it->type());
if(it->get_bool(ID_is_type))
{
}
else if(sub_type.id()==ID_code)
{
}
else if(it->get_is_bit_field())
{
// this needs to be a signedbv/unsignedbv/enum
if(sub_type.id()!=ID_signedbv &&
sub_type.id()!=ID_unsignedbv &&
sub_type.id()!=ID_c_enum)
return nil_exprt();
// We just sum them up.
//.........这里部分代码省略.........