Skip to content

Introduce IDs for "to-member" and "pointer-to-member" #3658

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 3, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 30 additions & 30 deletions src/cpp/cpp_typecheck_conversions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -480,12 +480,15 @@ bool cpp_typecheckt::standard_conversion_pointer(
return true;
}

if(type.find("to-member").is_not_nil())
if(type.find(ID_to_member).is_not_nil())
return false;

if(expr.type().id() != ID_pointer ||
expr.type().find("to-member").is_not_nil())
if(
expr.type().id() != ID_pointer ||
expr.type().find(ID_to_member).is_not_nil())
{
return false;
}

typet sub_from=follow(expr.type().subtype());
typet sub_to=follow(type.subtype());
Expand Down Expand Up @@ -559,13 +562,14 @@ bool cpp_typecheckt::standard_conversion_pointer_to_member(
const typet &type,
exprt &new_expr)
{
if(type.id()!=ID_pointer ||
is_reference(type) ||
type.find("to-member").is_nil())
if(
type.id() != ID_pointer || is_reference(type) ||
type.find(ID_to_member).is_nil())
{
return false;
}

if(expr.type().id() != ID_pointer ||
expr.type().find("to-member").is_nil())
if(expr.type().id() != ID_pointer || expr.type().find(ID_to_member).is_nil())
return false;

if(type.subtype()!=expr.type().subtype())
Expand Down Expand Up @@ -609,13 +613,11 @@ bool cpp_typecheckt::standard_conversion_pointer_to_member(
return true;
}

struct_typet from_struct =
to_struct_type(follow(static_cast<const typet &>
(expr.type().find("to-member"))));
struct_typet from_struct = to_struct_type(
follow(static_cast<const typet &>(expr.type().find(ID_to_member))));

struct_typet to_struct =
to_struct_type(follow(static_cast<const typet &>
(type.find("to-member"))));
to_struct_type(follow(static_cast<const typet &>(type.find(ID_to_member))));

if(subtype_typecast(to_struct, from_struct))
{
Expand Down Expand Up @@ -1588,11 +1590,11 @@ bool cpp_typecheckt::cast_away_constness(

if(is_reference(nt1))
nt1.remove(ID_C_reference);
nt1.remove("to-member");
nt1.remove(ID_to_member);

if(is_reference(nt2))
nt2.remove(ID_C_reference);
nt2.remove("to-member");
nt2.remove(ID_to_member);

// substitute final subtypes
std::vector<typet> snt1;
Expand Down Expand Up @@ -1727,7 +1729,7 @@ bool cpp_typecheckt::dynamic_typecast(
}
else if(type.id()==ID_pointer)
{
if(type.find("to-member").is_not_nil())
if(type.find(ID_to_member).is_not_nil())
return false;

if(type.subtype().id()==ID_empty)
Expand Down Expand Up @@ -1960,8 +1962,7 @@ bool cpp_typecheckt::static_typecast(

if(type.id()==ID_pointer && e.type().id()==ID_pointer)
{
if(type.find("to-member").is_nil()
&& e.type().find("to-member").is_nil())
if(type.find(ID_to_member).is_nil() && e.type().find(ID_to_member).is_nil())
{
typet to=follow(type.subtype());
typet from=follow(e.type().subtype());
Expand Down Expand Up @@ -1994,19 +1995,18 @@ bool cpp_typecheckt::static_typecast(

return false;
}
else if(type.find("to-member").is_not_nil() &&
e.type().find("to-member").is_not_nil())
else if(
type.find(ID_to_member).is_not_nil() &&
e.type().find(ID_to_member).is_not_nil())
{
if(type.subtype()!=e.type().subtype())
return false;

struct_typet from_struct=
to_struct_type(
follow(static_cast<const typet&>(e.type().find("to-member"))));
struct_typet from_struct = to_struct_type(
follow(static_cast<const typet &>(e.type().find(ID_to_member))));

struct_typet to_struct=
to_struct_type(
follow(static_cast<const typet&>(type.find("to-member"))));
struct_typet to_struct = to_struct_type(
follow(static_cast<const typet &>(type.find(ID_to_member))));

if(subtype_typecast(from_struct, to_struct))
{
Expand All @@ -2016,17 +2016,17 @@ bool cpp_typecheckt::static_typecast(
}
}
else if(
type.find("to-member").is_nil() &&
e.type().find("to-member").is_not_nil())
type.find(ID_to_member).is_nil() &&
e.type().find(ID_to_member).is_not_nil())
{
if(type.subtype() != e.type().subtype())
return false;

struct_typet from_struct = to_struct_type(
follow(static_cast<const typet &>(e.type().find("to-member"))));
follow(static_cast<const typet &>(e.type().find(ID_to_member))));

new_expr = e;
new_expr.type().add("to-member") = from_struct;
new_expr.type().add(ID_to_member) = from_struct;

return true;
}
Expand Down
22 changes: 11 additions & 11 deletions src/cpp/cpp_typecheck_expr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ void cpp_typecheckt::typecheck_expr_main(exprt &expr)
typecheck_expr_cpp_name(expr, cpp_typecheck_fargst());
else if(expr.id()=="cpp-this")
typecheck_expr_this(expr);
else if(expr.id()=="pointer-to-member")
else if(expr.id() == ID_pointer_to_member)
convert_pmop(expr);
else if(expr.id() == ID_new_object)
{
Expand Down Expand Up @@ -718,7 +718,7 @@ void cpp_typecheckt::typecheck_expr_address_of(exprt &expr)
{
// it's a pointer to member function
const struct_tag_typet symbol(code_type.get(ID_C_member_name));
expr.op0().type().add("to-member")=symbol;
expr.op0().type().add(ID_to_member) = symbol;

if(code_type.get_bool(ID_C_is_virtual))
{
Expand All @@ -733,7 +733,7 @@ void cpp_typecheckt::typecheck_expr_address_of(exprt &expr)
expr.op0().id() == ID_ptrmember && expr.op0().op0().id() == "cpp-this")
{
expr.type() = pointer_type(expr.op0().type());
expr.type().add("to-member") = expr.op0().op0().type().subtype();
expr.type().add(ID_to_member) = expr.op0().op0().type().subtype();
return;
}

Expand Down Expand Up @@ -1999,7 +1999,7 @@ void cpp_typecheckt::typecheck_side_effect_function_call(

if(expr.function().type().id()==ID_pointer)
{
if(expr.function().type().find("to-member").is_not_nil())
if(expr.function().type().find(ID_to_member).is_not_nil())
{
const exprt &bound =
static_cast<const exprt &>(expr.function().type().find(ID_C_bound));
Expand Down Expand Up @@ -2592,8 +2592,7 @@ void cpp_typecheckt::typecheck_expr_dereference(exprt &expr)
exprt &op=expr.op0();
const typet op_type=follow(op.type());

if(op_type.id()==ID_pointer &&
op_type.find("to-member").is_not_nil())
if(op_type.id() == ID_pointer && op_type.find(ID_to_member).is_not_nil())
{
error().source_location=expr.find_source_location();
error() << "pointer-to-member must use "
Expand All @@ -2606,11 +2605,12 @@ void cpp_typecheckt::typecheck_expr_dereference(exprt &expr)

void cpp_typecheckt::convert_pmop(exprt &expr)
{
assert(expr.id()=="pointer-to-member");
assert(expr.operands().size() == 2);
PRECONDITION(expr.id() == ID_pointer_to_member);
PRECONDITION(expr.operands().size() == 2);

if(expr.op1().type().id()!=ID_pointer
|| expr.op1().type().find("to-member").is_nil())
if(
expr.op1().type().id() != ID_pointer ||
expr.op1().type().find(ID_to_member).is_nil())
{
error().source_location=expr.source_location();
error() << "pointer-to-member expected" << eom;
Expand All @@ -2620,7 +2620,7 @@ void cpp_typecheckt::convert_pmop(exprt &expr)
typet t0=expr.op0().type().id()==ID_pointer ?
expr.op0().type().subtype(): expr.op0().type();

typet t1((const typet&)expr.op1().type().find("to-member"));
typet t1((const typet &)expr.op1().type().find(ID_to_member));

t0=follow(t0);
t1=follow(t1);
Expand Down
6 changes: 3 additions & 3 deletions src/cpp/cpp_typecheck_initializer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ void cpp_typecheckt::convert_initializer(symbolt &symbol)
address_of_exprt(
lookup(resolved_expr.get(ID_component_name)).symbol_expr());

symbol.value.type().add("to-member") = resolved_expr.op0().type();
symbol.value.type().add(ID_to_member) = resolved_expr.op0().type();
}
else
UNREACHABLE;
Expand All @@ -142,8 +142,8 @@ void cpp_typecheckt::convert_initializer(symbolt &symbol)

typecheck_expr(symbol.value);

if(symbol.value.type().find("to-member").is_not_nil())
symbol.type.add("to-member") = symbol.value.type().find("to-member");
if(symbol.value.type().find(ID_to_member).is_not_nil())
symbol.type.add(ID_to_member) = symbol.value.type().find(ID_to_member);

if(symbol.value.id()==ID_initializer_list ||
symbol.value.id()==ID_string_constant)
Expand Down
4 changes: 2 additions & 2 deletions src/cpp/cpp_typecheck_type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,12 +85,12 @@ void cpp_typecheckt::typecheck_type(typet &type)
typecheck_type(type.subtype());

// Check if it is a pointer-to-member
if(type.find("to-member").is_not_nil())
if(type.find(ID_to_member).is_not_nil())
{
// these can point either to data members or member functions
// of a class

typet &class_object=static_cast<typet &>(type.add("to-member"));
typet &class_object = static_cast<typet &>(type.add(ID_to_member));

if(class_object.id()==ID_cpp_name)
{
Expand Down
5 changes: 2 additions & 3 deletions src/cpp/expr2cpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -259,12 +259,11 @@ std::string expr2cppt::convert_rec(
{
return "std::nullptr_t";
}
else if(src.id()==ID_pointer &&
src.find("to-member").is_not_nil())
else if(src.id() == ID_pointer && src.find(ID_to_member).is_not_nil())
{
typet tmp=src;
typet member;
member.swap(tmp.add("to-member"));
member.swap(tmp.add(ID_to_member));

std::string dest="("+convert_rec(member, c_qualifierst(), "")+":: *)";

Expand Down
4 changes: 2 additions & 2 deletions src/cpp/parse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3771,7 +3771,7 @@ bool Parser::rPtrToMember(irept &ptr_to_mem)
#endif

typet ptm(ID_frontend_pointer); // width gets set during conversion
irept &name = ptm.add("to-member");
irept &name = ptm.add(ID_to_member);
name=cpp_namet();
irept::subt &components=name.get_sub();

Expand Down Expand Up @@ -5377,7 +5377,7 @@ bool Parser::rPmExpr(exprt &exp)
exprt left;
left.swap(exp);

exp=exprt("pointer-to-member");
exp = exprt(ID_pointer_to_member);
exp.move_to_operands(left, right);
set_location(exp, tk);
}
Expand Down
2 changes: 2 additions & 0 deletions src/util/irep_ids.def
Original file line number Diff line number Diff line change
Expand Up @@ -720,6 +720,8 @@ IREP_ID_ONE(template_decls)
IREP_ID_ONE(throw_decl)
IREP_ID_ONE(typeid)
IREP_ID_TWO(C_quoted, #quoted)
IREP_ID_ONE(to_member)
IREP_ID_ONE(pointer_to_member)

// Projects depending on this code base that wish to extend the list of
// available ids should provide a file local_irep_ids.def in their source tree
Expand Down