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