aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gimplify.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/expr/volatile1.C9
4 files changed, 29 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a89a70f..c7dccbd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-08-31 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/23167
+ * gimplify.c (gimplify_expr): Handle TREE_ADDRESSABLE types when
+ generating synthetic loads from volatile lvalues.
+
005-09-02 Nick Clifton <nickc@redhat.com>
* config/stormy16/stormy16-lib2.c (__popcounthi2, __parityhi2,
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 7d76d66..c72e09e 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -4454,7 +4454,15 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
/* Historically, the compiler has treated a bare
reference to a volatile lvalue as forcing a load. */
tree type = TYPE_MAIN_VARIANT (TREE_TYPE (*expr_p));
- tree tmp = create_tmp_var (type, "vol");
+ /* Normally, we do want to create a temporary for a
+ TREE_ADDRESSABLE type because such a type should not be
+ copied by bitwise-assignment. However, we make an
+ exception here, as all we are doing here is ensuring that
+ we read the bytes that make up the type. We use
+ create_tmp_var_raw because create_tmp_var will abort when
+ given a TREE_ADDRESSSABLE type. */
+ tree tmp = create_tmp_var_raw (type, "vol");
+ gimple_add_tmp_var (tmp);
*expr_p = build (MODIFY_EXPR, type, tmp, *expr_p);
}
else
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cfe3941..6da1500 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-08-31 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/23167
+ * g++.dg/expr/volatile1.C: New test.
+
2005-09-02 Andrew Pinski <pinskia@physics.uc.edu>
PR middle-end/23547
diff --git a/gcc/testsuite/g++.dg/expr/volatile1.C b/gcc/testsuite/g++.dg/expr/volatile1.C
new file mode 100644
index 0000000..712c9e0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/expr/volatile1.C
@@ -0,0 +1,9 @@
+// PR c++/23167
+
+struct dom
+{
+ static int tostr();
+ void eval_old() volatile{tostr();}
+ ~dom() throw();
+};
+