From 39da04462db4ec264296184a8adfdae76a152b67 Mon Sep 17 00:00:00 2001 From: mmitchel Date: Fri, 2 Sep 2005 15:39:04 +0000 Subject: [PATCH] PR c++/23167 * gimplify.c (gimplify_expr): Handle TREE_ADDRESSABLE types when generating synthetic loads from volatile lvalues. PR c++/23167 * g++.dg/expr/volatile1.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@103782 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/gimplify.c | 10 +++++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/expr/volatile1.C | 9 +++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/expr/volatile1.C 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 + + PR c++/23167 + * gimplify.c (gimplify_expr): Handle TREE_ADDRESSABLE types when + generating synthetic loads from volatile lvalues. + 005-09-02 Nick Clifton * 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 + + PR c++/23167 + * g++.dg/expr/volatile1.C: New test. + 2005-09-02 Andrew Pinski 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(); +}; + -- 2.7.4