public inbox for fortran@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609]
@ 2023-11-18 22:12 Harald Anlauf
  2023-11-19  0:04 ` Steve Kargl
  0 siblings, 1 reply; 13+ messages in thread
From: Harald Anlauf @ 2023-11-18 22:12 UTC (permalink / raw)
  To: fortran, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 920 bytes --]

Hi all,

Fortran 2023 added restrictions on integer arguments to SYSTEM_CLOCK.
The attached patch implements these.

I was struggling with the way we should handle features that are sort-of
deleted in a new standard, but not described as such in the standard,
which is why we do not have GFC_STD_F2023_DEL.  As -std=gnu should not
apply this restriction, I came up with the solution in the patch.
While playing, I hit a gcc_unreachable in notify_std_msg due to a
missing case, also fixed.

Interestingly, the standard now has a recommendation:

16.9.202 SYSTEM_CLOCK

It it recommended that all references to SYSTEM_CLOCK use integer
arguments with a decimal exponent range of at least 18. ...

In case the user chooses integer(4), shall we emit a warning
e.g. under -pedantic, or some other flag?  This is not done
in the patch, but could be added.

Regtested on x86_64-pc-linux-gnu.  OK for mainline?

Thanks,
Harald


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: pr112609.diff --]
[-- Type: text/x-patch, Size: 5721 bytes --]

From 44814d9436b2e0be14b76b137602e40f3fdaf805 Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anlauf@gmx.de>
Date: Sat, 18 Nov 2023 22:51:35 +0100
Subject: [PATCH] Fortran: restrictions on integer arguments to SYSTEM_CLOCK
 [PR112609]

Fortran 2023 added restrictions on integer arguments to SYSTEM_CLOCK to
have a decimal exponent range at least as large as a default integer,
and that all integer arguments have the same kind type parameter.

gcc/fortran/ChangeLog:

	PR fortran/112609
	* check.cc (gfc_check_system_clock): Add checks on integer arguments
	to SYSTEM_CLOCK specific to F2023.
	* error.cc (notify_std_msg): Adjust to handle new features added
	in F2023.

gcc/testsuite/ChangeLog:

	PR fortran/112609
	* gfortran.dg/system_clock_4.f90: New test.
---
 gcc/fortran/check.cc                         | 57 ++++++++++++++++++++
 gcc/fortran/error.cc                         |  4 +-
 gcc/testsuite/gfortran.dg/system_clock_4.f90 | 24 +++++++++
 3 files changed, 84 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gfortran.dg/system_clock_4.f90

diff --git a/gcc/fortran/check.cc b/gcc/fortran/check.cc
index 6c45e6542f0..8c2534ae1c9 100644
--- a/gcc/fortran/check.cc
+++ b/gcc/fortran/check.cc
@@ -6774,6 +6774,10 @@ bool
 gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 			gfc_expr *count_max)
 {
+  int first_int_kind = -1;
+  bool f2023 = ((gfc_option.allow_std & GFC_STD_F2023) != 0
+		&& (gfc_option.allow_std & GFC_STD_GNU) == 0);
+
   if (count != NULL)
     {
       if (!scalar_check (count, 0))
@@ -6788,8 +6792,18 @@ gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 			      &count->where))
 	return false;

+      if (f2023 && count->ts.kind < gfc_default_integer_kind)
+	{
+	  gfc_error ("Fortran 2023: COUNT argument to SYSTEM_CLOCK "
+		     "at %L must have kind of at least default integer",
+		     &count->where);
+	  return false;
+	}
+
       if (!variable_check (count, 0, false))
 	return false;
+
+      first_int_kind = count->ts.kind;
     }

   if (count_rate != NULL)
@@ -6816,6 +6830,17 @@ gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 				  "SYSTEM_CLOCK at %L has non-default kind",
 				  &count_rate->where))
 	    return false;
+
+	  if (f2023 && count_rate->ts.kind < gfc_default_integer_kind)
+	    {
+	      gfc_error ("Fortran 2023: COUNT_RATE argument to SYSTEM_CLOCK "
+			 "at %L must have kind of at least default integer",
+			 &count_rate->where);
+	      return false;
+	    }
+
+	  if (first_int_kind < 0)
+	    first_int_kind = count_rate->ts.kind;
 	}

     }
@@ -6836,6 +6861,38 @@ gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,

       if (!variable_check (count_max, 2, false))
 	return false;
+
+      if (f2023 && count_max->ts.kind < gfc_default_integer_kind)
+	{
+	  gfc_error ("Fortran 2023: COUNT_MAX argument to SYSTEM_CLOCK "
+		     "at %L must have kind of at least default integer",
+		     &count_max->where);
+	  return false;
+	}
+
+      if (first_int_kind < 0)
+	first_int_kind = count_max->ts.kind;
+    }
+
+  if (f2023 && first_int_kind > 0)
+    {
+      if (count_rate
+	  && count_rate->ts.type == BT_INTEGER
+	  && count_rate->ts.kind != first_int_kind)
+	{
+	  gfc_error ("Fortran 2023: all integer arguments to SYSTEM_CLOCK "
+		     "at %L must have the same kind",
+		     &count_rate->where);
+	  return false;
+	}
+
+      if (count_max && count_max->ts.kind != first_int_kind)
+	{
+	  gfc_error ("Fortran 2023: all integer arguments to SYSTEM_CLOCK "
+		     "at %L must have the same kind",
+		     &count_max->where);
+	  return false;
+	}
     }

   return true;
diff --git a/gcc/fortran/error.cc b/gcc/fortran/error.cc
index 2ac51e95e4d..b8b36c0cd7c 100644
--- a/gcc/fortran/error.cc
+++ b/gcc/fortran/error.cc
@@ -980,7 +980,9 @@ char const*
 notify_std_msg(int std)
 {

-  if (std & GFC_STD_F2018_DEL)
+  if (std & GFC_STD_F2023)
+    return _("Fortran 2023:");
+  else if (std & GFC_STD_F2018_DEL)
     return _("Fortran 2018 deleted feature:");
   else if (std & GFC_STD_F2018_OBS)
     return _("Fortran 2018 obsolescent feature:");
diff --git a/gcc/testsuite/gfortran.dg/system_clock_4.f90 b/gcc/testsuite/gfortran.dg/system_clock_4.f90
new file mode 100644
index 00000000000..f2d706f6d8c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/system_clock_4.f90
@@ -0,0 +1,24 @@
+! { dg-do compile }
+! { dg-options "-std=f2023" }
+! PR fortran/112609 - F2023 restrictions on integer arguments to SYSTEM_CLOCK
+
+program p
+  implicit none
+  integer    :: i,  j,  k
+  integer(2) :: i2, j2, k2
+  integer(8) :: i8, j8, k8
+  real       :: x
+
+  call system_clock(count=i2)      ! { dg-error "at least default integer" }
+  call system_clock(count_rate=j2) ! { dg-error "at least default integer" }
+  call system_clock(count_max=k2)  ! { dg-error "at least default integer" }
+
+  call system_clock(count=i8,count_rate=x,count_max=k8)
+  call system_clock(count=i, count_rate=j8)     ! { dg-error "must have the same kind" }
+  call system_clock(count=i8,count_rate=j)      ! { dg-error "must have the same kind" }
+  call system_clock(count=i, count_max=k8)      ! { dg-error "must have the same kind" }
+  call system_clock(count=i8,count_max=k)       ! { dg-error "must have the same kind" }
+  call system_clock(count_rate=j, count_max=k8) ! { dg-error "must have the same kind" }
+  call system_clock(count_rate=j8,count_max=k)  ! { dg-error "must have the same kind" }
+  call system_clock(i,x,k8)                     ! { dg-error "must have the same kind" }
+end
--
2.35.3


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609]
  2023-11-18 22:12 [PATCH] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609] Harald Anlauf
@ 2023-11-19  0:04 ` Steve Kargl
  2023-11-19 20:46   ` [PATCH, v2] " Harald Anlauf
  0 siblings, 1 reply; 13+ messages in thread
From: Steve Kargl @ 2023-11-19  0:04 UTC (permalink / raw)
  To: Harald Anlauf; +Cc: fortran, gcc-patches

On Sat, Nov 18, 2023 at 11:12:55PM +0100, Harald Anlauf wrote:
> 
> Fortran 2023 added restrictions on integer arguments to SYSTEM_CLOCK.
> The attached patch implements these.
> 
> I was struggling with the way we should handle features that are sort-of
> deleted in a new standard, but not described as such in the standard,
> which is why we do not have GFC_STD_F2023_DEL.  As -std=gnu should not
> apply this restriction, I came up with the solution in the patch.
> While playing, I hit a gcc_unreachable in notify_std_msg due to a
> missing case, also fixed.
> 
> Interestingly, the standard now has a recommendation:
> 
> 16.9.202 SYSTEM_CLOCK
> 
> It it recommended that all references to SYSTEM_CLOCK use integer
> arguments with a decimal exponent range of at least 18. ...
> 
> In case the user chooses integer(4), shall we emit a warning
> e.g. under -pedantic, or some other flag?  This is not done
> in the patch, but could be added.
> 
> Regtested on x86_64-pc-linux-gnu.  OK for mainline?
> 

Not in its current form.

>  {
> +  int first_int_kind = -1;
> +  bool f2023 = ((gfc_option.allow_std & GFC_STD_F2023) != 0
> +		&& (gfc_option.allow_std & GFC_STD_GNU) == 0);
> +

If you use the gfc_notify_std(), then you should not need the
above check on GFC_STD_GNU as it should include GFC_STD_F2023.

> 
> +      if (f2023 && count->ts.kind < gfc_default_integer_kind)
> +	{
> +	  gfc_error ("Fortran 2023: COUNT argument to SYSTEM_CLOCK "
> +		     "at %L must have kind of at least default integer",
> +		     &count->where);
> +	  return false;
> +	}

Elsewhere in the FE, gfortran uses gfc_notify_std() to enforce 
requirements of a Fortran standard.  The above would be 

      if (count->ts.kind < gfc_default_integer_kind
          && gfc_notify_std (GFC_STD_F2023, "COUNT argument to SYSTEM_CLOCK "
                             "at %L must have kind of at least default integer",
                             &count->where))

Note, gfc_notify_std() should add the 'Fortran 2023: ' string,
if not, that should be fixed.

Of course, I seldom provide patches if others don't have a comment
then do as you like.

-- 
Steve

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH, v2] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609]
  2023-11-19  0:04 ` Steve Kargl
@ 2023-11-19 20:46   ` Harald Anlauf
  2023-11-20 19:02     ` Steve Kargl
  0 siblings, 1 reply; 13+ messages in thread
From: Harald Anlauf @ 2023-11-19 20:46 UTC (permalink / raw)
  To: sgk; +Cc: fortran, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 2803 bytes --]

Hi Steve,

