diff mbox series

[Fortran,RFC] Introduce GFC_STD_UNSIGNED

Message ID cfa1ff72-8e80-4b47-88ca-5e230e8697f0@netcologne.de
State New
Headers show
Series [Fortran,RFC] Introduce GFC_STD_UNSIGNED | expand

Commit Message

Thomas Koenig Oct. 11, 2024, 4 p.m. UTC
Hello world,

the attached patch creates an unsigned "standard" for the
gfc_option.allow_std field.

One of the main reason why people want UNSIGNED for Fortran is
interfacing for C.

This is a preparation for further work on the ISO_C_BINDING constants.
That, we do via iso-c-binding.def , whose last field is a standard
for the constant to be defined for the standard in question, which is
then checked.  I could try and invent a different method for this,
but I'd rather not.

So, OK for trunk? Other, better ideas?

Best regards

	Thomas

Comments

Thomas Koenig Oct. 11, 2024, 4:05 p.m. UTC | #1
Am 11.10.24 um 18:00 schrieb Thomas Koenig:
> Hello world,
> 
> the attached patch creates an unsigned "standard" for the
> gfc_option.allow_std field.
> 
> One of the main reason why people want UNSIGNED for Fortran is
> interfacing for C.
> 
> This is a preparation for further work on the ISO_C_BINDING constants.
> That, we do via iso-c-binding.def , whose last field is a standard
> for the constant to be defined for the standard in question, which is
> then checked.  I could try and invent a different method for this,
> but I'd rather not.
> 
> So, OK for trunk? Other, better ideas?

ChangeLog was missing, here it is. Also regression-tested.


gcc/fortran/ChangeLog:

	* intrinsic.cc (add_functions): Convert uint and
	selected_unsigned_kind to GFC_STD_UNSIGNED.
	(gfc_check_intrinsic_standard): Handle GFC_STD_UNSIGNED.
	* libgfortran.h (GFC_STD_UNSIGNED): Add.
	* options.cc (gfc_post_options): Set GFC_STD_UNSIGNED
	if -funsigned is set.
Jerry D Oct. 11, 2024, 8:48 p.m. UTC | #2
Good to go.

On Fri, Oct 11, 2024, 9:06 AM Thomas Koenig <tkoenig@netcologne.de> wrote:

> Am 11.10.24 um 18:00 schrieb Thomas Koenig:
> > Hello world,
> >
> > the attached patch creates an unsigned "standard" for the
> > gfc_option.allow_std field.
> >
> > One of the main reason why people want UNSIGNED for Fortran is
> > interfacing for C.
> >
> > This is a preparation for further work on the ISO_C_BINDING constants.
> > That, we do via iso-c-binding.def , whose last field is a standard
> > for the constant to be defined for the standard in question, which is
> > then checked.  I could try and invent a different method for this,
> > but I'd rather not.
> >
> > So, OK for trunk? Other, better ideas?
>
> ChangeLog was missing, here it is. Also regression-tested.
>
>
> gcc/fortran/ChangeLog:
>
>         * intrinsic.cc (add_functions): Convert uint and
>         selected_unsigned_kind to GFC_STD_UNSIGNED.
>         (gfc_check_intrinsic_standard): Handle GFC_STD_UNSIGNED.
>         * libgfortran.h (GFC_STD_UNSIGNED): Add.
>         * options.cc (gfc_post_options): Set GFC_STD_UNSIGNED
>         if -funsigned is set.
>
diff mbox series

Patch

diff --git a/gcc/fortran/intrinsic.cc b/gcc/fortran/intrinsic.cc
index 0a6be215825..c6fb0a6de45 100644
--- a/gcc/fortran/intrinsic.cc
+++ b/gcc/fortran/intrinsic.cc
@@ -2264,7 +2264,7 @@  add_functions (void)
   make_generic ("long", GFC_ISYM_LONG, GFC_STD_GNU);
 
   add_sym_2 ("uint", GFC_ISYM_UINT, CLASS_ELEMENTAL, ACTUAL_NO, BT_UNSIGNED,
-	     di, GFC_STD_GNU, gfc_check_uint, gfc_simplify_uint,
+	     di, GFC_STD_UNSIGNED, gfc_check_uint, gfc_simplify_uint,
 	     gfc_resolve_uint, a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di,
 	     OPTIONAL);
 
@@ -2966,17 +2966,13 @@  add_functions (void)
 
   make_generic ("selected_int_kind", GFC_ISYM_SI_KIND, GFC_STD_F95);
 
-  if (flag_unsigned)
-    {
-
-      add_sym_1 ("selected_unsigned_kind", GFC_ISYM_SU_KIND,
-		 CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di,
-		 GFC_STD_GNU, gfc_check_selected_int_kind,
-		 gfc_simplify_selected_unsigned_kind, NULL, r, BT_INTEGER, di,
-		 REQUIRED);
+  add_sym_1 ("selected_unsigned_kind", GFC_ISYM_SU_KIND,
+	     CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di,
+	     GFC_STD_UNSIGNED, gfc_check_selected_int_kind,
+	     gfc_simplify_selected_unsigned_kind, NULL, r, BT_INTEGER, di,
+	     REQUIRED);
 
       make_generic ("selected_unsigned_kind", GFC_ISYM_SU_KIND, GFC_STD_GNU);
-    }
 
   add_sym_1 ("selected_logical_kind", GFC_ISYM_SL_KIND, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di,
 	     GFC_STD_F2023, /* it has the same requirements */ gfc_check_selected_int_kind,
@@ -4945,6 +4941,10 @@  gfc_check_intrinsic_standard (const gfc_intrinsic_sym* isym,
       symstd_msg = _("for backward compatibility");
       break;
 
+    case GFC_STD_UNSIGNED:
+      symstd_msg = _("unsigned");
+      break;
+
     default:
       gfc_internal_error ("Invalid standard code on intrinsic %qs (%d)",
 			  isym->name, isym->standard);
diff --git a/gcc/fortran/libgfortran.h b/gcc/fortran/libgfortran.h
index 895629d6f80..773f2a0b049 100644
--- a/gcc/fortran/libgfortran.h
+++ b/gcc/fortran/libgfortran.h
@@ -23,6 +23,8 @@  along with GCC; see the file COPYING3.  If not see
    Nevertheless, some features available in F2018 are prohibited in F2023.
    Please remember to keep those definitions in sync with
    gfortran.texi.  */
+#define GFC_STD_UNSIGNED	(1<<14) /* Not really a standard, but
+					   better for error handling.  */
 #define GFC_STD_F2023_DEL	(1<<13)	/* Prohibited in F2023.  */
 #define GFC_STD_F2023		(1<<12)	/* New in F2023.  */
 #define GFC_STD_F2018_DEL	(1<<11)	/* Deleted in F2018.  */
diff --git a/gcc/fortran/options.cc b/gcc/fortran/options.cc
index 6f2579ad9de..d998d0e6117 100644
--- a/gcc/fortran/options.cc
+++ b/gcc/fortran/options.cc
@@ -539,6 +539,10 @@  gfc_post_options (const char **pfilename)
   else if (gfc_option.allow_std & GFC_STD_F2003)
     lang_hooks.name = "GNU Fortran2003";
 
+  /* Set the unsigned "standard".  */
+  if (flag_unsigned)
+    gfc_option.allow_std |= GFC_STD_UNSIGNED;
+
   return gfc_cpp_preprocess_only ();
 }