[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