diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-03-05 14:28:07 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-03-05 14:28:07 +0000 |
commit | ca9cb78a24abb2340d08f54b96513ec6ac91f6eb (patch) | |
tree | 49c6dfd417fbaef02b4a48a4c62094173d37e241 | |
parent | d9a2ed009c991e4c370bc0d896a8576dcce0998b (diff) | |
download | gcc-ca9cb78a24abb2340d08f54b96513ec6ac91f6eb.tar.gz |
PR c++/84686 - missing volatile loads.
* cvt.c (convert_to_void): Call maybe_undo_parenthesized_ref.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@258245 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/cvt.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/volatile2.C | 20 |
3 files changed, 27 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 63e0025dbb7..2db740e5913 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-03-03 Jason Merrill <jason@redhat.com> + + PR c++/84686 - missing volatile loads. + * cvt.c (convert_to_void): Call maybe_undo_parenthesized_ref. + 2018-03-03 Jakub Jelinek <jakub@redhat.com> Backported from mainline diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index 5f4b5e30a5f..5d3a47ec640 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -1053,6 +1053,8 @@ convert_to_void (tree expr, impl_conv_void implicit, tsubst_flags_t complain) || TREE_TYPE (expr) == error_mark_node) return error_mark_node; + expr = maybe_undo_parenthesized_ref (expr); + if (implicit == ICV_CAST) mark_exp_read (expr); else diff --git a/gcc/testsuite/g++.dg/tree-ssa/volatile2.C b/gcc/testsuite/g++.dg/tree-ssa/volatile2.C new file mode 100644 index 00000000000..bec60442477 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/volatile2.C @@ -0,0 +1,20 @@ +// PR c++/84686 +// { dg-additional-options -fdump-tree-gimple } +// { dg-final { scan-tree-dump-times "= i" 10 "gimple" } } + +volatile int i; + +int main() +{ + i; //evaluated (a load is performed) + (i); //unevaluated => the load shall be performed + + (void)i; //evaluated (a load is performed) + (void)(i); //unevaluated => the load shall be performed + + (void)i; //evaluated (a load is performed) + (void)(i); //unevaluated => the load shall be performed + + (i,i); // the two subexpression are evaluated + ((i),(i)); // no evaluation, => two loads shall happen +} |