From: Francois-Xavier Coudert Date: Tue, 5 Feb 2008 21:06:32 +0000 (+0000) Subject: re PR fortran/35037 (VOLATILE attribute not being honored with common block variable) X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e3ac9b24a77b39ecd1e954c4d34957ee9e4ac1c0;p=platform%2Fupstream%2Fgcc.git 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 --- 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 + + PR fortran/35037 + * trans-common.c (build_field): Mark fields as volatile when needed. + 2008-02-05 Tobias Burnus 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 + + PR fortran/35037 + * gfortran.dg/volatile11.f90: New test. + 2008-02-05 Jakub Jelinek 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" } } */