Le 08/06/2015 17:31, Jan Hubicka a écrit :
> Hi,
> to furhter add to the topics to discuss, I noticed that Fortran FE seems to 
> be quite
> ambivalent about C_CHAR type:
> [jh@gcc2-power8 gcc]$ cat ../b.f90
> ! This testcase will abort if C_CHAR types are not interoperable
> module lto_type_merge_test
>   use, intrinsic :: iso_c_binding
>   implicit none
> 
> contains
>   function types_test1(V) bind(c)
>     USE, INTRINSIC :: ISO_C_BINDING
>     CHARACTER(C_CHAR) :: types_test1
>     CHARACTER(C_CHAR), VALUE :: V
>     types_test1 = V
>   end function types_test1
> end module lto_type_merge_test
> 
> [jh@gcc2-power8 gcc]$ cat ../a.c
> extern unsigned char types_test1 (char v);
> void
> main ()
> { 
>   if (types_test1 ('a') != 'a')
>     __builtin_abort ();
>   return 0;
> }
> 
> As my fortran-fu goes, i think this testcase is correct. Fortran FE however
> builds types_test1 as a function return char but taking the array of size of 1
> as a parameter.
C_CHAR is a named constant of value 1 (the number of bytes of a char),
and character(foo) declares a string of length foo and default kind
(which is 1 for character types).
So it is expected that the argument is an array.
If you want to declare a single character, you have to use an integer of
kind 1.
types_test1's result and v should have type integer(c_char), I think.

Mikael

Reply via email to