<http://www.gnu.org/licenses/>. */
/* This file contains the definition of the types provided by the
- Fortran 2003 ISO_C_BINDING intrinsic module. */
+ Fortran 2003 ISO_C_BINDING intrinsic module. The ordering of
+ the entries matters for the *.mod backwards compatibility. */
#ifndef NAMED_INTCST
# define NAMED_INTCST(a,b,c,d)
NAMED_INTCST (ISOCBINDING_INT_FAST128_T, "c_int_fast128_t",
get_int_kind_from_width (128), GFC_STD_GNU)
-/* UNSIGNED. */
-NAMED_UINTCST (ISOCBINDING_UINT, "c_unsigned", gfc_c_uint_kind, \
- GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_USHORT, "c_unsigned_short", \
- get_unsigned_kind_from_node (short_unsigned_type_node), \
- GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UCHAR, "c_unsigned_char", \
- get_unsigned_kind_from_node (unsigned_char_type_node), \
- GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_ULONG, "c_unsigned_long", \
- get_unsigned_kind_from_node (long_unsigned_type_node), \
- GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_ULONGLONG, "c_unsigned_long_long", \
- get_unsigned_kind_from_node (long_long_unsigned_type_node), \
- GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINTMAX_T, "c_uintmax_t", \
- get_uint_kind_from_name (UINTMAX_TYPE), GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT8_T, "c_uint8_t", \
- get_uint_kind_from_name (UINT8_TYPE), GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT16_T, "c_uint16_t", \
- get_uint_kind_from_name (UINT16_TYPE), GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT32_T, "c_uint32_t", \
- get_uint_kind_from_name (UINT32_TYPE), GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT64_T, "c_uint64_t", \
- get_uint_kind_from_name (UINT64_TYPE), GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT128_T, "c_uint128_t", \
- get_uint_kind_from_width (128), GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT_LEAST8_T, "c_uint_least8_t", \
- get_uint_kind_from_name (UINT_LEAST8_TYPE), \
- GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT_LEAST16_T, "c_uint_least16_t", \
- get_uint_kind_from_name (UINT_LEAST16_TYPE), \
- GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT_LEAST32_T, "c_uint_least32_t", \
- get_uint_kind_from_name (UINT_LEAST32_TYPE),\
- GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT_LEAST64_T, "c_uint_least64_t", \
- get_uint_kind_from_name (UINT_LEAST64_TYPE),\
- GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT_LEAST128_T, "c_uint_least128_t", \
- get_uint_kind_from_width (128), GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT_FAST8_T, "c_uint_fast8_t", \
- get_uint_kind_from_name (UINT_FAST8_TYPE), \
- GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT_FAST16_T, "c_uint_fast16_t", \
- get_uint_kind_from_name (UINT_FAST16_TYPE), \
- GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT_FAST32_T, "c_uint_fast32_t", \
- get_uint_kind_from_name (UINT_FAST32_TYPE),\
- GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT_FAST64_T, "c_uint_fast64_t", \
- get_uint_kind_from_name (UINT_FAST64_TYPE),\
- GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOCBINDING_UINT_FAST128_T, "c_uint_fast128_t", \
- get_uint_kind_from_width (128), GFC_STD_UNSIGNED)
-
NAMED_REALCST (ISOCBINDING_FLOAT, "c_float", \
get_real_kind_from_node (float_type_node), GFC_STD_F2003)
NAMED_REALCST (ISOCBINDING_DOUBLE, "c_double", \
NAMED_FUNCTION (ISOCBINDING_F_C_STRING, "f_c_string", \
GFC_ISYM_F_C_STRING, GFC_STD_F2023)
+/* UNSIGNED. */
+NAMED_UINTCST (ISOCBINDING_UINT, "c_unsigned", gfc_c_uint_kind, \
+ GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_USHORT, "c_unsigned_short", \
+ get_unsigned_kind_from_node (short_unsigned_type_node), \
+ GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UCHAR, "c_unsigned_char", \
+ get_unsigned_kind_from_node (unsigned_char_type_node), \
+ GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_ULONG, "c_unsigned_long", \
+ get_unsigned_kind_from_node (long_unsigned_type_node), \
+ GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_ULONGLONG, "c_unsigned_long_long", \
+ get_unsigned_kind_from_node (long_long_unsigned_type_node), \
+ GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINTMAX_T, "c_uintmax_t", \
+ get_uint_kind_from_name (UINTMAX_TYPE), GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT8_T, "c_uint8_t", \
+ get_uint_kind_from_name (UINT8_TYPE), GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT16_T, "c_uint16_t", \
+ get_uint_kind_from_name (UINT16_TYPE), GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT32_T, "c_uint32_t", \
+ get_uint_kind_from_name (UINT32_TYPE), GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT64_T, "c_uint64_t", \
+ get_uint_kind_from_name (UINT64_TYPE), GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT128_T, "c_uint128_t", \
+ get_uint_kind_from_width (128), GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT_LEAST8_T, "c_uint_least8_t", \
+ get_uint_kind_from_name (UINT_LEAST8_TYPE), \
+ GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT_LEAST16_T, "c_uint_least16_t", \
+ get_uint_kind_from_name (UINT_LEAST16_TYPE), \
+ GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT_LEAST32_T, "c_uint_least32_t", \
+ get_uint_kind_from_name (UINT_LEAST32_TYPE),\
+ GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT_LEAST64_T, "c_uint_least64_t", \
+ get_uint_kind_from_name (UINT_LEAST64_TYPE),\
+ GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT_LEAST128_T, "c_uint_least128_t", \
+ get_uint_kind_from_width (128), GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT_FAST8_T, "c_uint_fast8_t", \
+ get_uint_kind_from_name (UINT_FAST8_TYPE), \
+ GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT_FAST16_T, "c_uint_fast16_t", \
+ get_uint_kind_from_name (UINT_FAST16_TYPE), \
+ GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT_FAST32_T, "c_uint_fast32_t", \
+ get_uint_kind_from_name (UINT_FAST32_TYPE),\
+ GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT_FAST64_T, "c_uint_fast64_t", \
+ get_uint_kind_from_name (UINT_FAST64_TYPE),\
+ GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOCBINDING_UINT_FAST128_T, "c_uint_fast128_t", \
+ get_uint_kind_from_width (128), GFC_STD_UNSIGNED)
+
#undef NAMED_INTCST
#undef NAMED_UINTCST
#undef NAMED_REALCST
<http://www.gnu.org/licenses/>. */
/* This file contains the definition of the named integer constants provided
- by the Fortran 2003 ISO_FORTRAN_ENV intrinsic module. */
+ by the Fortran 2003 ISO_FORTRAN_ENV intrinsic module. The ordering of
+ the entries matters for the *.mod backwards compatibility. */
#ifndef NAMED_INTCST
# define NAMED_INTCST(a,b,c,d)
NAMED_INTCST (ISOFORTRANENV_IOSTAT_INQUIRE_INTERNAL_UNIT, \
"iostat_inquire_internal_unit", LIBERROR_INQUIRE_INTERNAL_UNIT, \
GFC_STD_F2008)
-NAMED_INTCST (ISOFORTRANENV_LOGICAL8, "logical8", \
- gfc_get_int_kind_from_width_isofortranenv (8), GFC_STD_F2023)
-NAMED_INTCST (ISOFORTRANENV_LOGICAL16, "logical16", \
- gfc_get_int_kind_from_width_isofortranenv (16), GFC_STD_F2023)
-NAMED_INTCST (ISOFORTRANENV_LOGICAL32, "logical32", \
- gfc_get_int_kind_from_width_isofortranenv (32), GFC_STD_F2023)
-NAMED_INTCST (ISOFORTRANENV_LOGICAL64, "logical64", \
- gfc_get_int_kind_from_width_isofortranenv (64), GFC_STD_F2023)
NAMED_INTCST (ISOFORTRANENV_NUMERIC_STORAGE_SIZE, "numeric_storage_size", \
gfc_numeric_storage_size, GFC_STD_F2003)
NAMED_INTCST (ISOFORTRANENV_OUTPUT_UNIT, "output_unit", GFC_STDOUT_UNIT_NUMBER, \
GFC_STD_F2003)
-NAMED_INTCST (ISOFORTRANENV_REAL16, "real16", \
- gfc_get_real_kind_from_width_isofortranenv (16), GFC_STD_F2023)
NAMED_INTCST (ISOFORTRANENV_REAL32, "real32", \
gfc_get_real_kind_from_width_isofortranenv (32), GFC_STD_F2008)
NAMED_INTCST (ISOFORTRANENV_REAL64, "real64", \
GFC_STAT_FAILED_IMAGE, GFC_STD_F2018)
NAMED_INTCST (ISOFORTRANENV_FILE_STAT_UNLOCKED, "stat_unlocked", \
GFC_STAT_UNLOCKED, GFC_STD_F2008)
-NAMED_UINTCST (ISOFORTRANENV_UINT8, "uint8", \
- gfc_get_uint_kind_from_width_isofortranenv (8), GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOFORTRANENV_UINT16, "uint16", \
- gfc_get_uint_kind_from_width_isofortranenv (16), GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOFORTRANENV_UINT32, "uint32", \
- gfc_get_uint_kind_from_width_isofortranenv (32), GFC_STD_UNSIGNED)
-NAMED_UINTCST (ISOFORTRANENV_UINT64, "uint64", \
- gfc_get_uint_kind_from_width_isofortranenv (64), GFC_STD_UNSIGNED)
+
/* The arguments to NAMED_KINDARRAY are:
-- an internal name
? get_int_kind_from_node (ptr_type_node)
: gfc_default_integer_kind, GFC_STD_F2018)
+NAMED_INTCST (ISOFORTRANENV_LOGICAL8, "logical8", \
+ gfc_get_int_kind_from_width_isofortranenv (8), GFC_STD_F2023)
+NAMED_INTCST (ISOFORTRANENV_LOGICAL16, "logical16", \
+ gfc_get_int_kind_from_width_isofortranenv (16), GFC_STD_F2023)
+NAMED_INTCST (ISOFORTRANENV_LOGICAL32, "logical32", \
+ gfc_get_int_kind_from_width_isofortranenv (32), GFC_STD_F2023)
+NAMED_INTCST (ISOFORTRANENV_LOGICAL64, "logical64", \
+ gfc_get_int_kind_from_width_isofortranenv (64), GFC_STD_F2023)
+NAMED_INTCST (ISOFORTRANENV_REAL16, "real16", \
+ gfc_get_real_kind_from_width_isofortranenv (16), GFC_STD_F2023)
+
+NAMED_UINTCST (ISOFORTRANENV_UINT8, "uint8", \
+ gfc_get_uint_kind_from_width_isofortranenv (8), GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOFORTRANENV_UINT16, "uint16", \
+ gfc_get_uint_kind_from_width_isofortranenv (16), GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOFORTRANENV_UINT32, "uint32", \
+ gfc_get_uint_kind_from_width_isofortranenv (32), GFC_STD_UNSIGNED)
+NAMED_UINTCST (ISOFORTRANENV_UINT64, "uint64", \
+ gfc_get_uint_kind_from_width_isofortranenv (64), GFC_STD_UNSIGNED)
+
#undef NAMED_INTCST
#undef NAMED_UINTCST
#undef NAMED_KINDARRAY
/* Don't put any single quote (') in MOD_VERSION, if you want it to be
recognized. */
#define MOD_VERSION "16"
+/* Older mod versions we can still parse. */
+#define COMPAT_MOD_VERSIONS { "15" }
/* Structure that describes a position within a module file. */
i = 0;
#define NAMED_INTCST(a,b,c,d) symbol[i++].value = c;
-#include "iso-fortran-env.def"
-
#define NAMED_UINTCST(a,b,c,d) symbol[i++].value = c;
+#define NAMED_KINDARRAY(a,b,c,d) i++;
+#define NAMED_DERIVED_TYPE(a,b,c,d) i++;
+#define NAMED_FUNCTION(a,b,c,d) i++;
+#define NAMED_SUBROUTINE(a,b,c,d) i++;
#include "iso-fortran-env.def"
/* Generate the symbol for the module itself. */
" module file", module_fullpath);
if (start == 3)
{
+ bool fatal = false;
if (strcmp (atom_name, " version") != 0
|| module_char () != ' '
- || parse_atom () != ATOM_STRING
- || strcmp (atom_string, MOD_VERSION))
+ || parse_atom () != ATOM_STRING)
+ fatal = true;
+ else if (strcmp (atom_string, MOD_VERSION))
+ {
+ static const char *compat_mod_versions[] = COMPAT_MOD_VERSIONS;
+ fatal = true;
+ for (unsigned i = 0; i < ARRAY_SIZE (compat_mod_versions); ++i)
+ if (!strcmp (atom_string, compat_mod_versions[i]))
+ {
+ fatal = false;
+ break;
+ }
+ }
+ if (fatal)
gfc_fatal_error ("Cannot read module file %qs opened at %C,"
" because it was created by a different"
" version of GNU Fortran", module_fullpath);