On 11/19/23 01:04, Steve Kargl wrote:
> On Sat, Nov 18, 2023 at 11:12:55PM +0100, Harald Anlauf wrote:
>> Regtested on x86_64-pc-linux-gnu.  OK for mainline?
>>
>
> Not in its current form.
>
>>   {
>> +  int first_int_kind = -1;
>> +  bool f2023 = ((gfc_option.allow_std & GFC_STD_F2023) != 0
>> +		&& (gfc_option.allow_std & GFC_STD_GNU) == 0);
>> +
>
> If you use the gfc_notify_std(), then you should not need the
> above check on GFC_STD_GNU as it should include GFC_STD_F2023.

this is actually the question (and problem).  For all new features,
-std=gnu shall include everything allowed by -std=f2023.

Here we have the problem that the testcase is valid F2018 and is
silently accepted by gfortran-13 for -std=gnu and -std=f2018.

I prefer to keep it that way also for gfortran-14, and apply the
new restrictions only for -std=f2023.  Do we agree on this?

Now that should happen for -std=gnu -pedantic (-w)?

I have thought some more and came up with the revised attached
patch, which still has the above condition.  It now marks the
diagnostics as GNU extensions beyond F2023 for -std=f2023.

The mask f2023 in the above form suppresses new warnings even
for -pedantic; one would normally use -w to suppress them.

Now if you remove the second part of the condition, we will
regress on testcases system_clock_1.f90 and system_clock_3.f90
because they would emit GNU extension warnings because the
testsuite runs with -pedantic.

The options I see:

- use patch-V1 (although diagnostics are better in V2),

- use patch-V2,

- use patch-V2, but enable -pedantic warnings for previously
   valid code, and adjust the failing testcases

- ???

> Elsewhere in the FE, gfortran uses gfc_notify_std() to enforce
> requirements of a Fortran standard.  The above would be
>
>        if (count->ts.kind < gfc_default_integer_kind
>            && gfc_notify_std (GFC_STD_F2023, "COUNT argument to SYSTEM_CLOCK "
>                               "at %L must have kind of at least default integer",
>                               &count->where))

I tried this first, and it did not do the job.

The logic in gfc_notify_std is:

   estd = std & ~gfc_option.allow_std;  /* Standard to error about.  */
   error = (estd != 0);
   if (error)
     msg = notify_std_msg (estd);
...

So for -std=f2023 we get estd=0, error=false, and *NO* error.
For -std=f2018 we get error=true and an error message.
This is the opposite of what is needed.

Can you please try yourself?

> Note, gfc_notify_std() should add the 'Fortran 2023: ' string,
> if not, that should be fixed.

This I did fix.

> Of course, I seldom provide patches if others don't have a comment
> then do as you like.

Thanks for your feedback!

Harald


[-- Attachment #2: pr112609-v2.diff --]
[-- Type: text/x-patch, Size: 5692 bytes --]

From 2a85dc469696c85524459380ce11faa20e558680 Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anlauf@gmx.de>
Date: Sun, 19 Nov 2023 21:14:37 +0100
Subject: [PATCH] Fortran: restrictions on integer arguments to SYSTEM_CLOCK
 [PR112609]

Fortran 2023 added restrictions on integer arguments to SYSTEM_CLOCK to
have a decimal exponent range at least as large as a default integer,
and that all integer arguments have the same kind type parameter.

gcc/fortran/ChangeLog:

	PR fortran/112609
	* check.cc (gfc_check_system_clock): Add checks on integer arguments
	to SYSTEM_CLOCK specific to F2023.
	* error.cc (notify_std_msg): Adjust to handle new features added
	in F2023.

gcc/testsuite/ChangeLog:

	PR fortran/112609
	* gfortran.dg/system_clock_4.f90: New test.
---
 gcc/fortran/check.cc                         | 52 ++++++++++++++++++++
 gcc/fortran/error.cc                         |  4 +-
 gcc/testsuite/gfortran.dg/system_clock_4.f90 | 24 +++++++++
 3 files changed, 79 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gfortran.dg/system_clock_4.f90

diff --git a/gcc/fortran/check.cc b/gcc/fortran/check.cc
index 6c45e6542f0..faaea853bc4 100644
--- a/gcc/fortran/check.cc
+++ b/gcc/fortran/check.cc
@@ -6774,6 +6774,10 @@ bool
 gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 			gfc_expr *count_max)
 {
+  int first_int_kind = -1;
+  bool f2023 = ((gfc_option.allow_std & GFC_STD_F2023) != 0
+		&& (gfc_option.allow_std & GFC_STD_GNU) == 0);
+
   if (count != NULL)
     {
       if (!scalar_check (count, 0))
@@ -6788,8 +6792,17 @@ gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 			      &count->where))
 	return false;
 
+      if (f2023 && count->ts.kind < gfc_default_integer_kind
+	  && !gfc_notify_std (GFC_STD_GNU, "Fortran 2023 requires "
+			      "COUNT argument to SYSTEM_CLOCK at %L "
+			      "to have a kind of at least default integer",
+			      &count->where))
+	return false;
+
       if (!variable_check (count, 0, false))
 	return false;
+
+      first_int_kind = count->ts.kind;
     }
 
   if (count_rate != NULL)
@@ -6816,6 +6829,16 @@ gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 				  "SYSTEM_CLOCK at %L has non-default kind",
 				  &count_rate->where))
 	    return false;
+
+	  if (f2023 && count_rate->ts.kind < gfc_default_integer_kind
+	      && !gfc_notify_std (GFC_STD_GNU, "Fortran 2023 requires "
+				  "COUNT_RATE argument to SYSTEM_CLOCK at %L "
+				  "to have a kind of at least default integer",
+				  &count_rate->where))
+	    return false;
+
+	  if (first_int_kind < 0)
+	    first_int_kind = count_rate->ts.kind;
 	}
 
     }
@@ -6836,6 +6859,35 @@ gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 
       if (!variable_check (count_max, 2, false))
 	return false;
+
+      if (f2023 && count_max->ts.kind < gfc_default_integer_kind
+	  && !gfc_notify_std (GFC_STD_GNU, "Fortran 2023 requires "
+			      "COUNT_MAX argument to SYSTEM_CLOCK at %L "
+			      "to have a kind of at least default integer",
+			      &count_max->where))
+	  return false;
+
+      if (first_int_kind < 0)
+	first_int_kind = count_max->ts.kind;
+    }
+
+  if (f2023 && first_int_kind > 0)
+    {
+      if (count_rate
+	  && count_rate->ts.type == BT_INTEGER
+	  && count_rate->ts.kind != first_int_kind
+	  && !gfc_notify_std (GFC_STD_GNU, "Fortran 2023 requires "
+			      "all integer arguments to SYSTEM_CLOCK "
+			      "at %L to have the same kind",
+			      &count_rate->where))
+	return false;
+
+      if (count_max && count_max->ts.kind != first_int_kind
+	  && !gfc_notify_std (GFC_STD_GNU, "Fortran 2023 requires "
+			      "all integer arguments to SYSTEM_CLOCK "
+			      "at %L to have the same kind",
+			      &count_max->where))
+	return false;
     }
 
   return true;
diff --git a/gcc/fortran/error.cc b/gcc/fortran/error.cc
index 2ac51e95e4d..b8b36c0cd7c 100644
--- a/gcc/fortran/error.cc
+++ b/gcc/fortran/error.cc
@@ -980,7 +980,9 @@ char const*
 notify_std_msg(int std)
 {
 
-  if (std & GFC_STD_F2018_DEL)
+  if (std & GFC_STD_F2023)
+    return _("Fortran 2023:");
+  else if (std & GFC_STD_F2018_DEL)
     return _("Fortran 2018 deleted feature:");
   else if (std & GFC_STD_F2018_OBS)
     return _("Fortran 2018 obsolescent feature:");
diff --git a/gcc/testsuite/gfortran.dg/system_clock_4.f90 b/gcc/testsuite/gfortran.dg/system_clock_4.f90
new file mode 100644
index 00000000000..d4496efbe2a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/system_clock_4.f90
@@ -0,0 +1,24 @@
+! { dg-do compile }
+! { dg-options "-std=f2023" }
+! PR fortran/112609 - F2023 restrictions on integer arguments to SYSTEM_CLOCK
+
+program p
+  implicit none
+  integer    :: i,  j,  k
+  integer(2) :: i2, j2, k2
+  integer(8) :: i8, j8, k8
+  real       :: x
+
+  call system_clock(count=i2)      ! { dg-error "at least default integer" }
+  call system_clock(count_rate=j2) ! { dg-error "at least default integer" }
+  call system_clock(count_max=k2)  ! { dg-error "at least default integer" }
+
+  call system_clock(count=i8,count_rate=x,count_max=k8)
+  call system_clock(count=i, count_rate=j8)     ! { dg-error "have the same kind" }
+  call system_clock(count=i8,count_rate=j)      ! { dg-error "have the same kind" }
+  call system_clock(count=i, count_max=k8)      ! { dg-error "have the same kind" }
+  call system_clock(count=i8,count_max=k)       ! { dg-error "have the same kind" }
+  call system_clock(count_rate=j, count_max=k8) ! { dg-error "have the same kind" }
+  call system_clock(count_rate=j8,count_max=k)  ! { dg-error "have the same kind" }
+  call system_clock(i,x,k8)                     ! { dg-error "have the same kind" }
+end
-- 
2.35.3


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH, v2] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609]
  2023-11-19 20:46   ` [PATCH, v2] " Harald Anlauf
@ 2023-11-20 19:02     ` Steve Kargl
  2023-11-21 11:33       ` Mikael Morin
  0 siblings, 1 reply; 13+ messages in thread
From: Steve Kargl @ 2023-11-20 19:02 UTC (permalink / raw)
  To: Harald Anlauf; +Cc: fortran, gcc-patches

Harald, 

Sorry about delayed response.  Got side-tracked by Family this weekend.

On Sun, Nov 19, 2023 at 09:46:46PM +0100, Harald Anlauf wrote:
> 
> On 11/19/23 01:04, Steve Kargl wrote:
> > On Sat, Nov 18, 2023 at 11:12:55PM +0100, Harald Anlauf wrote:
> > > Regtested on x86_64-pc-linux-gnu.  OK for mainline?
> > > 
> > 
> > Not in its current form.
> > 
> > >   {
> > > +  int first_int_kind = -1;
> > > +  bool f2023 = ((gfc_option.allow_std & GFC_STD_F2023) != 0
> > > +		&& (gfc_option.allow_std & GFC_STD_GNU) == 0);
> > > +
> > 
> > If you use the gfc_notify_std(), then you should not need the
> > above check on GFC_STD_GNU as it should include GFC_STD_F2023.
> 
> this is actually the question (and problem).  For all new features,
> -std=gnu shall include everything allowed by -std=f2023.

Yes.

> Here we have the problem that the testcase is valid F2018 and is
> silently accepted by gfortran-13 for -std=gnu and -std=f2018.

F2023 is the Fortran standard and supercedes previous Fortran standards.
If there is a conflict between the standing standard and an old standard,
then the standing standard should take precedence unless one specifically
uses, for example, -std=f2018.

After 20+ years of contributing to gfortran, I've come to believe
that the default -std= should be the current standard, and -std=gnu
should be deprecated.  All GNU extensions should require an option
to active.  For example,

   write(*,*), 'hello'
   end

   gfortran12 -o z a.f90
   a.f90:1:10:

   1 | write(*,*), 'hello'
     |           1
   Warning: Legacy Extension: Comma before i/o item list at (1)

This should be an error unless the -fallow-write-stmt-comma is used.
The option would simply degrade the error to a warning.  Why, you ask?
To encourage people to write standard conforming code.  Unfortunately,
that horse has left the barn.

> I prefer to keep it that way also for gfortran-14, and apply the
> new restrictions only for -std=f2023.  Do we agree on this?

If gfortran wants to maintain the status quo for 14, then
it should probably remove the -std=f2023 patch and wait for
the branch to 15.  

> Now that should happen for -std=gnu -pedantic (-w)?

-pedantic is not a very effective option and should be ignored.
 
> I have thought some more and came up with the revised attached
> patch, which still has the above condition.  It now marks the
> diagnostics as GNU extensions beyond F2023 for -std=f2023.
> 
> The mask f2023 in the above form suppresses new warnings even
> for -pedantic; one would normally use -w to suppress them.
> 
> Now if you remove the second part of the condition, we will
> regress on testcases system_clock_1.f90 and system_clock_3.f90
> because they would emit GNU extension warnings because the
> testsuite runs with -pedantic.

It seems that the solution is to fix the code in the testsuite.
With -std=f2023 or -std=gnu, the code should error.  With
-std=f2018 (or older?), the code should compile.

It's been too long for my memory, doesn't the use of
'{ dg-options "-std=f023" }' supercede the set of predefined options
such as -pedantic?

> The options I see:
> 
> - use patch-V1 (although diagnostics are better in V2),
> 
> - use patch-V2,
> 
> - use patch-V2, but enable -pedantic warnings for previously
>   valid code, and adjust the failing testcases

I suppose that this last one is the best option.
> 
> - ???
> 
> > Elsewhere in the FE, gfortran uses gfc_notify_std() to enforce
> > requirements of a Fortran standard.  The above would be
> > 
> >        if (count->ts.kind < gfc_default_integer_kind
> >            && gfc_notify_std (GFC_STD_F2023, "COUNT argument to SYSTEM_CLOCK "
> >                               "at %L must have kind of at least default integer",
> >                               &count->where))
> 
> I tried this first, and it did not do the job.
> 
> The logic in gfc_notify_std is:
> 
>   estd = std & ~gfc_option.allow_std;  /* Standard to error about.  */
>   error = (estd != 0);
>   if (error)
>     msg = notify_std_msg (estd);
> ...
> 
> So for -std=f2023 we get estd=0, error=false, and *NO* error.
> For -std=f2018 we get error=true and an error message.
> This is the opposite of what is needed.
> 
> Can you please try yourself?
> 

I was afraid you were going to say this.  :-) :-) 

The holidays draw near.  I can probably find the time to
poke at gfortran.

> > Note, gfc_notify_std() should add the 'Fortran 2023: ' string,
> > if not, that should be fixed.
> 
> This I did fix.

Thanks.

> > Of course, I seldom provide patches if others don't have a comment
> > then do as you like.
> 
> Thanks for your feedback!

No, thank you for continuing to peck away at gfortran issue.

-- 
steve

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH, v2] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609]
  2023-11-20 19:02     ` Steve Kargl
