Really commit:

2011-05-06  Tobias Burnus  <burnus@net-b.de>
    
        PR fortran/48858
        PR fortran/48820
        * gfortran.dg/bind_c_usage_24.f90: New.
        * gfortran.dg/bind_c_usage_24_c.c: New.

From-SVN: r173503
This commit is contained in:
Tobias Burnus 2011-05-06 20:33:31 +02:00
parent 1f94e0c6f7
commit 7b040949f6
2 changed files with 67 additions and 0 deletions

View File

@ -0,0 +1,43 @@
! { 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" } }

View File

@ -0,0 +1,24 @@
/* 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 ();
}