]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
trans-expr.c (gfc_conv_function_call): Force evaluation of se->expr.
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Fri, 15 Feb 2008 21:12:24 +0000 (21:12 +0000)
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Fri, 15 Feb 2008 21:12:24 +0000 (21:12 +0000)
* trans-expr.c (gfc_conv_function_call): Force evaluation of
se->expr.

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

From-SVN: r132353

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 1aa75d6d51783ca2b7967b4795e01c3e46e95925..ad34b66ff4c78f2d191b454c79d9b997b2e529bc 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 89bc3c28537f1fac0310410750669363097ed98f..4866d8c965882ad8f1d706977d76aa5964d3bfdd 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 6665d266314a1beb41d9545cae750b43eded5b83..fb695f0624e8d8f34446ebd414bd20122f625995 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" } }