@ 2023-11-21 11:33       ` Mikael Morin
  2023-11-21 21:54         ` [PATCH, v3] " Harald Anlauf
  0 siblings, 1 reply; 13+ messages in thread
From: Mikael Morin @ 2023-11-21 11:33 UTC (permalink / raw)
  To: sgk, Harald Anlauf; +Cc: fortran, gcc-patches

Hello,

Le 20/11/2023 à 20:02, Steve Kargl a écrit :
> Harald,
> 
> Sorry about delayed response.  Got side-tracked by Family this weekend.
> 
> On Sun, Nov 19, 2023 at 09:46:46PM +0100, Harald Anlauf wrote:
>>
>> On 11/19/23 01:04, Steve Kargl wrote:
>>> On Sat, Nov 18, 2023 at 11:12:55PM +0100, Harald Anlauf wrote:
>>>> Regtested on x86_64-pc-linux-gnu.  OK for mainline?
>>>>
>>>
>>> Not in its current form.
>>>
>>>>    {
>>>> +  int first_int_kind = -1;
>>>> +  bool f2023 = ((gfc_option.allow_std & GFC_STD_F2023) != 0
>>>> +		&& (gfc_option.allow_std & GFC_STD_GNU) == 0);
>>>> +
>>>
>>> If you use the gfc_notify_std(), then you should not need the
>>> above check on GFC_STD_GNU as it should include GFC_STD_F2023.
>>
>> this is actually the question (and problem).  For all new features,
>> -std=gnu shall include everything allowed by -std=f2023.
> 
> Yes.
> 
Harald, you mentioned the lack of GFC_STD_F2023_DEL feature group in 
your first message, but I don't quite understand why you didn't add one. 
  It seems to me the most natural way to do this.

>> Here we have the problem that the testcase is valid F2018 and is
>> silently accepted by gfortran-13 for -std=gnu and -std=f2018.
> 
> F2023 is the Fortran standard and supercedes previous Fortran standards.
> If there is a conflict between the standing standard and an old standard,
> then the standing standard should take precedence unless one specifically
> uses, for example, -std=f2018.
> 
> After 20+ years of contributing to gfortran, I've come to believe
> that the default -std= should be the current standard, and -std=gnu
> should be deprecated.  All GNU extensions should require an option
> to active.  For example,
> 
>     write(*,*), 'hello'
>     end
> 
>     gfortran12 -o z a.f90
>     a.f90:1:10:
> 
>     1 | write(*,*), 'hello'
>       |           1
>     Warning: Legacy Extension: Comma before i/o item list at (1)
> 
> This should be an error unless the -fallow-write-stmt-comma is used.
> The option would simply degrade the error to a warning.  Why, you ask?
> To encourage people to write standard conforming code.  Unfortunately,
> that horse has left the barn.
> 
>> I prefer to keep it that way also for gfortran-14, and apply the
>> new restrictions only for -std=f2023.  Do we agree on this?
> 
I suggest we emit a warning by default, error with -std=f2023 (I agree 
with Steve that we should push towards strict f2023 conformance), and no 
diagnostic with -std=gnu or -std=f2018 or lower.

> If gfortran wants to maintain the status quo for 14, then
> it should probably remove the -std=f2023 patch and wait for
> the branch to 15.
> 
>> Now that should happen for -std=gnu -pedantic (-w)?
> 
> -pedantic is not a very effective option and should be ignored.
>  >> I have thought some more and came up with the revised attached
>> patch, which still has the above condition.  It now marks the
>> diagnostics as GNU extensions beyond F2023 for -std=f2023.
>>
>> The mask f2023 in the above form suppresses new warnings even
>> for -pedantic; one would normally use -w to suppress them.
>>
>> Now if you remove the second part of the condition, we will
>> regress on testcases system_clock_1.f90 and system_clock_3.f90
>> because they would emit GNU extension warnings because the
>> testsuite runs with -pedantic.
> 
> It seems that the solution is to fix the code in the testsuite.

Agreed, these seem to explicitly test mismatching kinds, so add an 
option to prevent error.

Mikael

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH, v3] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609]
  2023-11-21 11:33       ` Mikael Morin
@ 2023-11-21 21:54         ` Harald Anlauf
  2023-11-21 22:09           ` Harald Anlauf
  0 siblings, 1 reply; 13+ messages in thread
From: Harald Anlauf @ 2023-11-21 21:54 UTC (permalink / raw)
  To: Mikael Morin, sgk; +Cc: fortran, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 1228 bytes --]

Hi Mikael, Steve,

On 11/21/23 12:33, Mikael Morin wrote:
> Harald, you mentioned the lack of GFC_STD_F2023_DEL feature group in
> your first message, but I don't quite understand why you didn't add one.
>   It seems to me the most natural way to do this.

thanks for insisting on this variant.

In my first attack at this problem, I overlooked one place in
libgfortran.h, which I now was able to find and adjust.
Now everything falls into place.

> I suggest we emit a warning by default, error with -std=f2023 (I agree
> with Steve that we should push towards strict f2023 conformance), and no
> diagnostic with -std=gnu or -std=f2018 or lower.

As the majority agrees on this, I accept it.  The attached patch
now does this and fixes the testcases accordingly.

>> It seems that the solution is to fix the code in the testsuite.
>
> Agreed, these seem to explicitly test mismatching kinds, so add an
> option to prevent error.

Done.

I also fixed a few issues in the documentation in gfortran.texi .

As I currently cannot build a full compiler (see PR112643),
patch V3 is not properly regtested yet, but appears to give
results as discussed.

Comments?

> Mikael

Thanks,
Harald



[-- Attachment #2: pr104819-v3.patch --]
[-- Type: text/x-patch, Size: 11057 bytes --]

diff --git a/gcc/fortran/check.cc b/gcc/fortran/check.cc
index 6c45e6542f0..e5cf6a495b5 100644
--- a/gcc/fortran/check.cc
+++ b/gcc/fortran/check.cc
@@ -4357,6 +4357,9 @@ gfc_check_null (gfc_expr *mold)
   if (mold == NULL)
     return true;
 
+  if (mold->expr_type == EXPR_NULL)
+    return true;
+
   if (!variable_check (mold, 0, true))
     return false;
 
@@ -5189,7 +5192,7 @@ is_c_interoperable (gfc_expr *expr, const char **msg, bool c_loc, bool c_f_ptr)
 {
   *msg = NULL;
 
-  if (expr->expr_type == EXPR_NULL)
+  if (expr->expr_type == EXPR_NULL && expr->ts.type == BT_UNKNOWN)
     {
       *msg = "NULL() is not interoperable";
       return false;
diff --git a/gcc/fortran/interface.cc b/gcc/fortran/interface.cc
index fc4fe662eab..641edf9d059 100644
--- a/gcc/fortran/interface.cc
+++ b/gcc/fortran/interface.cc
@@ -2387,6 +2387,8 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
   gfc_component *ppc;
   bool codimension = false;
   gfc_array_spec *formal_as;
+  bool pointer_arg, allocatable_arg;
+  bool pre2018 = ((gfc_option.allow_std & GFC_STD_F2018) == 0);
 
   /* If the formal arg has type BT_VOID, it's to one of the iso_c_binding
      procs c_f_pointer or c_f_procpointer, and we need to accept most
@@ -2564,13 +2566,20 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
 	}
     }
 
+  pointer_arg = gfc_expr_attr (actual).pointer;
+  allocatable_arg = gfc_expr_attr (actual).allocatable;
+
   /* F08: 12.5.2.5 Allocatable and pointer dummy variables.  However, this
      is necessary also for F03, so retain error for both.
+     F2018:15.5.2.5 relaxes this constraint to same attributes.
      NOTE: Other type/kind errors pre-empt this error.  Since they are F03
      compatible, no attempt has been made to channel to this one.  */
   if (UNLIMITED_POLY (formal) && !UNLIMITED_POLY (actual)
       && (CLASS_DATA (formal)->attr.allocatable
-	  ||CLASS_DATA (formal)->attr.class_pointer))
+	  || CLASS_DATA (formal)->attr.class_pointer)
+      && (pre2018
+	  || (allocatable_arg && CLASS_DATA (formal)->attr.allocatable)
+	  || (pointer_arg && CLASS_DATA (formal)->attr.class_pointer)))
     {
       if (where)
 	gfc_error ("Actual argument to %qs at %L must be unlimited "
@@ -2710,7 +2719,8 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
   rank_check = where != NULL && !is_elemental && formal_as
     && (formal_as->type == AS_ASSUMED_SHAPE
 	|| formal_as->type == AS_DEFERRED)
-    && actual->expr_type != EXPR_NULL;
+    && !(actual->expr_type == EXPR_NULL
+	 && actual->ts.type == BT_UNKNOWN);
 
   /* Skip rank checks for NO_ARG_CHECK.  */
   if (formal->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK))
@@ -3184,8 +3194,10 @@ gfc_compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
   gfc_array_ref *actual_arr_ref;
   gfc_array_spec *fas, *aas;
   bool pointer_dummy, pointer_arg, allocatable_arg;
+  bool procptr_dummy, optional_dummy, allocatable_dummy;
 
   bool ok = true;
+  bool pre2018 = ((gfc_option.allow_std & GFC_STD_F2018) == 0);
 
   actual = *ap;
 
@@ -3296,15 +3308,66 @@ gfc_compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
 	  && a->expr->ts.type != BT_ASSUMED)
 	gfc_find_vtab (&a->expr->ts);
 
+      /* Checks for NULL() actual arguments without MOLD.  */
+      if (a->expr->expr_type == EXPR_NULL && a->expr->ts.type == BT_UNKNOWN)
+	{
+	  /* Interp J3/22-146:
+	     "If the context of the reference to NULL is an <actual argument>
+	     corresponding to an <assumed-rank> dummy argument, MOLD shall be
+	     present."  */
+	  fas = (f->sym->ts.type == BT_CLASS && CLASS_DATA (f->sym)
+		 ? CLASS_DATA (f->sym)->as
+		 : f->sym->as);
+	  if (fas && fas->type == AS_ASSUMED_RANK)
+	    {
+	      gfc_error ("Intrinsic %<NULL()%> without %<MOLD%> argument "
+			 "at %L passed to assumed-rank dummy %qs",
+			 &a->expr->where, f->sym->name);
+	      ok = false;
+	      goto match;
+	    }
+
+	  /* Asummed-length dummy argument.  */
+	  if (f->sym->ts.type == BT_CHARACTER
+	      && !f->sym->ts.deferred
+	      && f->sym->ts.u.cl
+	      && f->sym->ts.u.cl->length == NULL)
+	    {
+	      gfc_error ("Intrinsic %<NULL()%> without %<MOLD%> argument "
+			 "at %L passed to assumed-length dummy %qs",
+			 &a->expr->where, f->sym->name);
+	      ok = false;
+	      goto match;
+	    }
+	}
+
+      /* Allow passing of NULL() as disassociated pointer, procedure
+	 pointer, or unallocated allocatable (F2008+) to a respective dummy
+	 argument.  */
+      pointer_dummy = ((f->sym->ts.type != BT_CLASS
+			&& f->sym->attr.pointer)
+		       || (f->sym->ts.type == BT_CLASS
+			   && CLASS_DATA (f->sym)->attr.class_pointer));
+
+      procptr_dummy = ((f->sym->ts.type != BT_CLASS
+			&& f->sym->attr.proc_pointer)
+		       || (f->sym->ts.type == BT_CLASS
+			   && CLASS_DATA (f->sym)->attr.proc_pointer));
+
+      optional_dummy = f->sym->attr.optional;
+
+      allocatable_dummy = ((f->sym->ts.type != BT_CLASS
+			    && f->sym->attr.allocatable)
+			   || (f->sym->ts.type == BT_CLASS
+			       && CLASS_DATA (f->sym)->attr.allocatable));
+
       if (a->expr->expr_type == EXPR_NULL
-	  && ((f->sym->ts.type != BT_CLASS && !f->sym->attr.pointer
-	       && (f->sym->attr.allocatable || !f->sym->attr.optional
-		   || (gfc_option.allow_std & GFC_STD_F2008) == 0))
-	      || (f->sym->ts.type == BT_CLASS
-		  && !CLASS_DATA (f->sym)->attr.class_pointer
-		  && (CLASS_DATA (f->sym)->attr.allocatable
-		      || !f->sym->attr.optional
-		      || (gfc_option.allow_std & GFC_STD_F2008) == 0))))
+	  && !pointer_dummy
+	  && !procptr_dummy
+	  && !(optional_dummy
+	       && (gfc_option.allow_std & GFC_STD_F2008) != 0)
+	  && !(allocatable_dummy
+	       && (gfc_option.allow_std & GFC_STD_F2008) != 0))
 	{
 	  if (where
 	      && (!f->sym->attr.optional
@@ -3409,6 +3472,9 @@ gfc_compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
       if (f->sym->ts.type == BT_CLASS)
 	goto skip_size_check;
 
+      if (a->expr->expr_type == EXPR_NULL)
+	goto skip_size_check;
+
       actual_size = get_expr_storage_size (a->expr);
       formal_size = get_sym_storage_size (f->sym);
       if (actual_size != 0 && actual_size < formal_size
@@ -3606,6 +3672,71 @@ gfc_compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
 	    }
 	}
 
+      /* Check conditions on allocatable and pointer dummy variables:
+
+	 "The actual argument shall be polymorphic if and only if the
+	 associated dummy argument is polymorphic, and either both the
+	 actual and dummy arguments shall be unlimited polymorphic, or the
+	 declared type of the actual argument shall be the same as the
+	 declared type of the dummy argument."
+
+	 with a minor difference from F2008:15.5.2.5 to F2018:15.5.2.5,
+	 where the latter applies only to same (ALLOCATABLE or POINTER)
+	 attributes.  Note that checks related to unlimited polymorphism
+	 are also done in compare_parameter().  */
+      if ((pointer_dummy || allocatable_dummy)
+	  && (pointer_arg || allocatable_arg)
+	  && (pre2018
+	      || (pointer_dummy && pointer_arg)
+	      || (allocatable_dummy && allocatable_arg))
+	  && (f->sym->ts.type == BT_CLASS
+	      || a->expr->ts.type == BT_CLASS))
+       {
+	  if (f->sym->ts.type == BT_CLASS && a->expr->ts.type != BT_CLASS
+	      && pointer_dummy)
+	    {
+	      if (where)
+		gfc_error ("Actual argument to %qs at %L must be a "
+			   "CLASS POINTER",
+			   f->sym->name, &a->expr->where);
+	      ok = false;
+	      goto match;
+	    }
+
+	  if (f->sym->ts.type != BT_CLASS && a->expr->ts.type == BT_CLASS
+	      && pointer_arg)
+	    {
+	      if (where)
+		gfc_error ("Actual argument to %qs at %L cannot be a "
+			   "CLASS POINTER",
+			   f->sym->name, &a->expr->where);
+	      ok = false;
+	      goto match;
+	    }
+
+	  if (f->sym->ts.type == BT_CLASS && a->expr->ts.type != BT_CLASS
+	      && allocatable_dummy)
+	    {
+	      if (where)
+		gfc_error ("Actual argument to %qs at %L must be a "
+			   "CLASS ALLOCATABLE",
+			   f->sym->name, &a->expr->where);
+	      ok = false;
+	      goto match;
+	    }
+
+	  if (f->sym->ts.type != BT_CLASS && a->expr->ts.type == BT_CLASS
+	      && allocatable_arg)
+	    {
+	      if (where)
+		gfc_error ("Actual argument to %qs at %L cannot be a "
+			   "CLASS ALLOCATABLE",
+			   f->sym->name, &a->expr->where);
+	      ok = false;
+	      goto match;
+	    }
+       }
+
 
       /* Fortran 2008, C1242.  */
       if (f->sym->attr.pointer && gfc_is_coindexed (a->expr))
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 50c4604a025..30b941356b6 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -6288,16 +6288,37 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
 	       && (fsym->ts.type != BT_CLASS
 		   || !CLASS_DATA (fsym)->attr.class_pointer))
 	{
-	  /* Pass a NULL pointer to denote an absent arg.  */
-	  gcc_assert (fsym->attr.optional && !fsym->attr.allocatable
-		      && (fsym->ts.type != BT_CLASS
-			  || !CLASS_DATA (fsym)->attr.allocatable));
-	  gfc_init_se (&parmse, NULL);
-	  parmse.expr = null_pointer_node;
-	  if (arg->associated_dummy
-	      && gfc_dummy_arg_get_typespec (*arg->associated_dummy).type
-		 == BT_CHARACTER)
-	    parmse.string_length = build_int_cst (gfc_charlen_type_node, 0);
+	  if ((fsym->ts.type != BT_CLASS
+	       && fsym->attr.allocatable)
+	      || (fsym->ts.type == BT_CLASS
+		  && CLASS_DATA (fsym)->attr.allocatable))
+	    {
+	      /* Pass descriptor equivalent to an unallocated allocatable
+		 actual argument.  */
+	      if (e->rank != 0)
+		gfc_internal_error ("gfc_conv_procedure_call() TODO: "
+				    "NULL(allocatable(rank != 0))");
+	      /* Scalar version below.  */
+	      gfc_init_se (&parmse, NULL);
+	      gfc_conv_expr_reference (&parmse, e);
+	      tmp = parmse.expr;
+	      if (TREE_CODE (tmp) == ADDR_EXPR)
+		tmp = TREE_OPERAND (tmp, 0);
+	      parmse.expr = gfc_conv_scalar_to_descriptor (&parmse, tmp,
+							   fsym->attr);
+	      parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr);
+	    }
+	  else
+	    {
+	      /* Pass a NULL pointer to denote an absent optional arg.  */
+	      gcc_assert (fsym->attr.optional);
+	      gfc_init_se (&parmse, NULL);
+	      parmse.expr = null_pointer_node;
+	      if (arg->associated_dummy
+		  && gfc_dummy_arg_get_typespec (*arg->associated_dummy).type
+		  == BT_CHARACTER)
+		parmse.string_length = build_int_cst (gfc_charlen_type_node, 0);
+	    }
 	}
       else if (fsym && fsym->ts.type == BT_CLASS
 		 && e->ts.type == BT_DERIVED)
@@ -6852,7 +6873,9 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
 		     we can assign it to the data field.  */
 
 		  if (fsym && fsym->as && fsym->as->type == AS_ASSUMED_RANK
-		      && fsym->ts.type != BT_CLASS && e->expr_type != EXPR_NULL)
+		      && fsym->ts.type != BT_CLASS
+		      && !(e->expr_type == EXPR_NULL
+			   && e->ts.type == BT_UNKNOWN))
 		    {
 		      tmp = parmse.expr;
 		      if (TREE_CODE (tmp) == ADDR_EXPR)

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH, v3] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609]
  2023-11-21 21:54         ` [PATCH, v3] " Harald Anlauf
