Commit e8632777 by Mark Mitchell Committed by Mark Mitchell

re PR c++/14803 (Spurious warnings on conversion of pointers to member functions)

	PR c++/14803
	* typeck.c (get_delta_difference): Call fold before returning the
	value.

	PR c++/14803
	* g++.dg/inherit/ptrmem1.C: New test.

From-SVN: r80331
parent 717415ad
2004-04-01 Mark Mitchell <mark@codesourcery.com>
PR c++/14803
* typeck.c (get_delta_difference): Call fold before returning the
value.
2004-04-01 Richard Henderson <rth@redhat.com>
PR c++/14804
......
......@@ -5273,51 +5273,53 @@ get_delta_difference (tree from, tree to, int force)
tree binfo;
tree virt_binfo;
base_kind kind;
tree result;
/* Assume no conversion is required. */
result = integer_zero_node;
binfo = lookup_base (to, from, ba_check, &kind);
if (kind == bk_inaccessible || kind == bk_ambig)
{
error (" in pointer to member function conversion");
goto error;
}
if (!binfo)
error (" in pointer to member function conversion");
else if (!binfo)
{
if (!force)
{
error_not_base_type (from, to);
error (" in pointer to member conversion");
goto error;
}
binfo = lookup_base (from, to, ba_check, &kind);
if (!binfo)
goto error;
else
{
binfo = lookup_base (from, to, ba_check, &kind);
if (binfo)
{
virt_binfo = binfo_from_vbase (binfo);
if (virt_binfo)
/* This is a reinterpret cast, we choose to do nothing. */
warning ("pointer to member cast via virtual base `%T'",
BINFO_TYPE (virt_binfo));
else
result = size_diffop (size_zero_node, BINFO_OFFSET (binfo));
}
}
}
else
{
virt_binfo = binfo_from_vbase (binfo);
if (virt_binfo)
{
/* This is a reinterpret cast, we choose to do nothing. */
warning ("pointer to member cast via virtual base `%T'",
if (!virt_binfo)
result = BINFO_OFFSET (binfo);
else
{
/* This is a reinterpret cast, we choose to do nothing. */
if (force)
warning ("pointer to member cast via virtual base `%T'",
BINFO_TYPE (virt_binfo));
else
error ("pointer to member conversion via virtual base `%T'",
BINFO_TYPE (virt_binfo));
goto error;
}
return convert_to_integer (ptrdiff_type_node,
size_diffop (size_zero_node,
BINFO_OFFSET (binfo)));
}
}
virt_binfo = binfo_from_vbase (binfo);
if (!virt_binfo)
return convert_to_integer (ptrdiff_type_node, BINFO_OFFSET (binfo));
/* This is a reinterpret cast, we choose to do nothing. */
if (force)
warning ("pointer to member cast via virtual base `%T'",
BINFO_TYPE (virt_binfo));
else
error ("pointer to member conversion via virtual base `%T'",
BINFO_TYPE (virt_binfo));
error:
return convert_to_integer(ptrdiff_type_node, integer_zero_node);
return fold (convert_to_integer (ptrdiff_type_node, result));
}
/* Return a constructor for the pointer-to-member-function TYPE using
......
2004-04-01 Mark Mitchell <mark@codesourcery.com>
PR c++/14803
* g++.dg/inherit/ptrmem1.C: New test.
2004-04-01 Jakub Jelinek <jakub@redhat.com>
PR c++/14755
......
// PR c++/14803
// { dg-options "-Werror" }
struct sc_module { int member; };
struct sc_signal_in_if { bool state; };
typedef void (sc_module::*SC_ENTRY_FUNC)();
class sc_clock : public sc_signal_in_if, public sc_module
{
public:
sc_clock();
void posedge_action();
SC_ENTRY_FUNC fptr;
};
sc_clock::sc_clock()
{
fptr = static_cast<SC_ENTRY_FUNC>(&sc_clock::posedge_action);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment