--- /dev/null
+! { dg-do run }
+! { dg-additional-sources bind_c_usage_24_c.c }
+!
+! PR fortran/48858
+! PR fortran/48820
+!
+! TR 29113: BIND(C) with OPTIONAL
+!
+module m
+ use iso_c_binding
+ interface
+ subroutine c_proc (is_present, var) bind(C)
+ import
+ logical(c_bool), value :: is_present
+ integer(c_int), optional :: var
+ end subroutine
+ end interface
+contains
+ subroutine subtest (is_present, var) bind(C)
+ logical(c_bool), intent(in), value :: is_present
+ integer(c_int), intent(inout), optional :: var
+ if (is_present) then
+ if (.not. present (var)) call abort ()
+ if (var /= 43) call abort ()
+ var = -45
+ else
+ if (present (var)) call abort ()
+ end if
+ end subroutine subtest
+end module m
+
+program test
+ use m
+ implicit none
+ integer :: val
+
+ val = 4
+ call c_proc (.false._c_bool)
+ call c_proc (.true._c_bool, val)
+ if (val /= 7) call abort ()
+end program test
+
+! { dg-final { cleanup-modules "m" } }
--- /dev/null
+/* Compiled and linked by bind_c.f90. */
+
+#include <stdlib.h>
+
+void subtest (_Bool, int *);
+
+void
+c_proc (_Bool present, int *val)
+{
+ int val2;
+ if (!present && val)
+ abort ();
+ else if (present)
+ {
+ if (!val) abort ();
+ if (*val != 4) abort ();
+ *val = 7;
+ }
+
+ val2 = 43;
+ subtest (1, &val2);
+ subtest (0, NULL);
+ if (val2 != -45) abort ();
+}