@ 2023-11-21 22:09           ` Harald Anlauf
  2023-11-22  9:36             ` Mikael Morin
  0 siblings, 1 reply; 13+ messages in thread
From: Harald Anlauf @ 2023-11-21 22:09 UTC (permalink / raw)
  To: Mikael Morin, sgk; +Cc: fortran, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 1439 bytes --]

Uhh, it happened again.  Attached a wrong patch.
Only looked at the -v3 ...  My bad.

Sorry!

Harald


On 11/21/23 22:54, Harald Anlauf wrote:
> Hi Mikael, Steve,
>
> On 11/21/23 12:33, Mikael Morin wrote:
>> Harald, you mentioned the lack of GFC_STD_F2023_DEL feature group in
>> your first message, but I don't quite understand why you didn't add one.
>>   It seems to me the most natural way to do this.
>
> thanks for insisting on this variant.
>
> In my first attack at this problem, I overlooked one place in
> libgfortran.h, which I now was able to find and adjust.
> Now everything falls into place.
>
>> I suggest we emit a warning by default, error with -std=f2023 (I agree
>> with Steve that we should push towards strict f2023 conformance), and no
>> diagnostic with -std=gnu or -std=f2018 or lower.
>
> As the majority agrees on this, I accept it.  The attached patch
> now does this and fixes the testcases accordingly.
>
>>> It seems that the solution is to fix the code in the testsuite.
>>
>> Agreed, these seem to explicitly test mismatching kinds, so add an
>> option to prevent error.
>
> Done.
>
> I also fixed a few issues in the documentation in gfortran.texi .
>
> As I currently cannot build a full compiler (see PR112643),
> patch V3 is not properly regtested yet, but appears to give
> results as discussed.
>
> Comments?
>
>> Mikael
>
> Thanks,
> Harald
>
>

