]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/45742 (VOLATILE has no effect)
authorTobias Burnus <burnus@net-b.de>
Sat, 13 Nov 2010 17:25:28 +0000 (18:25 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Sat, 13 Nov 2010 17:25:28 +0000 (18:25 +0100)
2010-11-13  Tobias Burnus  <burnus@net-b.de>

        PR fortran/45742
        * trans-common.c (build_field): Add TREE_SIDE_EFFECTS for
        * volatile.
        * trans-decl.c (gfc_finish_var_decl): Ditto.
        (create_function_arglist): Handle volatile dummy arguments.

2010-11-13  Tobias Burnus  <burnus@net-b.de>

        PR fortran/45742
        * gfortran.dg/volatile12.f90: New.

From-SVN: r166715

gcc/fortran/ChangeLog
gcc/fortran/trans-common.c
gcc/fortran/trans-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/volatile12.f90 [new file with mode: 0644]

index 6ef44f743a021b88bb4016497d3531d483c17d02..6e3a475b7e1a567a5b20fb180bf687b55f9417f9 100644 (file)
@@ -1,3 +1,10 @@
+2010-11-13  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/45742
+       * trans-common.c (build_field): Add TREE_SIDE_EFFECTS for volatile.
+       * trans-decl.c (gfc_finish_var_decl): Ditto.
+       (create_function_arglist): Handle volatile dummy arguments.
+
 2010-10-25  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/46140
index 92edd208daefbd16ab1319ada8fcc8c88560ea7c..203d802130ec056149dd0607e2adff5bac45b9cd 100644 (file)
@@ -323,6 +323,7 @@ build_field (segment_info *h, tree union_type, record_layout_info rli)
     {
       tree new_type;
       TREE_THIS_VOLATILE (field) = 1;
+      TREE_SIDE_EFFECTS (field) = 1;
       new_type = build_qualified_type (TREE_TYPE (field), TYPE_QUAL_VOLATILE);
       TREE_TYPE (field) = new_type;
     }
index cc7912f6404e92cc9f33fb445291b84e9445a8f8..abcf5f0029bc91778420968005905d96f73f6bf3 100644 (file)
@@ -539,6 +539,7 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym)
   if (sym->attr.volatile_)
     {
       TREE_THIS_VOLATILE (decl) = 1;
+      TREE_SIDE_EFFECTS (decl) = 1;
       new_type = build_qualified_type (TREE_TYPE (decl), TYPE_QUAL_VOLATILE);
       TREE_TYPE (decl) = new_type;
     } 
@@ -1655,10 +1656,19 @@ create_function_arglist (gfc_symbol * sym)
 
       if (f->sym->attr.proc_pointer)
         type = build_pointer_type (type);
+      if (f->sym->attr.volatile_)
+       type = build_qualified_type (type, TYPE_QUAL_VOLATILE);
 
       /* Build the argument declaration.  */
       parm = build_decl (PARM_DECL, gfc_sym_identifier (f->sym), type);
 
+      if (f->sym->attr.volatile_)
+       {
+         TREE_THIS_VOLATILE (parm) = 1;
+         TREE_SIDE_EFFECTS (parm) = 1;
+       }
+
       /* Fill in arg stuff.  */
       DECL_CONTEXT (parm) = fndecl;
       DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
index 08b992446d268ea771e7eaeb9e7ac6a66e2b0408..3aa0ead71c8ee67a7e814a0d786e9bb22565e41a 100644 (file)
@@ -1,3 +1,8 @@
+2010-11-13  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/45742
+       * gfortran.dg/volatile12.f90: New.
+
 2010-11-12  Jakub Jelinek  <jakub@redhat.com>
 
        Backport from mainline
diff --git a/gcc/testsuite/gfortran.dg/volatile12.f90 b/gcc/testsuite/gfortran.dg/volatile12.f90
new file mode 100644 (file)
index 0000000..1e85a2b
--- /dev/null
@@ -0,0 +1,16 @@
+! { dg-do compile }
+! { dg-options "-fdump-tree-optimized -O3" }
+!
+! PR fortran/45742
+!
+
+subroutine sub(arg)
+  integer, volatile :: arg
+  if (arg /= arg) call I_dont_exist()
+end
+
+! { dg-final { scan-tree-dump "integer.kind=.. . volatile arg" "optimized" } }
+! { dg-final { scan-tree-dump-times " =.v. arg;" 2 "optimized" } }
+! { dg-final { scan-tree-dump "i_dont_exist" "optimized" } }
+! { dg-final { cleanup-tree-dump "optimized" } }
+