llvm-project/flang/module/iso_c_binding.f90
Peter Klausler fc97d2e68b
[flang] Add UNSIGNED (#113504)
Implement the UNSIGNED extension type and operations under control of a
language feature flag (-funsigned).

This is nearly identical to the UNSIGNED feature that has been available
in Sun Fortran for years, and now implemented in GNU Fortran for
gfortran 15, and proposed for ISO standardization in J3/24-116.txt.

See the new documentation for details; but in short, this is C's
unsigned type, with guaranteed modular arithmetic for +, -, and *, and
the related transformational intrinsic functions SUM & al.
2024-12-18 07:02:37 -08:00

152 lines
4.6 KiB
Fortran

!===-- module/iso_c_binding.f90 --------------------------------------------===!
!
! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
! See https://llvm.org/LICENSE.txt for license information.
! SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
!
!===------------------------------------------------------------------------===!
! See Fortran 2018, clause 18.2
module iso_c_binding
use __fortran_builtins, only: &
c_associated => __builtin_c_associated, &
c_funloc => __builtin_c_funloc, &
c_funptr => __builtin_c_funptr, &
c_f_pointer => __builtin_c_f_pointer, &
c_loc => __builtin_c_loc, &
c_null_funptr => __builtin_c_null_funptr, &
c_null_ptr => __builtin_c_null_ptr, &
c_ptr => __builtin_c_ptr, &
c_sizeof => sizeof, &
operator(==), operator(/=)
implicit none
! Set PRIVATE by default to explicitly only export what is meant
! to be exported by this MODULE.
private
public :: c_associated, c_funloc, c_funptr, c_f_pointer, c_loc, &
c_null_funptr, c_null_ptr, c_ptr, c_sizeof, &
operator(==), operator(/=)
! Table 18.2 (in clause 18.3.1)
! TODO: Specialize (via macros?) for alternative targets
integer, parameter, public :: &
c_int8_t = 1, &
c_int16_t = 2, &
c_int32_t = 4, &
c_int64_t = 8, &
c_int128_t = 16 ! anticipating future addition
integer, parameter, public :: &
c_int = c_int32_t, &
c_short = c_int16_t, &
c_long = c_int64_t, &
c_long_long = c_int64_t, &
c_signed_char = c_int8_t, &
c_size_t = kind(c_sizeof(1)), &
#if __powerpc__
c_intmax_t = c_int64_t, &
#else
c_intmax_t = c_int128_t, &
#endif
c_intptr_t = c_size_t, &
c_ptrdiff_t = c_size_t
integer, parameter, public :: &
c_int_least8_t = c_int8_t, &
c_int_fast8_t = c_int8_t, &
c_int_least16_t = c_int16_t, &
#if defined(__linux__) && defined(__powerpc__)
c_int_fast16_t = c_long, &
#else
c_int_fast16_t = c_int16_t, &
#endif
c_int_least32_t = c_int32_t, &
#if defined(__linux__) && defined(__powerpc__)
c_int_fast32_t = c_long, &
#else
c_int_fast32_t = c_int32_t, &
#endif
c_int_least64_t = c_int64_t, &
c_int_fast64_t = c_int64_t, &
c_int_least128_t = c_int128_t, &
c_int_fast128_t = c_int128_t
integer, parameter, public :: &
c_float = 4, &
c_double = 8, &
#if __x86_64__
c_long_double = 10
#else
c_long_double = 16
#endif
integer, parameter, public :: &
c_float_complex = c_float, &
c_double_complex = c_double, &
c_long_double_complex = c_long_double
integer, parameter, public :: c_bool = 1
integer, parameter, public :: c_char = 1
! C characters with special semantics
character(kind=c_char, len=1), parameter, public :: c_null_char = achar(0)
character(kind=c_char, len=1), parameter, public :: c_alert = achar(7)
character(kind=c_char, len=1), parameter, public :: c_backspace = achar(8)
character(kind=c_char, len=1), parameter, public :: c_form_feed = achar(12)
character(kind=c_char, len=1), parameter, public :: c_new_line = achar(10)
character(kind=c_char, len=1), parameter, public :: c_carriage_return = achar(13)
character(kind=c_char, len=1), parameter, public :: c_horizontal_tab = achar(9)
character(kind=c_char, len=1), parameter, public :: c_vertical_tab = achar(11)
interface c_f_procpointer
module procedure c_f_procpointer
end interface
public :: c_f_procpointer
! gfortran extensions
integer, parameter, public :: &
c_float128 = 16, &
c_float128_complex = c_float128
integer, parameter, public :: &
c_uint8_t = 1, &
c_uint16_t = 2, &
c_uint32_t = 4, &
c_uint64_t = 8, &
c_uint128_t = 16
integer, parameter, public :: &
c_unsigned_char = c_uint8_t, &
c_unsigned_short = c_uint16_t, &
c_unsigned = c_uint32_t, &
c_unsigned_long = c_uint64_t, &
c_unsigned_long_long = c_unsigned_long, &
#if __powerpc__
c_uintmax_t = c_uint64_t
#else
c_uintmax_t = c_uint128_t
#endif
integer, parameter, public :: &
c_uint_fast8_t = c_uint8_t, &
c_uint_fast16_t = c_uint16_t, &
c_uint_fast32_t = c_uint32_t, &
c_uint_fast64_t = c_uint64_t, &
c_uint_fast128_t = c_uint128_t
integer, parameter, public :: &
c_uint_least8_t = c_uint8_t, &
c_uint_least16_t = c_uint16_t, &
c_uint_least32_t = c_uint32_t, &
c_uint_least64_t = c_uint64_t, &
c_uint_least128_t = c_uint128_t
contains
subroutine c_f_procpointer(cptr, fptr)
type(c_funptr), intent(in) :: cptr
procedure(), pointer, intent(out) :: fptr
! TODO: implement
end subroutine c_f_procpointer
end module iso_c_binding