[-- Attachment #2: pr112609-v3.diff --]
[-- Type: text/x-patch, Size: 10764 bytes --]

From 8fbffe1bd1faaff456abf6730ac2e2b3c370bc72 Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anlauf@gmx.de>
Date: Tue, 21 Nov 2023 22:29:19 +0100
Subject: [PATCH] Fortran: restrictions on integer arguments to SYSTEM_CLOCK
 [PR112609]

Fortran 2023 added restrictions on integer arguments to SYSTEM_CLOCK to
have a decimal exponent range at least as large as a default integer,
and that all integer arguments have the same kind type parameter.

gcc/fortran/ChangeLog:

	PR fortran/112609
	* check.cc (gfc_check_system_clock): Add checks on integer arguments
	to SYSTEM_CLOCK specific to F2023.
	* error.cc (notify_std_msg): Adjust to handle new features added
	in F2023.
	* gfortran.texi (_gfortran_set_options): Document GFC_STD_F2023_DEL,
	remove obsolete option GFC_STD_F2008_TS and fix enumeration values.
	* libgfortran.h (GFC_STD_F2023_DEL): Add and use in GFC_STD_OPT_F23.
	* options.cc (set_default_std_flags): Add GFC_STD_F2023_DEL.

gcc/testsuite/ChangeLog:

	PR fortran/112609
	* gfortran.dg/system_clock_1.f90: Add option -std=f2003.
	* gfortran.dg/system_clock_3.f08: Add option -std=f2008.
	* gfortran.dg/system_clock_4.f90: New test.
---
 gcc/fortran/check.cc                         | 50 ++++++++++++++++++++
 gcc/fortran/error.cc                         |  6 ++-
 gcc/fortran/gfortran.texi                    | 10 ++--
 gcc/fortran/libgfortran.h                    |  8 ++--
 gcc/fortran/options.cc                       |  6 ++-
 gcc/testsuite/gfortran.dg/system_clock_1.f90 |  1 +
 gcc/testsuite/gfortran.dg/system_clock_3.f08 |  1 +
 gcc/testsuite/gfortran.dg/system_clock_4.f90 | 24 ++++++++++
 8 files changed, 95 insertions(+), 11 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/system_clock_4.f90

diff --git a/gcc/fortran/check.cc b/gcc/fortran/check.cc
index 6c45e6542f0..3b1a0f9f4f4 100644
--- a/gcc/fortran/check.cc
+++ b/gcc/fortran/check.cc
@@ -6774,6 +6774,8 @@ bool
 gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 			gfc_expr *count_max)
 {
+  int first_int_kind = -1;
+
   if (count != NULL)
     {
       if (!scalar_check (count, 0))
@@ -6788,8 +6790,17 @@ gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 			      &count->where))
 	return false;
 
+      if (count->ts.kind < gfc_default_integer_kind
+	  && !gfc_notify_std (GFC_STD_F2023_DEL,
+			      "COUNT argument to SYSTEM_CLOCK at %L "
+			      "with kind smaller than default integer",
+			      &count->where))
+	return false;
+
       if (!variable_check (count, 0, false))
 	return false;
+
+      first_int_kind = count->ts.kind;
     }
 
   if (count_rate != NULL)
@@ -6816,6 +6827,16 @@ gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 				  "SYSTEM_CLOCK at %L has non-default kind",
 				  &count_rate->where))
 	    return false;
+
+	  if (count_rate->ts.kind < gfc_default_integer_kind
+	      && !gfc_notify_std (GFC_STD_F2023_DEL,
+				  "COUNT_RATE argument to SYSTEM_CLOCK at %L "
+				  "with kind smaller than default integer",
+				  &count_rate->where))
+	    return false;
+
+	  if (first_int_kind < 0)
+	    first_int_kind = count_rate->ts.kind;
 	}
 
     }
@@ -6836,6 +6857,35 @@ gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 
       if (!variable_check (count_max, 2, false))
 	return false;
+
+      if (count_max->ts.kind < gfc_default_integer_kind
+	  && !gfc_notify_std (GFC_STD_F2023_DEL,
+			      "COUNT_MAX argument to SYSTEM_CLOCK at %L "
+			      "with kind smaller than default integer",
+			      &count_max->where))
+	return false;
+
+      if (first_int_kind < 0)
+	first_int_kind = count_max->ts.kind;
+    }
+
+  if (first_int_kind > 0)
+    {
+      if (count_rate
+	  && count_rate->ts.type == BT_INTEGER
+	  && count_rate->ts.kind != first_int_kind
+	  && !gfc_notify_std (GFC_STD_F2023_DEL,
+			      "integer arguments to SYSTEM_CLOCK at %L "
+			      "with different kind parameters",
+			      &count_rate->where))
+	return false;
+
+      if (count_max && count_max->ts.kind != first_int_kind
+	  && !gfc_notify_std (GFC_STD_F2023_DEL,
+			      "integer arguments to SYSTEM_CLOCK at %L "
+			      "with different kind parameters",
+			      &count_max->where))
+	return false;
     }
 
   return true;
diff --git a/gcc/fortran/error.cc b/gcc/fortran/error.cc
index 2ac51e95e4d..be715b50469 100644
--- a/gcc/fortran/error.cc
+++ b/gcc/fortran/error.cc
@@ -980,7 +980,11 @@ char const*
 notify_std_msg(int std)
 {
 
-  if (std & GFC_STD_F2018_DEL)
+  if (std & GFC_STD_F2023_DEL)
+    return _("Fortran 2023 deleted feature:");
+  else if (std & GFC_STD_F2023)
+    return _("Fortran 2023:");
+  else if (std & GFC_STD_F2018_DEL)
     return _("Fortran 2018 deleted feature:");
   else if (std & GFC_STD_F2018_OBS)
     return _("Fortran 2018 obsolescent feature:");
diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi
index 41857cc9038..c29cb786279 100644
--- a/gcc/fortran/gfortran.texi
+++ b/gcc/fortran/gfortran.texi
@@ -3476,13 +3476,13 @@ standard.  Possible values are (bitwise or-ed) @code{GFC_STD_F77} (1),
 @code{GFC_STD_F95_OBS} (2), @code{GFC_STD_F95_DEL} (4),
 @code{GFC_STD_F95} (8), @code{GFC_STD_F2003} (16), @code{GFC_STD_GNU}
 (32), @code{GFC_STD_LEGACY} (64), @code{GFC_STD_F2008} (128),
-@code{GFC_STD_F2008_OBS} (256), @code{GFC_STD_F2008_TS} (512),
-@code{GFC_STD_F2018} (1024), @code{GFC_STD_F2018_OBS} (2048),
-@code{GFC_STD=F2018_DEL} (4096), and @code{GFC_STD=F2023} (8192).
+@code{GFC_STD_F2008_OBS} (256), @code{GFC_STD_F2018} (512),
+@code{GFC_STD_F2018_OBS} (1024), @code{GFC_STD_F2018_DEL} (2048),
+@code{GFC_STD_F2023} (4096), and @code{GFC_STD_F2023_DEL} (8192).
 Default: @code{GFC_STD_F95_OBS | GFC_STD_F95_DEL | GFC_STD_F95 |
-GFC_STD_F2003 | GFC_STD_F2008 | GFC_STD_F2008_TS | GFC_STD_F2008_OBS
+GFC_STD_F2003 | GFC_STD_F2008 | GFC_STD_F2008_OBS
 | GFC_STD_F77 | GFC_STD_F2018 | GFC_STD_F2018_OBS | GFC_STD_F2018_DEL
-| GFC_STD_F2023 | GFC_STD_GNU | GFC_STD_LEGACY}.
+| GFC_STD_F2023 | GFC_STD_F2023_DEL | GFC_STD_GNU | GFC_STD_LEGACY}.
 @item @var{option}[1] @tab Standard-warning flag; prints a warning to
 standard error.  Default: @code{GFC_STD_F95_DEL | GFC_STD_LEGACY}.
 @item @var{option}[2] @tab If non zero, enable pedantic checking.
diff --git a/gcc/fortran/libgfortran.h b/gcc/fortran/libgfortran.h
index bdddb317ab0..af7a170c2b1 100644
--- a/gcc/fortran/libgfortran.h
+++ b/gcc/fortran/libgfortran.h
@@ -19,9 +19,10 @@ along with GCC; see the file COPYING3.  If not see
 
 
 /* Flags to specify which standard/extension contains a feature.
-   Note that no features were obsoleted nor deleted in F2003 nor in F2023.
+   Note that no features were obsoleted nor deleted in F2003.
    Please remember to keep those definitions in sync with
    gfortran.texi.  */
+#define GFC_STD_F2023_DEL	(1<<13)	/* Deleted in F2023.  */
 #define GFC_STD_F2023		(1<<12)	/* New in F2023.  */
 #define GFC_STD_F2018_DEL	(1<<11)	/* Deleted in F2018.  */
 #define GFC_STD_F2018_OBS	(1<<10)	/* Obsolescent in F2018.  */
@@ -41,12 +42,13 @@ along with GCC; see the file COPYING3.  If not see
  * are allowed with a certain -std option.  */
 #define GFC_STD_OPT_F95		(GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F95_OBS  \
 				| GFC_STD_F2008_OBS | GFC_STD_F2018_OBS \
-				| GFC_STD_F2018_DEL)
+				| GFC_STD_F2018_DEL | GFC_STD_F2023_DEL)
 #define GFC_STD_OPT_F03		(GFC_STD_OPT_F95 | GFC_STD_F2003)
 #define GFC_STD_OPT_F08		(GFC_STD_OPT_F03 | GFC_STD_F2008)
 #define GFC_STD_OPT_F18		((GFC_STD_OPT_F08 | GFC_STD_F2018) \
 				& (~GFC_STD_F2018_DEL))
-#define GFC_STD_OPT_F23		(GFC_STD_OPT_F18 | GFC_STD_F2023)
+#define GFC_STD_OPT_F23		((GFC_STD_OPT_F18 | GFC_STD_F2023) \
+				& (~GFC_STD_F2023_DEL))
 
 /* Bitmasks for the various FPE that can be enabled.  These need to be straight integers
    e.g., 8 instead of (1<<3), because they will be included in Fortran source.  */
diff --git a/gcc/fortran/options.cc b/gcc/fortran/options.cc
index b788521e816..02a29f83b58 100644
--- a/gcc/fortran/options.cc
+++ b/gcc/fortran/options.cc
@@ -57,8 +57,10 @@ set_default_std_flags (void)
   gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
     | GFC_STD_F2003 | GFC_STD_F2008 | GFC_STD_F95 | GFC_STD_F77
     | GFC_STD_F2008_OBS | GFC_STD_GNU | GFC_STD_LEGACY
-    | GFC_STD_F2018 | GFC_STD_F2018_DEL | GFC_STD_F2018_OBS | GFC_STD_F2023;
-  gfc_option.warn_std = GFC_STD_F2018_DEL | GFC_STD_F95_DEL | GFC_STD_LEGACY;
+    | GFC_STD_F2018 | GFC_STD_F2018_DEL | GFC_STD_F2018_OBS | GFC_STD_F2023
+    | GFC_STD_F2023_DEL;
+  gfc_option.warn_std = GFC_STD_F2018_DEL | GFC_STD_F95_DEL | GFC_STD_LEGACY
+    | GFC_STD_F2023_DEL;
 }
 
 /* Set (or unset) the DEC extension flags.  */
diff --git a/gcc/testsuite/gfortran.dg/system_clock_1.f90 b/gcc/testsuite/gfortran.dg/system_clock_1.f90
index 41027deb28f..0cb0145e881 100644
--- a/gcc/testsuite/gfortran.dg/system_clock_1.f90
+++ b/gcc/testsuite/gfortran.dg/system_clock_1.f90
@@ -1,4 +1,5 @@
 ! { dg-do run }
+! { dg-options "-std=f2003" }
 
   integer :: i, j, k
   integer(kind=8) :: i8, j8, k8
