[PATCH, fortran] Interoperability with C int128_t types
Sa Liu
SALIU@de.ibm.com
Tue Apr 1 10:57:00 GMT 2008
This patch adds c_int128_t, c_int_lease128_t and c_int_fast128_t as GNU
extensions. This will enable interoperability with their C variants. The
types are rejected if standard-checking is enabled.
OK for mainline?
Thanks!
Sa
Index: gcc/gcc/ChangeLog
===================================================================
--- gcc.orig/gcc/ChangeLog
+++ gcc/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2008-04-01 Sa Liu <saliu@de.ibm.com>
+
+ * fortran/iso-c-binding.def: Add definition for c_int128_t,
+ c_int_least128_t and c_int_fast128_t as GNU extensions.
+ * fortran/symbol.c (generate_isocbinding_symbol): Generate symbols
for
+ c_int128_t, c_int_least128_t and c_int_fast128_t only when
-std=gnu.
+
2008-04-01 Jan Hubicka <jh@suse.cz>
* function.c (free_after_compilation): Free epilogue_delay_list.
Index: gcc/gcc/fortran/iso-c-binding.def
===================================================================
--- gcc.orig/gcc/fortran/iso-c-binding.def
+++ gcc/gcc/fortran/iso-c-binding.def
@@ -65,6 +65,8 @@ NAMED_INTCST (ISOCBINDING_INT8_T, "c_int
NAMED_INTCST (ISOCBINDING_INT16_T, "c_int16_t", get_int_kind_from_width
(16))
NAMED_INTCST (ISOCBINDING_INT32_T, "c_int32_t", get_int_kind_from_width
(32))
NAMED_INTCST (ISOCBINDING_INT64_T, "c_int64_t", get_int_kind_from_width
(64))
+/* GNU Extension. */
+NAMED_INTCST (ISOCBINDING_INT128_T, "c_int128_t", get_int_kind_from_width
(128))
NAMED_INTCST (ISOCBINDING_INT_LEAST8_T, "c_int_least8_t", \
get_int_kind_from_minimal_width (8))
@@ -74,12 +76,17 @@ NAMED_INTCST (ISOCBINDING_INT_LEAST32_T,
get_int_kind_from_minimal_width (32))
NAMED_INTCST (ISOCBINDING_INT_LEAST64_T, "c_int_least64_t", \
get_int_kind_from_minimal_width (64))
+/* GNU Extension. */
+NAMED_INTCST (ISOCBINDING_INT_LEAST128_T, "c_int_least128_t", \
+ get_int_kind_from_minimal_width (128))
/* TODO: Implement c_int_fast*_t. Depends on PR 448. */
NAMED_INTCST (ISOCBINDING_INT_FAST8_T, "c_int_fast8_t", -2)
NAMED_INTCST (ISOCBINDING_INT_FAST16_T, "c_int_fast16_t", -2)
NAMED_INTCST (ISOCBINDING_INT_FAST32_T, "c_int_fast32_t", -2)
NAMED_INTCST (ISOCBINDING_INT_FAST64_T, "c_int_fast64_t", -2)
+/* GNU Extension. */
+NAMED_INTCST (ISOCBINDING_INT_FAST128_T, "c_int_fast128_t", -2)
NAMED_REALCST (ISOCBINDING_FLOAT, "c_float", \
get_real_kind_from_node (float_type_node))
Index: gcc/gcc/fortran/symbol.c
===================================================================
--- gcc.orig/gcc/fortran/symbol.c
+++ gcc/gcc/fortran/symbol.c
@@ -3795,6 +3795,12 @@ generate_isocbinding_symbol (const char
#define NAMED_CHARKNDCST(a,b,c) case a :
#include "iso-c-binding.def"
+ /* c_int128_t, c_int_least128_t and c_int_fast128_t are gnu
extensions. */
+ if (gfc_notification_std (GFC_STD_GNU) == FAILURE
+ && (s == ISOCBINDING_INT128_T || s ==
ISOCBINDING_INT_LEAST128_T
+ || s == ISOCBINDING_INT_FAST128_T))
+ break;
+
tmp_sym->value = gfc_int_expr (c_interop_kinds_table[s].value);
/* Initialize an integer constant expression node. */
Index: gcc/gcc/testsuite/gfortran.dg/c_kind_int128_test1.f03
===================================================================
--- /dev/null
+++ gcc/gcc/testsuite/gfortran.dg/c_kind_int128_test1.f03
@@ -0,0 +1,12 @@
+! { dg-do compile }
+! { dg-options "-std=f2003" }
+!
+! Note: int_fast*_t currently not supported.
+
+subroutine c_kind_params
+ use, intrinsic :: iso_c_binding
+ integer(c_int128_t) :: a ! { dg-error "has not been declared or is a
variable" }
+ integer(c_int_least128_t) :: b ! { dg-error "has not been declared or
is a variable" }
+! integer(c_int_fast128_t) :: c
+
+end subroutine c_kind_params
Index: gcc/gcc/testsuite/gfortran.dg/c_kind_int128_test2.f03
===================================================================
--- /dev/null
+++ gcc/gcc/testsuite/gfortran.dg/c_kind_int128_test2.f03
@@ -0,0 +1,12 @@
+! { dg-do compile }
+! { dg-options "-std=gnu" }
+!
+! Note: int_fast*_t currently not supported.
+
+subroutine c_kind_params
+ use, intrinsic :: iso_c_binding
+ integer(c_int128_t) :: a
+ integer(c_int_least128_t) :: b
+! integer(c_int_fast128_t) :: c
+
+end subroutine c_kind_params
More information about the Fortran
mailing list