From de5ad4cbc096f6ca683043dc57320392b7aa7e65 Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 6 Sep 2006 17:06:00 +0000 Subject: [PATCH] PR c++/26696 * cvt.c (convert_to_void): Replace a subexpression with no side effects with void_zero_node. * tree.c (is_overloaded_fn): Look through COMPONENT_REF. (get_first_fn): Ditto. * decl.c (grokdeclarator): No need to look through COMPONENT_REF. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116724 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 9 +++++++++ gcc/cp/cvt.c | 2 ++ gcc/cp/decl.c | 2 -- gcc/cp/tree.c | 5 ++++- gcc/testsuite/g++.dg/other/component1.C | 6 +++--- gcc/testsuite/g++.dg/warn/noeffect8.C | 12 ++++++++++++ 6 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/noeffect8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 95933ac0245..cd1af6f8a91 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2006-09-06 Jason Merrill + + PR c++/26696 + * cvt.c (convert_to_void): Replace a subexpression with no side + effects with void_zero_node. + * tree.c (is_overloaded_fn): Look through COMPONENT_REF. + (get_first_fn): Ditto. + * decl.c (grokdeclarator): No need to look through COMPONENT_REF. + 2006-09-05 Jason Merrill PR c++/26571 diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index 710bc74ccde..83b35d6fc76 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -960,6 +960,8 @@ convert_to_void (tree expr, const char *implicit) } expr = build1 (CONVERT_EXPR, void_type_node, expr); } + if (! TREE_SIDE_EFFECTS (expr)) + expr = void_zero_node; return expr; } diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 542fcbe40af..95f0695c6f6 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7014,8 +7014,6 @@ grokdeclarator (const cp_declarator *declarator, tree fns = TREE_OPERAND (decl, 0); dname = fns; - if (TREE_CODE (dname) == COMPONENT_REF) - dname = TREE_OPERAND (dname, 1); if (TREE_CODE (dname) != IDENTIFIER_NODE) { gcc_assert (is_overloaded_fn (dname)); diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index db7e40a9cd4..89941cc5542 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -853,7 +853,8 @@ int is_overloaded_fn (tree x) { /* A baselink is also considered an overloaded function. */ - if (TREE_CODE (x) == OFFSET_REF) + if (TREE_CODE (x) == OFFSET_REF + || TREE_CODE (x) == COMPONENT_REF) x = TREE_OPERAND (x, 1); if (BASELINK_P (x)) x = BASELINK_FUNCTIONS (x); @@ -880,6 +881,8 @@ get_first_fn (tree from) { gcc_assert (is_overloaded_fn (from)); /* A baselink is also considered an overloaded function. */ + if (TREE_CODE (from) == COMPONENT_REF) + from = TREE_OPERAND (from, 1); if (BASELINK_P (from)) from = BASELINK_FUNCTIONS (from); return OVL_CURRENT (from); diff --git a/gcc/testsuite/g++.dg/other/component1.C b/gcc/testsuite/g++.dg/other/component1.C index 80b95609d0e..601e019ae74 100644 --- a/gcc/testsuite/g++.dg/other/component1.C +++ b/gcc/testsuite/g++.dg/other/component1.C @@ -23,7 +23,7 @@ void Foo () { c.f; // { dg-error "statement cannot resolve" "" } c.f; // { dg-error "statement cannot resolve" "" } - c.g == 1; // { dg-error "invalid use of" "" } - c.f == 1; // { dg-error "invalid use of" "" } - c.f == 1; // { dg-error "invalid use of" "" } + c.g == 1; // { dg-error "invalid" "" } + c.f == 1; // { dg-error "invalid" "" } + c.f == 1; // { dg-error "invalid" "" } } diff --git a/gcc/testsuite/g++.dg/warn/noeffect8.C b/gcc/testsuite/g++.dg/warn/noeffect8.C new file mode 100644 index 00000000000..99d3688149b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noeffect8.C @@ -0,0 +1,12 @@ +// PR c++/26696 + +struct A +{ + static void f() {} +}; + +int main() +{ + A a; + a.f; // { dg-warning "not call" } +} -- 2.11.4.GIT