diff --git a/gcc/testsuite/gfortran.dg/system_clock_3.f08 b/gcc/testsuite/gfortran.dg/system_clock_3.f08
index e52a51a7da4..c12849b77ab 100644
--- a/gcc/testsuite/gfortran.dg/system_clock_3.f08
+++ b/gcc/testsuite/gfortran.dg/system_clock_3.f08
@@ -1,4 +1,5 @@
 ! { dg-do run }
+! { dg-options "-std=f2008" }
 ! PR64432
 program countem
   implicit none
diff --git a/gcc/testsuite/gfortran.dg/system_clock_4.f90 b/gcc/testsuite/gfortran.dg/system_clock_4.f90
new file mode 100644
index 00000000000..1bb42efac95
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/system_clock_4.f90
@@ -0,0 +1,24 @@
+! { dg-do compile }
+! { dg-options "-std=f2023" }
+! PR fortran/112609 - F2023 restrictions on integer arguments to SYSTEM_CLOCK
+
+program p
+  implicit none
+  integer    :: i,  j,  k
+  integer(2) :: i2, j2, k2
+  integer(8) :: i8, j8, k8
+  real       :: x
+
+  call system_clock(count=i2)      ! { dg-error "kind smaller than default integer" }
+  call system_clock(count_rate=j2) ! { dg-error "kind smaller than default integer" }
+  call system_clock(count_max=k2)  ! { dg-error "kind smaller than default integer" }
+
+  call system_clock(count=i8,count_rate=x,count_max=k8)
+  call system_clock(count=i, count_rate=j8)     ! { dg-error "different kind" }
+  call system_clock(count=i8,count_rate=j)      ! { dg-error "different kind" }
+  call system_clock(count=i, count_max=k8)      ! { dg-error "different kind" }
+  call system_clock(count=i8,count_max=k)       ! { dg-error "different kind" }
+  call system_clock(count_rate=j, count_max=k8) ! { dg-error "different kind" }
+  call system_clock(count_rate=j8,count_max=k)  ! { dg-error "different kind" }
+  call system_clock(i,x,k8)                     ! { dg-error "different kind" }
+end
-- 
2.35.3


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH, v3] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609]
  2023-11-21 22:09           ` Harald Anlauf
@ 2023-11-22  9:36             ` Mikael Morin
  2023-11-22 18:03               ` Steve Kargl
  2023-11-22 20:36               ` [PATCH, v4] " Harald Anlauf
  0 siblings, 2 replies; 13+ messages in thread
From: Mikael Morin @ 2023-11-22  9:36 UTC (permalink / raw)
  To: Harald Anlauf, sgk; +Cc: fortran, gcc-patches

Le 21/11/2023 à 23:09, Harald Anlauf a écrit :
> Uhh, it happened again.  Attached a wrong patch.
> Only looked at the -v3 ...  My bad.
> 
> Sorry!
> 
> Harald
> 
> 
> On 11/21/23 22:54, Harald Anlauf wrote:
>> Hi Mikael, Steve,
>>
>> On 11/21/23 12:33, Mikael Morin wrote:
>>> Harald, you mentioned the lack of GFC_STD_F2023_DEL feature group in
>>> your first message, but I don't quite understand why you didn't add one.
>>>   It seems to me the most natural way to do this.
>>
>> thanks for insisting on this variant.
>>
>> In my first attack at this problem, I overlooked one place in
>> libgfortran.h, which I now was able to find and adjust.
>> Now everything falls into place.
>>
>>> I suggest we emit a warning by default, error with -std=f2023 (I agree
>>> with Steve that we should push towards strict f2023 conformance), and no
>>> diagnostic with -std=gnu or -std=f2018 or lower.
>>
>> As the majority agrees on this, I accept it.  The attached patch
>> now does this and fixes the testcases accordingly.
>>
>>>> It seems that the solution is to fix the code in the testsuite.
>>>
>>> Agreed, these seem to explicitly test mismatching kinds, so add an
>>> option to prevent error.
>>
>> Done.
>>
>> I also fixed a few issues in the documentation in gfortran.texi .
>>
>> As I currently cannot build a full compiler (see PR112643),
>> patch V3 is not properly regtested yet, but appears to give
>> results as discussed.
>>
>> Comments?
>>
>>> Mikael
>>
>> Thanks,
>> Harald
>>
>>
> 
(...)

> diff --git a/gcc/fortran/error.cc b/gcc/fortran/error.cc
> index 2ac51e95e4d..be715b50469 100644
> --- a/gcc/fortran/error.cc
> +++ b/gcc/fortran/error.cc
> @@ -980,7 +980,11 @@ char const*
>  notify_std_msg(int std)
>  {
>  
> -  if (std & GFC_STD_F2018_DEL)
> +  if (std & GFC_STD_F2023_DEL)
> +    return _("Fortran 2023 deleted feature:");

As there are officially no deleted feature in f2023, maybe use a 
slightly different wording?  Say "Not allowed in fortran 2023" or 
"forbidden in Fortran 2023" or similar?

> +  else if (std & GFC_STD_F2023)
> +    return _("Fortran 2023:");
> +  else if (std & GFC_STD_F2018_DEL)
>      return _("Fortran 2018 deleted feature:");
>    else if (std & GFC_STD_F2018_OBS)
>      return _("Fortran 2018 obsolescent feature:");

> diff --git a/gcc/fortran/libgfortran.h b/gcc/fortran/libgfortran.h
> index bdddb317ab0..af7a170c2b1 100644
> --- a/gcc/fortran/libgfortran.h
> +++ b/gcc/fortran/libgfortran.h
> @@ -19,9 +19,10 @@ along with GCC; see the file COPYING3.  If not see
>  
>  
>  /* Flags to specify which standard/extension contains a feature.
> -   Note that no features were obsoleted nor deleted in F2003 nor in F2023.
> +   Note that no features were obsoleted nor deleted in F2003.

I think we can add a comment that F2023 has no deleted feature, but some 
more stringent restrictions in f2023 forbid some previously valid code.

>     Please remember to keep those definitions in sync with
>     gfortran.texi.  */
> +#define GFC_STD_F2023_DEL	(1<<13)	/* Deleted in F2023.  */
>  #define GFC_STD_F2023		(1<<12)	/* New in F2023.  */
>  #define GFC_STD_F2018_DEL	(1<<11)	/* Deleted in F2018.  */
>  #define GFC_STD_F2018_OBS	(1<<10)	/* Obsolescent in F2018.  */
> @@ -41,12 +42,13 @@ along with GCC; see the file COPYING3.  If not see
>   * are allowed with a certain -std option.  */
>  #define GFC_STD_OPT_F95		(GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F95_OBS  \
>  				| GFC_STD_F2008_OBS | GFC_STD_F2018_OBS \
> -				| GFC_STD_F2018_DEL)
> +				| GFC_STD_F2018_DEL | GFC_STD_F2023_DEL)
>  #define GFC_STD_OPT_F03		(GFC_STD_OPT_F95 | GFC_STD_F2003)
>  #define GFC_STD_OPT_F08		(GFC_STD_OPT_F03 | GFC_STD_F2008)
>  #define GFC_STD_OPT_F18		((GFC_STD_OPT_F08 | GFC_STD_F2018) \
>  				& (~GFC_STD_F2018_DEL))
F03, F08 and F18 should have GFC_STD_F2023_DEL (and also F03 and F08 
should have GFC_STD_F2018_DEL).

OK with this fixed (and the previous comments as you wish), if Steve has 
no more comments.

Thanks for the patch.


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH, v3] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609]
  2023-11-22  9:36             ` Mikael Morin
@ 2023-11-22 18:03               ` Steve Kargl
  2023-11-22 20:40                 ` Harald Anlauf
  2023-11-22 20:36               ` [PATCH, v4] " Harald Anlauf
  1 sibling, 1 reply; 13+ messages in thread
From: Steve Kargl @ 2023-11-22 18:03 UTC (permalink / raw)
  To: Mikael Morin; +Cc: Harald Anlauf, fortran, gcc-patches

On Wed, Nov 22, 2023 at 10:36:00AM +0100, Mikael Morin wrote:
> 
> OK with this fixed (and the previous comments as you wish), if Steve has no
> more comments.
> 

No further comments.  Thanks for your patients, Harald.

As side note, I found John Reid's "What's new" document
where it is noted that there are no new obsolescent or
delete features.

https://wg5-fortran.org/N2201-N2250/N2212.pdf

-- 
Steve

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH, v4] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609]
  2023-11-22  9:36             ` Mikael Morin
  2023-11-22 18:03               ` Steve Kargl
@ 2023-11-22 20:36               ` Harald Anlauf
  2023-11-23  9:07                 ` Mikael Morin
  1 sibling, 1 reply; 13+ messages in thread
From: Harald Anlauf @ 2023-11-22 20:36 UTC (permalink / raw)
  To: Mikael Morin, sgk; +Cc: fortran, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 3699 bytes --]

Hi Mikael!

On 11/22/23 10:36, Mikael Morin wrote:
> (...)
>
>> diff --git a/gcc/fortran/error.cc b/gcc/fortran/error.cc
>> index 2ac51e95e4d..be715b50469 100644
>> --- a/gcc/fortran/error.cc
>> +++ b/gcc/fortran/error.cc
>> @@ -980,7 +980,11 @@ char const*
>>  notify_std_msg(int std)
>>  {
>>
>> -  if (std & GFC_STD_F2018_DEL)
>> +  if (std & GFC_STD_F2023_DEL)
>> +    return _("Fortran 2023 deleted feature:");
>
> As there are officially no deleted feature in f2023, maybe use a
> slightly different wording?  Say "Not allowed in fortran 2023" or
> "forbidden in Fortran 2023" or similar?
>
>> +  else if (std & GFC_STD_F2023)
>> +    return _("Fortran 2023:");
>> +  else if (std & GFC_STD_F2018_DEL)
>>      return _("Fortran 2018 deleted feature:");
>>    else if (std & GFC_STD_F2018_OBS)
>>      return _("Fortran 2018 obsolescent feature:");

I skimmed over existing error messages, and since "forbidden" did
not show up and since "Not allowed" exists but not at the beginning
of a message, I found that

"Prohibited in Fortran 2023"

appeared to be a good alternative.

Not being a native speaker, I hope that someone speaks up if this
is not appropriate.  And since I do not explicitly verify that part
in the testcase, it can be changed.

>> diff --git a/gcc/fortran/libgfortran.h b/gcc/fortran/libgfortran.h
>> index bdddb317ab0..af7a170c2b1 100644
>> --- a/gcc/fortran/libgfortran.h
>> +++ b/gcc/fortran/libgfortran.h
>> @@ -19,9 +19,10 @@ along with GCC; see the file COPYING3.  If not see
>>
>>
>>  /* Flags to specify which standard/extension contains a feature.
>> -   Note that no features were obsoleted nor deleted in F2003 nor in
>> F2023.
>> +   Note that no features were obsoleted nor deleted in F2003.
>
> I think we can add a comment that F2023 has no deleted feature, but some
> more stringent restrictions in f2023 forbid some previously valid code.
>
>>     Please remember to keep those definitions in sync with
>>     gfortran.texi.  */
>> +#define GFC_STD_F2023_DEL    (1<<13)    /* Deleted in F2023.  */
>>  #define GFC_STD_F2023        (1<<12)    /* New in F2023.  */
>>  #define GFC_STD_F2018_DEL    (1<<11)    /* Deleted in F2018.  */
>>  #define GFC_STD_F2018_OBS    (1<<10)    /* Obsolescent in F2018.  */
>> @@ -41,12 +42,13 @@ along with GCC; see the file COPYING3.  If not see
>>   * are allowed with a certain -std option.  */
>>  #define GFC_STD_OPT_F95        (GFC_STD_F77 | GFC_STD_F95 |
>> GFC_STD_F95_OBS  \
>>                  | GFC_STD_F2008_OBS | GFC_STD_F2018_OBS \
>> -                | GFC_STD_F2018_DEL)
>> +                | GFC_STD_F2018_DEL | GFC_STD_F2023_DEL)
>>  #define GFC_STD_OPT_F03        (GFC_STD_OPT_F95 | GFC_STD_F2003)
>>  #define GFC_STD_OPT_F08        (GFC_STD_OPT_F03 | GFC_STD_F2008)
>>  #define GFC_STD_OPT_F18        ((GFC_STD_OPT_F08 | GFC_STD_F2018) \
>>                  & (~GFC_STD_F2018_DEL))
> F03, F08 and F18 should have GFC_STD_F2023_DEL (and also F03 and F08
> should have GFC_STD_F2018_DEL).

