diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 37d322a61f5658a22ff6f71dc95f630c65a6d72c..ef950ff5425facecc22ea86668ce383e73f8c7f4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +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 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index a0145a0d0ad5e0a709d6d892a366c9a06cf8eb03..5544f2259d6b2f0d00375cc40dc5aede36a5e5e5 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index af93d21eb559d90e8d7bf9a91f51a06936235d61..41d311a386062001d550b672f79ad44c0c6c476e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +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 diff --git a/gcc/testsuite/g++.dg/inherit/ptrmem1.C b/gcc/testsuite/g++.dg/inherit/ptrmem1.C new file mode 100644 index 0000000000000000000000000000000000000000..375efc811f6745b5fac5a3697f86cd436c156095 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/ptrmem1.C @@ -0,0 +1,21 @@ +// 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); +}