aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2006-06-30 16:48:42 -0400
committerJason Merrill <jason@gcc.gnu.org>2006-06-30 16:48:42 -0400
commit481ac1e92915972d9ba04173d86f1ee50199d1ff (patch)
treea2144b76f395915e065b07680d2bf3f9f44f4363 /gcc
parent17a9fbc4575249a4abc8e5891836b8f8e21ef8c3 (diff)
downloadgcc-481ac1e92915972d9ba04173d86f1ee50199d1ff.zip
gcc-481ac1e92915972d9ba04173d86f1ee50199d1ff.tar.gz
gcc-481ac1e92915972d9ba04173d86f1ee50199d1ff.tar.bz2
re PR c++/26577 (ICE in cp_expr_size with volatile and non POD)
PR c++/26577 * call.c (build_new_method_call): Force evaluation of the instance pointer, not the object. From-SVN: r115105
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/call.c4
-rw-r--r--gcc/testsuite/g++.dg/init/volatile1.C16
3 files changed, 24 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 18551fb..29888c7 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2006-06-30 Jason Merrill <jason@redhat.com>
+
+ PR c++/26577
+ * call.c (build_new_method_call): Force evaluation of the
+ instance pointer, not the object.
+
2006-06-30 Kazu Hirata <kazu@codesourcery.com>
* decl2.c: Fix a comment typo.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 970fce7..ea89cdf 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -5501,9 +5501,9 @@ build_new_method_call (tree instance, tree fns, tree args,
none-the-less evaluated. */
if (TREE_CODE (TREE_TYPE (fn)) != METHOD_TYPE
&& !is_dummy_object (instance_ptr)
- && TREE_SIDE_EFFECTS (instance))
+ && TREE_SIDE_EFFECTS (instance_ptr))
call = build2 (COMPOUND_EXPR, TREE_TYPE (call),
- instance, call);
+ instance_ptr, call);
}
}
}
diff --git a/gcc/testsuite/g++.dg/init/volatile1.C b/gcc/testsuite/g++.dg/init/volatile1.C
new file mode 100644
index 0000000..9080ed5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/volatile1.C
@@ -0,0 +1,16 @@
+// PR c++/26577
+// The call to bar() was causing an inappropriate dereference of *this,
+// which led to an abort in cp_expr_size.
+
+struct A
+{
+ A(const A&);
+ A& operator=(const A&);
+ static void bar();
+ void baz() volatile;
+};
+
+void A::baz() volatile
+{
+ bar();
+}