OSDN Git Service

2010-11-13 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 13 Nov 2010 10:29:04 +0000 (10:29 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 13 Nov 2010 10:29:04 +0000 (10:29 +0000)
        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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166701 138bc75d-0d04-0410-961f-82ee72b054a4

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 7d7a079..aa17885 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-11-12  Joseph Myers  <joseph@codesourcery.com>
 
        * Make-lang.in (gfortranspec.o): Use $(OPTS_H).
index 486fbbb..1f59a69 100644 (file)
@@ -322,6 +322,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 3f068de..0441db7 100644 (file)
@@ -555,6 +555,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;
     } 
@@ -1944,10 +1945,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 (input_location,
                         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 a2d1a56..76dc037 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-13  Paolo Bonzini  <bonzini@gnu.org>
 
        PR c/20385
diff --git a/gcc/testsuite/gfortran.dg/volatile12.f90 b/gcc/testsuite/gfortran.dg/volatile12.f90
new file mode 100644 (file)
index 0000000..8de143d
--- /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 "original" } }
+