Skip to content

Commit a8f9fd9

Browse files
committed
C++ front-end: support pointer to non-method members
1 parent 774060b commit a8f9fd9

File tree

6 files changed

+37
-17
lines changed

6 files changed

+37
-17
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
KNOWNBUG
1+
CORE
22
main.cpp
33

44
^EXIT=0$
55
^SIGNAL=0$
6-
^VERIFICATION SUCCESSFUL$
76
--
87
^warning: ignoring
9-
--
10-
should exercise cpp_typecheckt::standard_conversion_pointer_to_member, cpp/cpp_typecheck_conversion.cpp:610 once other bugs are fixed
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
KNOWNBUG
1+
CORE
22
main.cpp
33

44
^EXIT=(64|1)$
55
^SIGNAL=0$
6-
invalid implicit conversion
6+
pointer-to-member type error
77
^CONVERSION ERROR$
88
--
99
^warning: ignoring
10-
--
11-
should exercise cpp_typecheckt::standard_conversion_pointer_to_member, cpp/cpp_typecheck_conversion.cpp:610 once other bugs are fixed

src/cpp/cpp_typecheck_conversions.cpp

+17
Original file line numberDiff line numberDiff line change
@@ -1595,9 +1595,11 @@ bool cpp_typecheckt::cast_away_constness(
15951595

15961596
if(is_reference(nt1))
15971597
nt1.remove(ID_C_reference);
1598+
nt1.remove("to-member");
15981599

15991600
if(is_reference(nt2))
16001601
nt2.remove(ID_C_reference);
1602+
nt2.remove("to-member");
16011603

16021604
// substitute final subtypes
16031605
std::vector<typet> snt1;
@@ -2021,6 +2023,21 @@ bool cpp_typecheckt::static_typecast(
20212023
return true;
20222024
}
20232025
}
2026+
else if(
2027+
type.find("to-member").is_nil() &&
2028+
e.type().find("to-member").is_not_nil())
2029+
{
2030+
if(type.subtype() != e.type().subtype())
2031+
return false;
2032+
2033+
struct_typet from_struct = to_struct_type(
2034+
follow(static_cast<const typet &>(e.type().find("to-member"))));
2035+
2036+
new_expr = e;
2037+
new_expr.type().add("to-member") = from_struct;
2038+
2039+
return true;
2040+
}
20242041
else
20252042
return false;
20262043
}

src/cpp/cpp_typecheck_expr.cpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,13 @@ void cpp_typecheckt::typecheck_expr_address_of(exprt &expr)
748748
}
749749
}
750750
}
751+
else if(
752+
expr.op0().id() == ID_ptrmember && expr.op0().op0().id() == "cpp-this")
753+
{
754+
expr.type() = pointer_type(expr.op0().type());
755+
expr.type().add("to-member") = expr.op0().op0().type().subtype();
756+
return;
757+
}
751758

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

2629-
if(expr.op1().type().subtype().id()!=ID_code)
2630-
{
2631-
error().source_location=expr.find_source_location();
2632-
error() << "pointers to data member are not supported" << eom;
2633-
throw 0;
2634-
}
2635-
26362636
typecheck_expr_main(expr.op1());
26372637

26382638
if(expr.op0().type().id()!=ID_pointer)

src/cpp/cpp_typecheck_initializer.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ void cpp_typecheckt::convert_initializer(symbolt &symbol)
133133

134134
typecheck_expr(symbol.value);
135135

136+
if(symbol.value.type().find("to-member").is_not_nil())
137+
symbol.type.add("to-member") = symbol.value.type().find("to-member");
138+
136139
if(symbol.value.id()==ID_initializer_list ||
137140
symbol.value.id()==ID_string_constant)
138141
{

src/cpp/cpp_typecheck_resolve.cpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -309,11 +309,16 @@ exprt cpp_typecheck_resolvet::convert_identifier(
309309
}
310310
else
311311
{
312-
// this has to be a method
312+
// this has to be a method or form a pointer-to-member expression
313313
if(identifier.is_method)
314314
e=cpp_symbol_expr(cpp_typecheck.lookup(identifier.identifier));
315315
else
316-
e.make_nil();
316+
{
317+
e.id(ID_ptrmember);
318+
e.copy_to_operands(
319+
exprt("cpp-this", pointer_type(compound_symbol.type)));
320+
e.type() = type;
321+
}
317322
}
318323
}
319324
}

0 commit comments

Comments
 (0)