aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2008-02-05 21:06:32 +0000
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2008-02-05 21:06:32 +0000
commite3ac9b24a77b39ecd1e954c4d34957ee9e4ac1c0 (patch)
tree3270a822480b22cb5e3633ff14ad2ae61bed170c /gcc
parentda36ba2754d0ab1b9ac9603c939e8b83f1857a30 (diff)
downloadgcc-e3ac9b24a77b39ecd1e954c4d34957ee9e4ac1c0.zip
gcc-e3ac9b24a77b39ecd1e954c4d34957ee9e4ac1c0.tar.gz
gcc-e3ac9b24a77b39ecd1e954c4d34957ee9e4ac1c0.tar.bz2
re PR fortran/35037 (VOLATILE attribute not being honored with common block variable)
PR fortran/35037 * trans-common.c (build_field): Mark fields as volatile when needed. * gfortran.dg/volatile11.f90: New test. From-SVN: r132129
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/trans-common.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/volatile11.f9040
4 files changed, 59 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 72918d8..9bd665e 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,8 @@
+2008-02-05 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ PR fortran/35037
+ * trans-common.c (build_field): Mark fields as volatile when needed.
+
2008-02-05 Tobias Burnus <burnus@net-b.de>
PR fortran/35093
diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c
index 64cee0d..a8e1126 100644
--- a/gcc/fortran/trans-common.c
+++ b/gcc/fortran/trans-common.c
@@ -318,6 +318,15 @@ build_field (segment_info *h, tree union_type, record_layout_info rli)
GFC_DECL_ASSIGN_ADDR (field) = pushdecl_top_level (addr);
}
+ /* If this field is volatile, mark it. */
+ if (h->sym->attr.volatile_)
+ {
+ tree new;
+ TREE_THIS_VOLATILE (field) = 1;
+ new = build_qualified_type (TREE_TYPE (field), TYPE_QUAL_VOLATILE);
+ TREE_TYPE (field) = new;
+ }
+
h->field = field;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 893f727..59cb304 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-02-05 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ PR fortran/35037
+ * gfortran.dg/volatile11.f90: New test.
+
2008-02-05 Jakub Jelinek <jakub@redhat.com>
PR c++/33553
diff --git a/gcc/testsuite/gfortran.dg/volatile11.f90 b/gcc/testsuite/gfortran.dg/volatile11.f90
new file mode 100644
index 0000000..5742915
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/volatile11.f90
@@ -0,0 +1,40 @@
+! { dg-do compile }
+! { dg-options "-O2 -fdump-tree-optimized" }
+! Tests that volatile can be applied to members of common blocks or
+! equivalence groups (PR fortran/35037)
+!
+subroutine wait1
+ logical event
+ volatile event
+ common /dd/ event
+ event = .false.
+ do
+ if (event) print *, 'NotOptimizedAway1'
+ end do
+end subroutine
+
+subroutine wait2
+ logical event, foo
+ volatile event
+ equivalence (event, foo)
+ event = .false.
+ do
+ if (event) print *, 'NotOptimizedAway2'
+ end do
+end subroutine
+
+subroutine wait3
+ logical event
+ integer foo
+ volatile foo
+ equivalence (event, foo)
+ event = .false.
+ do
+ if (event) print *, 'IsOptimizedAway'
+ end do
+end subroutine
+
+! { dg-final { scan-tree-dump "NotOptimizedAway1" "optimized" } } */
+! { dg-final { scan-tree-dump "NotOptimizedAway2" "optimized" } } */
+! { dg-final { scan-tree-dump-not "IsOptimizedAway" "optimized" } } */
+! { dg-final { cleanup-tree-dump "optimized" } } */