Well, these macros do an incremental bitwise-or, so the bit representing
GFC_STD_F2023_DEL is included everywhere.  I also ran the testcases with
different -std= options to check.

> OK with this fixed (and the previous comments as you wish), if Steve has
> no more comments.
>
> Thanks for the patch.
>
>

If there are no further comments, I will commit once I am able to
fully build again with --disable-bootstrap and -march=native ...

Thanks,
Harald


[-- Attachment #2: pr112609-v4.diff --]
[-- Type: text/x-patch, Size: 10775 bytes --]

From 56386f4f332cf8970a424ba67678335fa6186e4c Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anlauf@gmx.de>
Date: Wed, 22 Nov 2023 20:57:59 +0100
Subject: [PATCH] Fortran: restrictions on integer arguments to SYSTEM_CLOCK
 [PR112609]

Fortran 2023 added restrictions on integer arguments to SYSTEM_CLOCK to
have a decimal exponent range at least as large as a default integer,
and that all integer arguments have the same kind type parameter.

gcc/fortran/ChangeLog:

	PR fortran/112609
	* check.cc (gfc_check_system_clock): Add checks on integer arguments
	to SYSTEM_CLOCK specific to F2023.
	* error.cc (notify_std_msg): Adjust to handle new features added
	in F2023.
	* gfortran.texi (_gfortran_set_options): Document GFC_STD_F2023_DEL,
	remove obsolete option GFC_STD_F2008_TS and fix enumeration values.
	* libgfortran.h (GFC_STD_F2023_DEL): Add and use in GFC_STD_OPT_F23.
	* options.cc (set_default_std_flags): Add GFC_STD_F2023_DEL.

gcc/testsuite/ChangeLog:

	PR fortran/112609
	* gfortran.dg/system_clock_1.f90: Add option -std=f2003.
	* gfortran.dg/system_clock_3.f08: Add option -std=f2008.
	* gfortran.dg/system_clock_4.f90: New test.
---
 gcc/fortran/check.cc                         | 50 ++++++++++++++++++++
 gcc/fortran/error.cc                         |  6 ++-
 gcc/fortran/gfortran.texi                    | 10 ++--
 gcc/fortran/libgfortran.h                    |  7 ++-
 gcc/fortran/options.cc                       |  6 ++-
 gcc/testsuite/gfortran.dg/system_clock_1.f90 |  1 +
 gcc/testsuite/gfortran.dg/system_clock_3.f08 |  1 +
 gcc/testsuite/gfortran.dg/system_clock_4.f90 | 24 ++++++++++
 8 files changed, 95 insertions(+), 10 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/system_clock_4.f90

diff --git a/gcc/fortran/check.cc b/gcc/fortran/check.cc
index 6c45e6542f0..3b1a0f9f4f4 100644
--- a/gcc/fortran/check.cc
+++ b/gcc/fortran/check.cc
@@ -6774,6 +6774,8 @@ bool
 gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 			gfc_expr *count_max)
 {
+  int first_int_kind = -1;
+
   if (count != NULL)
     {
       if (!scalar_check (count, 0))
@@ -6788,8 +6790,17 @@ gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 			      &count->where))
 	return false;
 
+      if (count->ts.kind < gfc_default_integer_kind
+	  && !gfc_notify_std (GFC_STD_F2023_DEL,
+			      "COUNT argument to SYSTEM_CLOCK at %L "
+			      "with kind smaller than default integer",
+			      &count->where))
+	return false;
+
       if (!variable_check (count, 0, false))
 	return false;
+
+      first_int_kind = count->ts.kind;
     }
 
   if (count_rate != NULL)
@@ -6816,6 +6827,16 @@ gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 				  "SYSTEM_CLOCK at %L has non-default kind",
 				  &count_rate->where))
 	    return false;
+
+	  if (count_rate->ts.kind < gfc_default_integer_kind
+	      && !gfc_notify_std (GFC_STD_F2023_DEL,
+				  "COUNT_RATE argument to SYSTEM_CLOCK at %L "
+				  "with kind smaller than default integer",
+				  &count_rate->where))
+	    return false;
+
+	  if (first_int_kind < 0)
+	    first_int_kind = count_rate->ts.kind;
 	}
 
     }
@@ -6836,6 +6857,35 @@ gfc_check_system_clock (gfc_expr *count, gfc_expr *count_rate,
 
       if (!variable_check (count_max, 2, false))
 	return false;
+
+      if (count_max->ts.kind < gfc_default_integer_kind
+	  && !gfc_notify_std (GFC_STD_F2023_DEL,
+			      "COUNT_MAX argument to SYSTEM_CLOCK at %L "
+			      "with kind smaller than default integer",
+			      &count_max->where))
+	return false;
+
+      if (first_int_kind < 0)
+	first_int_kind = count_max->ts.kind;
+    }
+
+  if (first_int_kind > 0)
+    {
+      if (count_rate
+	  && count_rate->ts.type == BT_INTEGER
+	  && count_rate->ts.kind != first_int_kind
+	  && !gfc_notify_std (GFC_STD_F2023_DEL,
+			      "integer arguments to SYSTEM_CLOCK at %L "
+			      "with different kind parameters",
+			      &count_rate->where))
+	return false;
+
+      if (count_max && count_max->ts.kind != first_int_kind
+	  && !gfc_notify_std (GFC_STD_F2023_DEL,
+			      "integer arguments to SYSTEM_CLOCK at %L "
+			      "with different kind parameters",
+			      &count_max->where))
+	return false;
     }
 
   return true;
diff --git a/gcc/fortran/error.cc b/gcc/fortran/error.cc
index 2ac51e95e4d..56d2e63622d 100644
--- a/gcc/fortran/error.cc
+++ b/gcc/fortran/error.cc
@@ -980,7 +980,11 @@ char const*
 notify_std_msg(int std)
 {
 
-  if (std & GFC_STD_F2018_DEL)
+  if (std & GFC_STD_F2023_DEL)
+    return _("Prohibited in Fortran 2023:");
+  else if (std & GFC_STD_F2023)
+    return _("Fortran 2023:");
+  else if (std & GFC_STD_F2018_DEL)
     return _("Fortran 2018 deleted feature:");
   else if (std & GFC_STD_F2018_OBS)
     return _("Fortran 2018 obsolescent feature:");
diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi
index 41857cc9038..c29cb786279 100644
--- a/gcc/fortran/gfortran.texi
+++ b/gcc/fortran/gfortran.texi
@@ -3476,13 +3476,13 @@ standard.  Possible values are (bitwise or-ed) @code{GFC_STD_F77} (1),
 @code{GFC_STD_F95_OBS} (2), @code{GFC_STD_F95_DEL} (4),
 @code{GFC_STD_F95} (8), @code{GFC_STD_F2003} (16), @code{GFC_STD_GNU}
 (32), @code{GFC_STD_LEGACY} (64), @code{GFC_STD_F2008} (128),
-@code{GFC_STD_F2008_OBS} (256), @code{GFC_STD_F2008_TS} (512),
-@code{GFC_STD_F2018} (1024), @code{GFC_STD_F2018_OBS} (2048),
-@code{GFC_STD=F2018_DEL} (4096), and @code{GFC_STD=F2023} (8192).
+@code{GFC_STD_F2008_OBS} (256), @code{GFC_STD_F2018} (512),
+@code{GFC_STD_F2018_OBS} (1024), @code{GFC_STD_F2018_DEL} (2048),
+@code{GFC_STD_F2023} (4096), and @code{GFC_STD_F2023_DEL} (8192).
 Default: @code{GFC_STD_F95_OBS | GFC_STD_F95_DEL | GFC_STD_F95 |
-GFC_STD_F2003 | GFC_STD_F2008 | GFC_STD_F2008_TS | GFC_STD_F2008_OBS
+GFC_STD_F2003 | GFC_STD_F2008 | GFC_STD_F2008_OBS
 | GFC_STD_F77 | GFC_STD_F2018 | GFC_STD_F2018_OBS | GFC_STD_F2018_DEL
-| GFC_STD_F2023 | GFC_STD_GNU | GFC_STD_LEGACY}.
+| GFC_STD_F2023 | GFC_STD_F2023_DEL | GFC_STD_GNU | GFC_STD_LEGACY}.
 @item @var{option}[1] @tab Standard-warning flag; prints a warning to
 standard error.  Default: @code{GFC_STD_F95_DEL | GFC_STD_LEGACY}.
 @item @var{option}[2] @tab If non zero, enable pedantic checking.
diff --git a/gcc/fortran/libgfortran.h b/gcc/fortran/libgfortran.h
index bdddb317ab0..2c71b90a871 100644
--- a/gcc/fortran/libgfortran.h
+++ b/gcc/fortran/libgfortran.h
@@ -20,8 +20,10 @@ along with GCC; see the file COPYING3.  If not see
 
 /* Flags to specify which standard/extension contains a feature.
    Note that no features were obsoleted nor deleted in F2003 nor in F2023.
+   Nevertheless, some features available in F2018 are prohibited in F2023.
    Please remember to keep those definitions in sync with
    gfortran.texi.  */
+#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.  */
 #define GFC_STD_F2018_OBS	(1<<10)	/* Obsolescent in F2018.  */
@@ -41,12 +43,13 @@ along with GCC; see the file COPYING3.  If not see
  * are allowed with a certain -std option.  */
 #define GFC_STD_OPT_F95		(GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F95_OBS  \
 				| GFC_STD_F2008_OBS | GFC_STD_F2018_OBS \
-				| GFC_STD_F2018_DEL)
+				| GFC_STD_F2018_DEL | GFC_STD_F2023_DEL)
 #define GFC_STD_OPT_F03		(GFC_STD_OPT_F95 | GFC_STD_F2003)
 #define GFC_STD_OPT_F08		(GFC_STD_OPT_F03 | GFC_STD_F2008)
 #define GFC_STD_OPT_F18		((GFC_STD_OPT_F08 | GFC_STD_F2018) \
 				& (~GFC_STD_F2018_DEL))
-#define GFC_STD_OPT_F23		(GFC_STD_OPT_F18 | GFC_STD_F2023)
+#define GFC_STD_OPT_F23		((GFC_STD_OPT_F18 | GFC_STD_F2023) \
+				& (~GFC_STD_F2023_DEL))
 
 /* Bitmasks for the various FPE that can be enabled.  These need to be straight integers
    e.g., 8 instead of (1<<3), because they will be included in Fortran source.  */
diff --git a/gcc/fortran/options.cc b/gcc/fortran/options.cc
index b788521e816..02a29f83b58 100644
--- a/gcc/fortran/options.cc
+++ b/gcc/fortran/options.cc
@@ -57,8 +57,10 @@ set_default_std_flags (void)
   gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
     | GFC_STD_F2003 | GFC_STD_F2008 | GFC_STD_F95 | GFC_STD_F77
     | GFC_STD_F2008_OBS | GFC_STD_GNU | GFC_STD_LEGACY
