Fortran] PR92277 - Fix assumed-rank array with bind(C)
authorTobias Burnus <tobias@codesourcery.com>
Thu, 31 Oct 2019 10:06:19 +0000 (10:06 +0000)
committerTobias Burnus <burnus@gcc.gnu.org>
Thu, 31 Oct 2019 10:06:19 +0000 (11:06 +0100)
        gcc/fortran/
        PR fortran/92277
        * trans-expr.c (gfc_conv_gfc_desc_to_cfi_desc): Fix DECL_ARTIFICIAL
        checking.

        gcc/testsuite/
        PR fortran/92277
        * fortran.dg/pr92277.f90: New.

From-SVN: r277661

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

index b86ea10a7e32f455dd42396379d96d5b371afd11..e1771687d16530f4e934368753a0ce0799caf4a6 100644 (file)
@@ -1,3 +1,9 @@
+2019-10-31  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR fortran/92277
+       * trans-expr.c (gfc_conv_gfc_desc_to_cfi_desc): Fix DECL_ARTIFICIAL
+       checking.
+
 2019-10-30  Tobias Burnus  <tobias@codesourcery.com>
 
        PR fortran/92208
index 7eba1bbd0822c078531ded0f362f5a64f0413073..381e314a9b56dae5ae86a07121dcab7e703da01c 100644 (file)
@@ -5239,6 +5239,9 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym)
       if (POINTER_TYPE_P (TREE_TYPE (parmse->expr)))
        parmse->expr = build_fold_indirect_ref_loc (input_location,
                                                    parmse->expr);
+      bool is_artificial = (INDIRECT_REF_P (parmse->expr)
+                           ? DECL_ARTIFICIAL (TREE_OPERAND (parmse->expr, 0))
+                           : DECL_ARTIFICIAL (parmse->expr));
 
       /* Unallocated allocatable arrays and unassociated pointer arrays
         need their dtype setting if they are argument associated with
@@ -5258,7 +5261,7 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym)
       type = e->ts.type != BT_ASSUMED ? gfc_typenode_for_spec (&e->ts) :
                                        NULL_TREE;
 
-      if (type && DECL_ARTIFICIAL (parmse->expr)
+      if (type && is_artificial
          && type != gfc_get_element_type (TREE_TYPE (parmse->expr)))
        {
          /* Obtain the offset to the data.  */
@@ -5271,7 +5274,7 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym)
                          gfc_get_dtype_rank_type (e->rank, type));
        }
       else if (type == NULL_TREE
-              || (!is_subref_array (e) && !DECL_ARTIFICIAL (parmse->expr)))
+              || (!is_subref_array (e) && !is_artificial))
        {
          /* Make sure that the span is set for expressions where it
             might not have been done already.  */
index 925768189f70ec95444398ae899d3598a1125277..6b9451b8edecc716c5a6e87d48a405bb75808c60 100644 (file)
@@ -1,3 +1,8 @@
+2019-10-31  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR fortran/92277
+       * fortran.dg/pr92277.f90: New.
+
 2019-10-31  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/92231
diff --git a/gcc/testsuite/gfortran.dg/pr92277.f90 b/gcc/testsuite/gfortran.dg/pr92277.f90
new file mode 100644 (file)
index 0000000..5121063
--- /dev/null
@@ -0,0 +1,32 @@
+! { dg-do compile }
+!
+! PR fortran/92277
+!
+! Contributed by José Rui Faustino de Sousa
+!
+module arr_m
+  implicit none
+contains
+  subroutine arr_set(this, that)
+    integer, intent(out) :: this(..)
+    integer, optional, intent(out) :: that(..)
+
+    interface
+      subroutine arr_set_c(this) bind(c)
+        use, intrinsic :: iso_c_binding, only: c_int
+        implicit none
+        integer(kind=c_int), intent(out) :: this(..)
+      end subroutine arr_set_c
+      subroutine arr_set_c_opt(this) bind(c)
+        use, intrinsic :: iso_c_binding, only: c_int
+        implicit none
+        integer(kind=c_int), optional, intent(out) :: this(..)
+      end subroutine arr_set_c_opt
+    end interface
+
+    call arr_set_c(this)
+    call arr_set_c(that)
+    call arr_set_c_opt(this)
+    call arr_set_c_opt(that)
+  end subroutine arr_set
+end module arr_m