aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/cvt.c2
-rw-r--r--gcc/cp/decl.c2
-rw-r--r--gcc/cp/tree.c5
-rw-r--r--gcc/testsuite/g++.dg/other/component1.C6
-rw-r--r--gcc/testsuite/g++.dg/warn/noeffect8.C12
6 files changed, 30 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 95933ac..cd1af6f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+2006-09-06 Jason Merrill <jason@redhat.com>
+
+ 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 <jason@redhat.com>
PR c++/26571
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index 710bc74..83b35d6 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 542fcbe..95f0695 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 db7e40a..89941cc 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 80b9560..601e019 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<int>; // { dg-error "statement cannot resolve" "" }
- c.g == 1; // { dg-error "invalid use of" "" }
- c.f == 1; // { dg-error "invalid use of" "" }
- c.f<int> == 1; // { dg-error "invalid use of" "" }
+ c.g == 1; // { dg-error "invalid" "" }
+ c.f == 1; // { dg-error "invalid" "" }
+ c.f<int> == 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 0000000..99d3688
--- /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" }
+}