OSDN Git Service

* trans-expr.c (gfc_conv_function_call): Force evaluation of
authorfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 15 Feb 2008 21:12:24 +0000 (21:12 +0000)
committerfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 15 Feb 2008 21:12:24 +0000 (21:12 +0000)
se->expr.

* gfortran.dg/c_loc_tests_12.f03: New test.

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

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

index 1aa75d6..ad34b66 100644 (file)
@@ -1,3 +1,9 @@
+2008-02-15  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+
+       PR fortran/35150
+       * trans-expr.c (gfc_conv_function_call): Force evaluation of
+       se->expr.
+
 2008-02-10  Daniel Franke  <franke.daniel@gmail.com>
 
        fortran/PR35019
index 89bc3c2..4866d8c 100644 (file)
@@ -2264,6 +2264,13 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
              gfc_conv_array_parameter (se, arg->expr, argss, f);
            }
 
+         /* TODO -- the following two lines shouldn't be necessary, but
+           they're removed a bug is exposed later in the codepath.
+           This is workaround was thus introduced, but will have to be
+           removed; please see PR 35150 for details about the issue.  */
+         se->expr = convert (pvoid_type_node, se->expr);
+         se->expr = gfc_evaluate_now (se->expr, &se->pre);
+
          return 0;
        }
       else if (sym->intmod_sym_id == ISOCBINDING_FUNLOC)
index 6665d26..fb695f0 100644 (file)
@@ -1,3 +1,8 @@
+2008-02-15  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+
+       PR fortran/35150
+       * gfortran.dg/c_loc_tests_12.f03: New test.
+
 2008-02-15  Douglas Gregor  <doug.gregor@gmail.com>
 
        PR c++/35023
diff --git a/gcc/testsuite/gfortran.dg/c_loc_tests_12.f03 b/gcc/testsuite/gfortran.dg/c_loc_tests_12.f03
new file mode 100644 (file)
index 0000000..252c1c5
--- /dev/null
@@ -0,0 +1,32 @@
+! { dg-do compile }
+! 
+! Test for PR 35150, reduced testcases by Tobias Burnus
+!
+module test1
+  use, intrinsic :: iso_c_binding
+  implicit none
+contains
+  subroutine sub1(argv) bind(c,name="sub1")
+    type(c_ptr), intent(in) :: argv
+  end subroutine
+
+  subroutine sub2
+    type(c_ptr), dimension(1), target :: argv = c_null_ptr
+    character(c_char), dimension(1), target :: s = c_null_char
+    call sub1(c_loc(argv))
+  end subroutine
+end module test1
+
+program test2
+  use iso_c_binding
+  type(c_ptr), target, save :: argv
+  interface
+    subroutine sub1(argv) bind(c)
+      import
+      type(c_ptr) :: argv
+    end subroutine sub1
+  end interface
+  call sub1(c_loc(argv))
+end program test2
+!
+! { dg-final { cleanup-modules "test1" } }