diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2008-02-05 21:06:32 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2008-02-05 21:06:32 +0000 |
commit | e3ac9b24a77b39ecd1e954c4d34957ee9e4ac1c0 (patch) | |
tree | 3270a822480b22cb5e3633ff14ad2ae61bed170c /gcc | |
parent | da36ba2754d0ab1b9ac9603c939e8b83f1857a30 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fortran/trans-common.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/volatile11.f90 | 40 |
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" } } */ |