-    | GFC_STD_F2018 | GFC_STD_F2018_DEL | GFC_STD_F2018_OBS | GFC_STD_F2023;
-  gfc_option.warn_std = GFC_STD_F2018_DEL | GFC_STD_F95_DEL | GFC_STD_LEGACY;
+    | GFC_STD_F2018 | GFC_STD_F2018_DEL | GFC_STD_F2018_OBS | GFC_STD_F2023
+    | GFC_STD_F2023_DEL;
+  gfc_option.warn_std = GFC_STD_F2018_DEL | GFC_STD_F95_DEL | GFC_STD_LEGACY
+    | GFC_STD_F2023_DEL;
 }
 
 /* Set (or unset) the DEC extension flags.  */
diff --git a/gcc/testsuite/gfortran.dg/system_clock_1.f90 b/gcc/testsuite/gfortran.dg/system_clock_1.f90
index 41027deb28f..0cb0145e881 100644
--- a/gcc/testsuite/gfortran.dg/system_clock_1.f90
+++ b/gcc/testsuite/gfortran.dg/system_clock_1.f90
@@ -1,4 +1,5 @@
 ! { dg-do run }
+! { dg-options "-std=f2003" }
 
   integer :: i, j, k
   integer(kind=8) :: i8, j8, k8
diff --git a/gcc/testsuite/gfortran.dg/system_clock_3.f08 b/gcc/testsuite/gfortran.dg/system_clock_3.f08
index e52a51a7da4..c12849b77ab 100644
--- a/gcc/testsuite/gfortran.dg/system_clock_3.f08
+++ b/gcc/testsuite/gfortran.dg/system_clock_3.f08
@@ -1,4 +1,5 @@
 ! { dg-do run }
+! { dg-options "-std=f2008" }
 ! PR64432
 program countem
   implicit none
diff --git a/gcc/testsuite/gfortran.dg/system_clock_4.f90 b/gcc/testsuite/gfortran.dg/system_clock_4.f90
new file mode 100644
index 00000000000..1bb42efac95
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/system_clock_4.f90
@@ -0,0 +1,24 @@
+! { dg-do compile }
+! { dg-options "-std=f2023" }
+! PR fortran/112609 - F2023 restrictions on integer arguments to SYSTEM_CLOCK
+
+program p
+  implicit none
+  integer    :: i,  j,  k
+  integer(2) :: i2, j2, k2
+  integer(8) :: i8, j8, k8
+  real       :: x
+
+  call system_clock(count=i2)      ! { dg-error "kind smaller than default integer" }
+  call system_clock(count_rate=j2) ! { dg-error "kind smaller than default integer" }
+  call system_clock(count_max=k2)  ! { dg-error "kind smaller than default integer" }
+
+  call system_clock(count=i8,count_rate=x,count_max=k8)
+  call system_clock(count=i, count_rate=j8)     ! { dg-error "different kind" }
+  call system_clock(count=i8,count_rate=j)      ! { dg-error "different kind" }
+  call system_clock(count=i, count_max=k8)      ! { dg-error "different kind" }
+  call system_clock(count=i8,count_max=k)       ! { dg-error "different kind" }
+  call system_clock(count_rate=j, count_max=k8) ! { dg-error "different kind" }
+  call system_clock(count_rate=j8,count_max=k)  ! { dg-error "different kind" }
+  call system_clock(i,x,k8)                     ! { dg-error "different kind" }
+end
-- 
2.35.3


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH, v3] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609]
  2023-11-22 18:03               ` Steve Kargl
@ 2023-11-22 20:40                 ` Harald Anlauf
  2023-11-22 20:40                   ` Harald Anlauf
  0 siblings, 1 reply; 13+ messages in thread
From: Harald Anlauf @ 2023-11-22 20:40 UTC (permalink / raw)
  To: sgk, Mikael Morin; +Cc: fortran, gcc-patches

Hi Steve,

On 11/22/23 19:03, Steve Kargl wrote:
> On Wed, Nov 22, 2023 at 10:36:00AM +0100, Mikael Morin wrote:
>>
>> OK with this fixed (and the previous comments as you wish), if Steve has no
>> more comments.
>>
>
> No further comments.  Thanks for your patients, Harald.
>
> As side note, I found John Reid's "What's new" document
> where it is noted that there are no new obsolescent or
> delete features.
>
> https://wg5-fortran.org/N2201-N2250/N2212.pdf
>

this is good to know.

There is an older version (still referring to F202x) on the wiki:

https://gcc.gnu.org/wiki/GFortranStandards

It would be great if someone with editing permission could update
the link and point to the above.

Thanks,
Harald


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH, v3] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609]
  2023-11-22 20:40                 ` Harald Anlauf
@ 2023-11-22 20:40                   ` Harald Anlauf
  0 siblings, 0 replies; 13+ messages in thread
From: Harald Anlauf @ 2023-11-22 20:40 UTC (permalink / raw)
  To: fortran; +Cc: gcc-patches, fortran

Hi Steve,

On 11/22/23 19:03, Steve Kargl wrote:
> On Wed, Nov 22, 2023 at 10:36:00AM +0100, Mikael Morin wrote:
>>
>> OK with this fixed (and the previous comments as you wish), if Steve has no
>> more comments.
>>
> 
> No further comments.  Thanks for your patients, Harald.
> 
> As side note, I found John Reid's "What's new" document
> where it is noted that there are no new obsolescent or
> delete features.
> 
> https://wg5-fortran.org/N2201-N2250/N2212.pdf
> 

this is good to know.

There is an older version (still referring to F202x) on the wiki:

https://gcc.gnu.org/wiki/GFortranStandards

It would be great if someone with editing permission could update
the link and point to the above.

Thanks,
Harald



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH, v4] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609]
  2023-11-22 20:36               ` [PATCH, v4] " Harald Anlauf
@ 2023-11-23  9:07                 ` Mikael Morin
  0 siblings, 0 replies; 13+ messages in thread
From: Mikael Morin @ 2023-11-23  9:07 UTC (permalink / raw)
  To: Harald Anlauf, sgk; +Cc: fortran, gcc-patches

Le 22/11/2023 à 21:36, Harald Anlauf a écrit :
> Hi Mikael!
> 
> On 11/22/23 10:36, Mikael Morin wrote:
>> (...)
>>
>>> diff --git a/gcc/fortran/error.cc b/gcc/fortran/error.cc
>>> index 2ac51e95e4d..be715b50469 100644
>>> --- a/gcc/fortran/error.cc
>>> +++ b/gcc/fortran/error.cc
>>> @@ -980,7 +980,11 @@ char const*
>>>  notify_std_msg(int std)
>>>  {
>>>
>>> -  if (std & GFC_STD_F2018_DEL)
>>> +  if (std & GFC_STD_F2023_DEL)
>>> +    return _("Fortran 2023 deleted feature:");
>>
>> As there are officially no deleted feature in f2023, maybe use a
>> slightly different wording?  Say "Not allowed in fortran 2023" or
>> "forbidden in Fortran 2023" or similar?
>>
>>> +  else if (std & GFC_STD_F2023)
>>> +    return _("Fortran 2023:");
>>> +  else if (std & GFC_STD_F2018_DEL)
>>>      return _("Fortran 2018 deleted feature:");
>>>    else if (std & GFC_STD_F2018_OBS)
>>>      return _("Fortran 2018 obsolescent feature:");
> 
> I skimmed over existing error messages, and since "forbidden" did
> not show up and since "Not allowed" exists but not at the beginning
> of a message, I found that
> 
> "Prohibited in Fortran 2023"
> 
> appeared to be a good alternative.
> 
> Not being a native speaker, I hope that someone speaks up if this
> is not appropriate.  And since I do not explicitly verify that part
> in the testcase, it can be changed.
> 
>>> diff --git a/gcc/fortran/libgfortran.h b/gcc/fortran/libgfortran.h
>>> index bdddb317ab0..af7a170c2b1 100644
>>> --- a/gcc/fortran/libgfortran.h
>>> +++ b/gcc/fortran/libgfortran.h
>>> @@ -19,9 +19,10 @@ along with GCC; see the file COPYING3.  If not see
>>>
>>>
>>>  /* Flags to specify which standard/extension contains a feature.
>>> -   Note that no features were obsoleted nor deleted in F2003 nor in
>>> F2023.
>>> +   Note that no features were obsoleted nor deleted in F2003.
>>
>> I think we can add a comment that F2023 has no deleted feature, but some
>> more stringent restrictions in f2023 forbid some previously valid code.
>>
>>>     Please remember to keep those definitions in sync with
>>>     gfortran.texi.  */
>>> +#define GFC_STD_F2023_DEL    (1<<13)    /* Deleted in F2023.  */
>>>  #define GFC_STD_F2023        (1<<12)    /* New in F2023.  */
>>>  #define GFC_STD_F2018_DEL    (1<<11)    /* Deleted in F2018.  */
>>>  #define GFC_STD_F2018_OBS    (1<<10)    /* Obsolescent in F2018.  */
>>> @@ -41,12 +42,13 @@ along with GCC; see the file COPYING3.  If not see
>>>   * are allowed with a certain -std option.  */
>>>  #define GFC_STD_OPT_F95        (GFC_STD_F77 | GFC_STD_F95 |
>>> GFC_STD_F95_OBS  \
>>>                  | GFC_STD_F2008_OBS | GFC_STD_F2018_OBS \
>>> -                | GFC_STD_F2018_DEL)
>>> +                | GFC_STD_F2018_DEL | GFC_STD_F2023_DEL)
>>>  #define GFC_STD_OPT_F03        (GFC_STD_OPT_F95 | GFC_STD_F2003)
>>>  #define GFC_STD_OPT_F08        (GFC_STD_OPT_F03 | GFC_STD_F2008)
>>>  #define GFC_STD_OPT_F18        ((GFC_STD_OPT_F08 | GFC_STD_F2018) \
>>>                  & (~GFC_STD_F2018_DEL))
>> F03, F08 and F18 should have GFC_STD_F2023_DEL (and also F03 and F08
>> should have GFC_STD_F2018_DEL).
> 
> Well, these macros do an incremental bitwise-or, so the bit representing
> GFC_STD_F2023_DEL is included everywhere.  I also ran the testcases with
> different -std= options to check.
> 
Ah, yes.  I confused the GFC_STD_OPT* values with the GFC_STD_* ones.

>> OK with this fixed (and the previous comments as you wish), if Steve has
>> no more comments.
>>
>> Thanks for the patch.
>>
>>
> 
> If there are no further comments, I will commit once I am able to
> fully build again with --disable-bootstrap and -march=native ...
> 
> Thanks,
> Harald
> 
Thanks again.


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2023-11-23  9:07 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-18 22:12 [PATCH] Fortran: restrictions on integer arguments to SYSTEM_CLOCK [PR112609] Harald Anlauf
2023-11-19  0:04 ` Steve Kargl
2023-11-19 20:46   ` [PATCH, v2] " Harald Anlauf
2023-11-20 19:02     ` Steve Kargl
2023-11-21 11:33       ` Mikael Morin
2023-11-21 21:54         ` [PATCH, v3] " Harald Anlauf
2023-11-21 22:09           ` Harald Anlauf
2023-11-22  9:36             ` Mikael Morin
2023-11-22 18:03               ` Steve Kargl
2023-11-22 20:40                 ` Harald Anlauf
2023-11-22 20:40                   ` Harald Anlauf
2023-11-22 20:36               ` [PATCH, v4] " Harald Anlauf
2023-11-23  9:07                 ` Mikael Morin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).