Skip to content

Commit

Permalink
Merge pull request diffblue#2336 from tautschnig/c++-pointer-to-member
Browse files Browse the repository at this point in the history
C++ front-end: support pointer to non-method members
  • Loading branch information
Daniel Kroening authored Jun 11, 2018
2 parents 73d688d + a8f9fd9 commit 0216dbd
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 17 deletions.
5 changes: 1 addition & 4 deletions regression/cpp/pointer_to_member_conversion1/test.desc
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
KNOWNBUG
CORE
main.cpp

^EXIT=0$
^SIGNAL=0$
^VERIFICATION SUCCESSFUL$
--
^warning: ignoring
--
should exercise cpp_typecheckt::standard_conversion_pointer_to_member, cpp/cpp_typecheck_conversion.cpp:610 once other bugs are fixed
6 changes: 2 additions & 4 deletions regression/cpp/pointer_to_member_conversion2/test.desc
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
KNOWNBUG
CORE
main.cpp

^EXIT=(64|1)$
^SIGNAL=0$
invalid implicit conversion
pointer-to-member type error
^CONVERSION ERROR$
--
^warning: ignoring
--
should exercise cpp_typecheckt::standard_conversion_pointer_to_member, cpp/cpp_typecheck_conversion.cpp:610 once other bugs are fixed
17 changes: 17 additions & 0 deletions src/cpp/cpp_typecheck_conversions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1595,9 +1595,11 @@ bool cpp_typecheckt::cast_away_constness(

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

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

// substitute final subtypes
std::vector<typet> snt1;
Expand Down Expand Up @@ -2021,6 +2023,21 @@ bool cpp_typecheckt::static_typecast(
return true;
}
}
else if(
type.find("to-member").is_nil() &&
e.type().find("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"))));

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

return true;
}
else
return false;
}
Expand Down
14 changes: 7 additions & 7 deletions src/cpp/cpp_typecheck_expr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -748,6 +748,13 @@ void cpp_typecheckt::typecheck_expr_address_of(exprt &expr)
}
}
}
else if(
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();
return;
}

// the C front end does not know about references
const bool is_ref=is_reference(expr.type());
Expand Down Expand Up @@ -2626,13 +2633,6 @@ void cpp_typecheckt::convert_pmop(exprt &expr)
throw 0;
}

if(expr.op1().type().subtype().id()!=ID_code)
{
error().source_location=expr.find_source_location();
error() << "pointers to data member are not supported" << eom;
throw 0;
}

typecheck_expr_main(expr.op1());

if(expr.op0().type().id()!=ID_pointer)
Expand Down
3 changes: 3 additions & 0 deletions src/cpp/cpp_typecheck_initializer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,9 @@ 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.id()==ID_initializer_list ||
symbol.value.id()==ID_string_constant)
{
Expand Down
9 changes: 7 additions & 2 deletions src/cpp/cpp_typecheck_resolve.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -309,11 +309,16 @@ exprt cpp_typecheck_resolvet::convert_identifier(
}
else
{
// this has to be a method
// this has to be a method or form a pointer-to-member expression
if(identifier.is_method)
e=cpp_symbol_expr(cpp_typecheck.lookup(identifier.identifier));
else
e.make_nil();
{
e.id(ID_ptrmember);
e.copy_to_operands(
exprt("cpp-this", pointer_type(compound_symbol.type)));
e.type() = type;
}
}
}
}
Expand Down

0 comments on commit 0216dbd

Please sign in to comment.