diff options
author | Jason Merrill <jason@redhat.com> | 2006-06-30 16:48:42 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2006-06-30 16:48:42 -0400 |
commit | 481ac1e92915972d9ba04173d86f1ee50199d1ff (patch) | |
tree | a2144b76f395915e065b07680d2bf3f9f44f4363 | |
parent | 17a9fbc4575249a4abc8e5891836b8f8e21ef8c3 (diff) | |
download | gcc-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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/call.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/volatile1.C | 16 |
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(); +} |