diff options
author | Mark Mitchell <mark@codesourcery.com> | 2004-04-01 23:14:55 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2004-04-01 23:14:55 +0000 |
commit | e86327772eaa1f4b2c352a411afa195b30ff0c8f (patch) | |
tree | 791f1d30b9cc0f6bac96afe52db612b56b08118a /gcc | |
parent | 717415adaf2c79665b540000ca3203abaddc7629 (diff) | |
download | gcc-e86327772eaa1f4b2c352a411afa195b30ff0c8f.zip gcc-e86327772eaa1f4b2c352a411afa195b30ff0c8f.tar.gz gcc-e86327772eaa1f4b2c352a411afa195b30ff0c8f.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 68 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/ptrmem1.C | 21 |
4 files changed, 67 insertions, 33 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 37d322a..ef950ff 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 a0145a0..5544f22 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 af93d21..41d311a 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 0000000..375efc8 --- /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); +} |