]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: fix for CHARACTER(len=*) dummies with bind(C) [PR115390]
authorHarald Anlauf <anlauf@gmx.de>
Tue, 18 Jun 2024 19:57:19 +0000 (21:57 +0200)
committerHarald Anlauf <anlauf@gmx.de>
Wed, 19 Jun 2024 16:33:22 +0000 (18:33 +0200)
gcc/fortran/ChangeLog:

PR fortran/115390
* trans-decl.cc (gfc_conv_cfi_to_gfc): Move derivation of type sizes
for character via gfc_trans_vla_type_sizes to after character length
has been set.

gcc/testsuite/ChangeLog:

PR fortran/115390
* gfortran.dg/bind_c_char_11.f90: New test.

gcc/fortran/trans-decl.cc
gcc/testsuite/gfortran.dg/bind_c_char_11.f90 [new file with mode: 0644]

index 88538713a02b41a7aaace62d052819b3eb2b03f5..f7fb6eec336a8991f5185615d45d911e4c34316c 100644 (file)
@@ -7063,8 +7063,8 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally,
   if (sym->ts.type == BT_CHARACTER
       && !INTEGER_CST_P (sym->ts.u.cl->backend_decl))
     {
-      gfc_conv_string_length (sym->ts.u.cl, NULL, init);
-      gfc_trans_vla_type_sizes (sym, init);
+      gfc_conv_string_length (sym->ts.u.cl, NULL, &block);
+      gfc_trans_vla_type_sizes (sym, &block);
     }
 
   /* gfc->data = cfi->base_addr - or for scalars: gfc = cfi->base_addr.
diff --git a/gcc/testsuite/gfortran.dg/bind_c_char_11.f90 b/gcc/testsuite/gfortran.dg/bind_c_char_11.f90
new file mode 100644 (file)
index 0000000..5ed8e82
--- /dev/null
@@ -0,0 +1,45 @@
+! { dg-do compile }
+! { dg-additional-options "-Wuninitialized" }
+!
+! PR fortran/115390 - fixes for CHARACTER(len=*) dummies with bind(C)
+
+module test
+  implicit none
+contains
+  subroutine bar(s,t) bind(c)
+    character(*), intent(in) :: s,t
+    optional                 :: t
+    call foo(s,t)
+  end
+  subroutine bar1(s,t) bind(c)
+    character(*), intent(in) :: s(:),t(:)
+    optional                 :: t
+    call foo1(s,t)
+  end
+  subroutine bar4(s,t) bind(c)
+    character(len=*,kind=4), intent(in) :: s,t
+    optional                            :: t
+    call foo4(s,t)
+  end
+  subroutine bar5(s,t) bind(c)
+    character(len=*,kind=4), intent(in) :: s(:),t(:)
+    optional                            :: t
+    call foo5(s,t)
+  end
+  subroutine foo(s,t)
+    character(*), intent(in) :: s,t
+    optional                 :: t
+  end
+  subroutine foo1(s,t)
+    character(*), intent(in) :: s(:),t(:)
+    optional                 :: t
+  end
+  subroutine foo4(s,t)
+    character(len=*,kind=4), intent(in) :: s,t
+    optional                            :: t
+  end
+  subroutine foo5(s,t)
+    character(len=*,kind=4), intent(in) :: s(:),t(:)
+    optional                            :: t
+  end
+end