1!===-- module/iso_fortran_env.f90 ------------------------------------------===!
2!
3! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4! See https://llvm.org/LICENSE.txt for license information.
5! SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6!
7!===------------------------------------------------------------------------===!
8
9! See Fortran 2018, clause 16.10.2
10! TODO: These are placeholder values so that some tests can be run.
11
12include '../runtime/magic-numbers.h' ! for IOSTAT= error/end code values
13
14module iso_fortran_env
15
16  use __Fortran_builtins, only: &
17    event_type => __builtin_event_type, &
18    lock_type => __builtin_lock_type, &
19    team_type => __builtin_team_type
20
21  implicit none
22
23  integer, parameter :: atomic_int_kind = selected_int_kind(18)
24  integer, parameter :: atomic_logical_kind = atomic_int_kind
25
26  ! TODO: Use PACK([x],test) in place of the array constructor idiom
27  ! [(x, integer::j=1,COUNT([test]))] below once PACK() can be folded.
28
29  integer, parameter, private :: &
30    selectedASCII = selected_char_kind('ASCII'), &
31    selectedUCS_2 = selected_char_kind('UCS-2'), &
32    selectedUnicode = selected_char_kind('ISO_10646')
33  integer, parameter :: character_kinds(*) = [ &
34    [(selectedASCII, integer :: j=1, count([selectedASCII >= 0]))], &
35    [(selectedUCS_2, integer :: j=1, count([selectedUCS_2 >= 0]))], &
36    [(selectedUnicode, integer :: j=1, count([selectedUnicode >= 0]))]]
37
38  integer, parameter, private :: &
39    selectedInt8 = selected_int_kind(2), &
40    selectedInt16 = selected_int_kind(4), &
41    selectedInt32 = selected_int_kind(9), &
42    selectedInt64 = selected_int_kind(18),&
43    selectedInt128 = selected_int_kind(38), &
44    safeInt8 = merge(selectedInt8, selected_int_kind(0), &
45                     selectedInt8 >= 0), &
46    safeInt16 = merge(selectedInt16, selected_int_kind(0), &
47                      selectedInt16 >= 0), &
48    safeInt32 = merge(selectedInt32, selected_int_kind(0), &
49                      selectedInt32 >= 0), &
50    safeInt64 = merge(selectedInt64, selected_int_kind(0), &
51                      selectedInt64 >= 0), &
52    safeInt128 = merge(selectedInt128, selected_int_kind(0), &
53                       selectedInt128 >= 0)
54  integer, parameter :: &
55    int8 = merge(selectedInt8, merge(-2, -1, selectedInt8 >= 0), &
56                 digits(int(0,kind=safeInt8)) == 7), &
57    int16 = merge(selectedInt16, merge(-2, -1, selectedInt16 >= 0), &
58                  digits(int(0,kind=safeInt16)) == 15), &
59    int32 = merge(selectedInt32, merge(-2, -1, selectedInt32 >= 0), &
60                  digits(int(0,kind=safeInt32)) == 31), &
61    int64 = merge(selectedInt64, merge(-2, -1, selectedInt64 >= 0), &
62                  digits(int(0,kind=safeInt64)) == 63), &
63    int128 = merge(selectedInt128, merge(-2, -1, selectedInt128 >= 0), &
64                   digits(int(0,kind=safeInt128)) == 127)
65
66  integer, parameter :: integer_kinds(*) = [ &
67    selected_int_kind(0), &
68    ((selected_int_kind(k), &
69      integer :: j=1, count([selected_int_kind(k) >= 0 .and. &
70                             selected_int_kind(k) /= &
71                               selected_int_kind(k-1)])), &
72     integer :: k=1, 39)]
73
74  integer, parameter :: &
75    logical8 = int8, logical16 = int16, logical32 = int32, logical64 = int64
76  integer, parameter :: logical_kinds(*) = [ &
77    [(logical8, integer :: j=1, count([logical8 >= 0]))], &
78    [(logical16, integer :: j=1, count([logical16 >= 0]))], &
79    [(logical32, integer :: j=1, count([logical32 >= 0]))], &
80    [(logical64, integer :: j=1, count([logical64 >= 0]))]]
81
82  integer, parameter, private :: &
83    selectedReal16 = selected_real_kind(3, 4), &      ! IEEE half
84    selectedBfloat16 = selected_real_kind(2, 37), &   ! truncated IEEE single
85    selectedReal32 = selected_real_kind(6, 37), &     ! IEEE single
86    selectedReal64 = selected_real_kind(15, 307), &   ! IEEE double
87    selectedReal80 = selected_real_kind(18, 4931), &  ! 80x87 extended
88    selectedReal64x2 = selected_real_kind(31, 307), & ! "double-double"
89    selectedReal128 = selected_real_kind(33, 4931), & ! IEEE quad
90    safeReal16 = merge(selectedReal16, selected_real_kind(0,0), &
91                       selectedReal16 >= 0), &
92    safeBfloat16 = merge(selectedBfloat16, selected_real_kind(0,0), &
93                         selectedBfloat16 >= 0), &
94    safeReal32 = merge(selectedReal32, selected_real_kind(0,0), &
95                       selectedReal32 >= 0), &
96    safeReal64 = merge(selectedReal64, selected_real_kind(0,0), &
97                       selectedReal64 >= 0), &
98    safeReal80 = merge(selectedReal80, selected_real_kind(0,0), &
99                       selectedReal80 >= 0), &
100    safeReal64x2 = merge(selectedReal64x2, selected_real_kind(0,0), &
101                         selectedReal64x2 >= 0), &
102    safeReal128 = merge(selectedReal128, selected_real_kind(0,0), &
103                        selectedReal128 >= 0)
104  integer, parameter :: &
105    real16 = merge(selectedReal16, merge(-2, -1, selectedReal16 >= 0), &
106                   digits(real(0,kind=safeReal16)) == 11), &
107    bfloat16 = merge(selectedBfloat16, merge(-2, -1, selectedBfloat16 >= 0), &
108                     digits(real(0,kind=safeBfloat16)) == 8), &
109    real32 = merge(selectedReal32, merge(-2, -1, selectedReal32 >= 0), &
110                   digits(real(0,kind=safeReal32)) == 24), &
111    real64 = merge(selectedReal64, merge(-2, -1, selectedReal64 >= 0), &
112                   digits(real(0,kind=safeReal64)) == 53), &
113    real80 = merge(selectedReal80, merge(-2, -1, selectedReal80 >= 0), &
114                   digits(real(0,kind=safeReal80)) == 64), &
115    real64x2 = merge(selectedReal64x2, merge(-2, -1, selectedReal64x2 >= 0), &
116                     digits(real(0,kind=safeReal64x2)) == 106), &
117    real128 = merge(selectedReal128, merge(-2, -1, selectedReal128 >= 0), &
118                    digits(real(0,kind=safeReal128)) == 113)
119
120  integer, parameter :: real_kinds(*) = [ &
121    [(real16, integer :: j=1, count([real16 >= 0]))], &
122    [(bfloat16, integer :: j=1, count([bfloat16 >= 0]))], &
123    [(real32, integer :: j=1, count([real32 >= 0]))], &
124    [(real64, integer :: j=1, count([real64 >= 0]))], &
125    [(real80, integer :: j=1, count([real80 >= 0]))], &
126    [(real64x2, integer :: j=1, count([real64x2 >= 0]))], &
127    [(real128, integer :: j=1, count([real128 >= 0]))]]
128
129  integer, parameter :: current_team = -1, initial_team = -2, parent_team = -3
130
131  integer, parameter :: input_unit = 5, output_unit = 6
132  integer, parameter :: error_unit = output_unit
133  integer, parameter :: iostat_end = -1, iostat_eor = -2
134  integer, parameter :: iostat_inquire_internal_unit = -1
135
136  integer, parameter :: character_storage_size = 8
137  integer, parameter :: file_storage_size = 8
138  integer, parameter :: numeric_storage_size = 32
139
140  integer, parameter :: stat_failed_image = FORTRAN_RUNTIME_STAT_FAILED_IMAGE
141  integer, parameter :: stat_locked = FORTRAN_RUNTIME_STAT_LOCKED
142  integer, parameter :: stat_locked_other_image = FORTRAN_RUNTIME_STAT_LOCKED_OTHER_IMAGE
143  integer, parameter :: stat_stopped_image = FORTRAN_RUNTIME_STAT_STOPPED_IMAGE
144  integer, parameter :: stat_unlocked = FORTRAN_RUNTIME_STAT_UNLOCKED
145  integer, parameter :: stat_unlocked_failed_image = FORTRAN_RUNTIME_STAT_UNLOCKED_FAILED_IMAGE
146
147 contains
148
149  character(len=80) function compiler_options()
150    compiler_options = 'COMPILER_OPTIONS() not yet implemented'
151  end function compiler_options
152
153  character(len=80) function compiler_version()
154    compiler_version = 'f18 in development'
155  end function compiler_version
156end module iso_fortran_env
157