public inbox for fortran@gcc.gnu.org
 help / color / mirror / Atom feed
* [Patch] Fortran: Fix -freal-{4,8}-real* handling [PR99355]
@ 2021-03-03 11:45 Tobias Burnus
  2021-03-04  2:06 ` Jerry DeLisle
  2021-03-04 17:02 ` [Patch] Fortran: Follow fixes to -freal-{4,8}-real* handling [PR99355,PR57871] (was: Re: [Patch] Fortran: Fix -freal-{4,8}-real* handling [PR99355]) Tobias Burnus
  0 siblings, 2 replies; 4+ messages in thread
From: Tobias Burnus @ 2021-03-03 11:45 UTC (permalink / raw)
  To: gcc-patches, fortran

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

Rather obvious change – don't apply replacement multiple times.

OK for mainline?

Tobias

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf

[-- Attachment #2: realconv.diff --]
[-- Type: text/x-patch, Size: 18808 bytes --]

Fortran: Fix -freal-{4,8}-real* handling [PR99355]

Avoid chain kind conversion for, e.g., -freal-4-real-8 -freal-8-real-10.
Note that gfc_default_double_kind/gfc_default_double_kind already
honors the -freal flags.

gcc/fortran/ChangeLog:

	PR fortran/99355
	* decl.c (gfc_match_old_kind_spec, gfc_match_kind_spec): Avoid
	redoing kind conversions.
	* primary.c (match_real_constant): Likewise.

gcc/testsuite/ChangeLog:

	PR fortran/99355
	* gfortran.dg/real4-10-real8-10.f90: New test.
	* gfortran.dg/real4-10-real8-16.f90: New test.
	* gfortran.dg/real4-10-real8-4.f90: New test.
	* gfortran.dg/real4-10.f90: New test.
	* gfortran.dg/real4-16-real8-10.f90: New test.
	* gfortran.dg/real4-16-real8-16.f90: New test.
	* gfortran.dg/real4-16-real8-4.f90: New test.
	* gfortran.dg/real4-16.f90: New test.
	* gfortran.dg/real4-8-real8-10.f90: New test.
	* gfortran.dg/real4-8-real8-16.f90: New test.
	* gfortran.dg/real4-8-real8-4.f90: New test.
	* gfortran.dg/real4-8.f90: New test.
	* gfortran.dg/real8-10.f90: New test.
	* gfortran.dg/real8-16.f90: New test.
	* gfortran.dg/real8-4.f90: New test.

 gcc/fortran/decl.c                              |  6 ++--
 gcc/fortran/primary.c                           | 40 -------------------------
 gcc/testsuite/gfortran.dg/real4-10-real8-10.f90 | 23 ++++++++++++++
 gcc/testsuite/gfortran.dg/real4-10-real8-16.f90 | 24 +++++++++++++++
 gcc/testsuite/gfortran.dg/real4-10-real8-4.f90  | 23 ++++++++++++++
 gcc/testsuite/gfortran.dg/real4-10.f90          | 23 ++++++++++++++
 gcc/testsuite/gfortran.dg/real4-16-real8-10.f90 | 24 +++++++++++++++
 gcc/testsuite/gfortran.dg/real4-16-real8-16.f90 | 24 +++++++++++++++
 gcc/testsuite/gfortran.dg/real4-16-real8-4.f90  | 24 +++++++++++++++
 gcc/testsuite/gfortran.dg/real4-16.f90          | 24 +++++++++++++++
 gcc/testsuite/gfortran.dg/real4-8-real8-10.f90  | 23 ++++++++++++++
 gcc/testsuite/gfortran.dg/real4-8-real8-16.f90  | 24 +++++++++++++++
 gcc/testsuite/gfortran.dg/real4-8-real8-4.f90   | 23 ++++++++++++++
 gcc/testsuite/gfortran.dg/real4-8.f90           | 23 ++++++++++++++
 gcc/testsuite/gfortran.dg/real8-10.f90          | 23 ++++++++++++++
 gcc/testsuite/gfortran.dg/real8-16.f90          | 24 +++++++++++++++
 gcc/testsuite/gfortran.dg/real8-4.f90           | 23 ++++++++++++++
 17 files changed, 354 insertions(+), 44 deletions(-)

diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 723915822f3..947e4f868a1 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -3066,8 +3066,7 @@ gfc_match_old_kind_spec (gfc_typespec *ts)
 	  if (flag_real4_kind == 16)
 	    ts->kind = 16;
 	}
-
-      if (ts->kind == 8)
+      else if (ts->kind == 8)
 	{
 	  if (flag_real8_kind == 4)
 	    ts->kind = 4;
@@ -3246,8 +3245,7 @@ close_brackets:
 	  if (flag_real4_kind == 16)
 	    ts->kind = 16;
 	}
-
-      if (ts->kind == 8)
+      else if (ts->kind == 8)
 	{
 	  if (flag_real8_kind == 4)
 	    ts->kind = 4;
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index 7633e77909f..9dd1a86f275 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -676,26 +676,6 @@ done:
 	  goto cleanup;
 	}
       kind = gfc_default_double_kind;
-
-      if (kind == 4)
-	{
-	  if (flag_real4_kind == 8)
-	    kind = 8;
-	  if (flag_real4_kind == 10)
-	    kind = 10;
-	  if (flag_real4_kind == 16)
-	    kind = 16;
-	}
-
-      if (kind == 8)
-	{
-	  if (flag_real8_kind == 4)
-	    kind = 4;
-	  if (flag_real8_kind == 10)
-	    kind = 10;
-	  if (flag_real8_kind == 16)
-	    kind = 16;
-	}
       break;
 
     case 'q':
@@ -726,26 +706,6 @@ done:
       if (kind == -2)
 	kind = gfc_default_real_kind;
 
-      if (kind == 4)
-	{
-	  if (flag_real4_kind == 8)
-	    kind = 8;
-	  if (flag_real4_kind == 10)
-	    kind = 10;
-	  if (flag_real4_kind == 16)
-	    kind = 16;
-	}
-
-      if (kind == 8)
-	{
-	  if (flag_real8_kind == 4)
-	    kind = 4;
-	  if (flag_real8_kind == 10)
-	    kind = 10;
-	  if (flag_real8_kind == 16)
-	    kind = 16;
-	}
-
       if (gfc_validate_kind (BT_REAL, kind, true) < 0)
 	{
 	  gfc_error ("Invalid real kind %d at %C", kind);
diff --git a/gcc/testsuite/gfortran.dg/real4-10-real8-10.f90 b/gcc/testsuite/gfortran.dg/real4-10-real8-10.f90
new file mode 100644
index 00000000000..af4f1b2b4e6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real4-10-real8-10.f90
@@ -0,0 +1,23 @@
+! { dg-do run { target i?86-*-* x86_64-*-* } }
+! { dg-additional-options "-w -freal-4-real-10 -freal-8-real-10" }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4
+  real(selected_real_kind(p=15)) :: d5
+
+  !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 10)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 10)) stop 2
+end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-10-real8-16.f90 b/gcc/testsuite/gfortran.dg/real4-10-real8-16.f90
new file mode 100644
index 00000000000..408d3475499
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real4-10-real8-16.f90
@@ -0,0 +1,24 @@
+! { dg-do run { target i?86-*-* x86_64-*-* } }
+! { dg-additional-options "-w -freal-4-real-10 -freal-8-real-16" }
+! { dg-require-effective-target fortran_real_16 }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4
+  real(selected_real_kind(p=15)) :: d5
+
+  !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 10)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 16)) stop 2
+end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-10-real8-4.f90 b/gcc/testsuite/gfortran.dg/real4-10-real8-4.f90
new file mode 100644
index 00000000000..7e52cdb0ac1
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real4-10-real8-4.f90
@@ -0,0 +1,23 @@
+! { dg-do run { target i?86-*-* x86_64-*-* } }
+! { dg-additional-options "-w -freal-4-real-10 -freal-8-real-4" }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4 ! << this is ambiguous: kind=8 → 4 → 10 or 8 → 4; thus,excluded below
+  real(selected_real_kind(p=15)) :: d5
+
+  !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 10)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d5)] /= 4)) stop 2
+end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-10.f90 b/gcc/testsuite/gfortran.dg/real4-10.f90
new file mode 100644
index 00000000000..44fcd83a002
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real4-10.f90
@@ -0,0 +1,23 @@
+! { dg-do run { target i?86-*-* x86_64-*-* } }
+! { dg-additional-options "-w -freal-4-real-10" }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4
+  real(selected_real_kind(p=15)) :: d5
+
+  !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 10)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 8)) stop 2
+end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-16-real8-10.f90 b/gcc/testsuite/gfortran.dg/real4-16-real8-10.f90
new file mode 100644
index 00000000000..d080a1004c0
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real4-16-real8-10.f90
@@ -0,0 +1,24 @@
+! { dg-do run { target i?86-*-* x86_64-*-* } }
+! { dg-additional-options "-w -freal-4-real-16 -freal-8-real-10" }
+! { dg-require-effective-target fortran_real_16 }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4
+  real(selected_real_kind(p=15)) :: d5
+
+  !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 16)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 10)) stop 2
+end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-16-real8-16.f90 b/gcc/testsuite/gfortran.dg/real4-16-real8-16.f90
new file mode 100644
index 00000000000..d525c6014aa
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real4-16-real8-16.f90
@@ -0,0 +1,24 @@
+! { dg-do run }
+! { dg-additional-options "-w -freal-4-real-16 -freal-8-real-16" }
+! { dg-require-effective-target fortran_real_16 }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4
+  real(selected_real_kind(p=15)) :: d5
+
+  !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 16)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 16)) stop 2
+end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-16-real8-4.f90 b/gcc/testsuite/gfortran.dg/real4-16-real8-4.f90
new file mode 100644
index 00000000000..e508819350e
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real4-16-real8-4.f90
@@ -0,0 +1,24 @@
+! { dg-do run }
+! { dg-additional-options "-w -freal-4-real-16 -freal-8-real-4" }
+! { dg-require-effective-target fortran_real_16 }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4 ! << this is ambiguous: kind=8 → 4 → 16 or 8 → 4; thus,excluded below
+  real(selected_real_kind(p=15)) :: d5
+
+  !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 16)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d5)] /= 4)) stop 2
+end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-16.f90 b/gcc/testsuite/gfortran.dg/real4-16.f90
new file mode 100644
index 00000000000..5cd2f1f4822
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real4-16.f90
@@ -0,0 +1,24 @@
+! { dg-do run }
+! { dg-additional-options "-w -freal-4-real-16" }
+! { dg-require-effective-target fortran_real_16 }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4
+  real(selected_real_kind(p=15)) :: d5
+
+  !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 16)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 8)) stop 2
+end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-8-real8-10.f90 b/gcc/testsuite/gfortran.dg/real4-8-real8-10.f90
new file mode 100644
index 00000000000..742d3524827
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real4-8-real8-10.f90
@@ -0,0 +1,23 @@
+! { dg-do run { target i?86-*-* x86_64-*-* } }
+! { dg-additional-options "-w -freal-4-real-8 -freal-8-real-10" }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4
+  real(selected_real_kind(p=15)) :: d5
+
+  print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(r1), kind(r2), kind(r3), kind(r4)] /= 8)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 10)) stop 2
+end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-8-real8-16.f90 b/gcc/testsuite/gfortran.dg/real4-8-real8-16.f90
new file mode 100644
index 00000000000..3733c343d2a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real4-8-real8-16.f90
@@ -0,0 +1,24 @@
+! { dg-do run }
+! { dg-additional-options "-w -freal-4-real-8 -freal-8-real-16" }
+! { dg-require-effective-target fortran_real_16 }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4
+  real(selected_real_kind(p=15)) :: d5
+
+  !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 8)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 16)) stop 2
+end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-8-real8-4.f90 b/gcc/testsuite/gfortran.dg/real4-8-real8-4.f90
new file mode 100644
index 00000000000..b83b2438a58
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real4-8-real8-4.f90
@@ -0,0 +1,23 @@
+! { dg-do run }
+! { dg-additional-options "-w -freal-4-real-8 -freal-8-real-4" }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4 ! << this is ambiguous: kind=8 → 4 → 8 or 8 → 4; thus,excluded below
+  real(selected_real_kind(p=15)) :: d5
+
+  print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 8)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d5)] /= 4)) stop 2
+end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-8.f90 b/gcc/testsuite/gfortran.dg/real4-8.f90
new file mode 100644
index 00000000000..50577dd5fa8
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real4-8.f90
@@ -0,0 +1,23 @@
+! { dg-do run }
+! { dg-additional-options "-w -freal-4-real-8" }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4
+  real(selected_real_kind(p=15)) :: d5
+
+  !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 8)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 8)) stop 2
+end program test
diff --git a/gcc/testsuite/gfortran.dg/real8-10.f90 b/gcc/testsuite/gfortran.dg/real8-10.f90
new file mode 100644
index 00000000000..68f6bc46bce
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real8-10.f90
@@ -0,0 +1,23 @@
+! { dg-do run { target i?86-*-* x86_64-*-* } }
+! { dg-additional-options "-w -freal-8-real-10" }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4
+  real(selected_real_kind(p=15)) :: d5
+
+  !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 4)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 10)) stop 2
+end program test
diff --git a/gcc/testsuite/gfortran.dg/real8-16.f90 b/gcc/testsuite/gfortran.dg/real8-16.f90
new file mode 100644
index 00000000000..5ddd9e17bb6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real8-16.f90
@@ -0,0 +1,24 @@
+! { dg-do run }
+! { dg-additional-options "-w -freal-8-real-16" }
+! { dg-require-effective-target fortran_real_16 }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4
+  real(selected_real_kind(p=15)) :: d5
+
+  !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 4)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 16)) stop 2
+end program test
diff --git a/gcc/testsuite/gfortran.dg/real8-4.f90 b/gcc/testsuite/gfortran.dg/real8-4.f90
new file mode 100644
index 00000000000..a68559a26ad
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/real8-4.f90
@@ -0,0 +1,23 @@
+! { dg-do run }
+! { dg-additional-options "-w -freal-8-real-4" }
+!
+! PR fortran/99355
+!
+
+program test
+  real :: r1
+  real*4:: r2
+  real(4) :: r3
+  real(selected_real_kind(p=6)) :: r4
+
+  double precision :: d1
+  real*8 :: d2
+  real(8) :: d3
+  real(kind(1.d0)) :: d4
+  real(selected_real_kind(p=15)) :: d5
+
+  !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
+  !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
+  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 4)) stop 1
+  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 4)) stop 2
+end program test

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

* Re: [Patch] Fortran: Fix -freal-{4,8}-real* handling [PR99355]
  2021-03-03 11:45 [Patch] Fortran: Fix -freal-{4,8}-real* handling [PR99355] Tobias Burnus
@ 2021-03-04  2:06 ` Jerry DeLisle
  2021-03-04 17:02 ` [Patch] Fortran: Follow fixes to -freal-{4,8}-real* handling [PR99355,PR57871] (was: Re: [Patch] Fortran: Fix -freal-{4,8}-real* handling [PR99355]) Tobias Burnus
  1 sibling, 0 replies; 4+ messages in thread
From: Jerry DeLisle @ 2021-03-04  2:06 UTC (permalink / raw)
  To: Tobias Burnus, gcc-patches, fortran

Yes OK got mainline.

On 3/3/21 3:45 AM, Tobias Burnus wrote:
> Rather obvious change – don't apply replacement multiple times.
>
> OK for mainline?
>
> Tobias
>
> -----------------
> Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München 
> Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, 
> Frank Thürauf


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

* [Patch] Fortran: Follow fixes to -freal-{4,8}-real* handling [PR99355,PR57871] (was: Re: [Patch] Fortran: Fix -freal-{4,8}-real* handling [PR99355])
  2021-03-03 11:45 [Patch] Fortran: Fix -freal-{4,8}-real* handling [PR99355] Tobias Burnus
  2021-03-04  2:06 ` Jerry DeLisle
@ 2021-03-04 17:02 ` Tobias Burnus
  2021-03-05  1:03   ` Jerry DeLisle
  1 sibling, 1 reply; 4+ messages in thread
From: Tobias Burnus @ 2021-03-04 17:02 UTC (permalink / raw)
  To: gcc-patches, fortran, Jerry DeLisle

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

Dominique found an issue ("regression") with this patch – and a testcase
omission.

The previous patch mishandled the noncommitted testcase of PR57871 – or
in other words: It did not promote 1.0_4 or 1.0_8 – as only the
default-real-kind values 1.0 and 1.0d0 were promoted (via code in in
trans-types.c).

I have additionally updated the documentation to more accurately state
what the option does and how it interacts with other options.

OK for mainline?

Tobias

PS: Side remark: My recommendation is to avoid
-freal-{4,8}-real-{4,8,10,16} ...

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf

[-- Attachment #2: realconv-fix.diff --]
[-- Type: text/x-patch, Size: 22804 bytes --]

Fortran: Follow fixes to -freal-{4,8}-real* handling [PR99355,PR57871]

gcc/fortran/ChangeLog:

	PR fortran/99355
	PR fortran/57871
	* invoke.texi (-freal{4,8}-real-*): Extend description.
	* primary.c (match_real_constant): Also promote real literals
	with '_kind' number.

gcc/testsuite/ChangeLog:

	* gfortran.dg/real4-10-real8-10.f90: Add check for real literals
	with '_kind' number.
	* gfortran.dg/real4-10-real8-16.f90: Likewise.
	* gfortran.dg/real4-10-real8-4.f90: Likewise.
	* gfortran.dg/real4-10.f90: Likewise.
	* gfortran.dg/real4-16-real8-10.f90: Likewise.
	* gfortran.dg/real4-16-real8-16.f90: Likewise.
	* gfortran.dg/real4-16-real8-4.f90: Likewise.
	* gfortran.dg/real4-16.f90: Likewise.
	* gfortran.dg/real4-8-real8-10.f90: Likewise.
	* gfortran.dg/real4-8-real8-16.f90: Likewise.
	* gfortran.dg/real4-8-real8-4.f90: Likewise.
	* gfortran.dg/real4-8.f90: Likewise.
	* gfortran.dg/real8-10.f90: Likewise.
	* gfortran.dg/real8-16.f90: Likewise.
	* gfortran.dg/real8-4.f90: Likewise.

 gcc/fortran/invoke.texi                         | 19 +++++++++++++++----
 gcc/fortran/primary.c                           | 19 +++++++++++++++++++
 gcc/testsuite/gfortran.dg/real4-10-real8-10.f90 |  6 ++++--
 gcc/testsuite/gfortran.dg/real4-10-real8-16.f90 |  6 ++++--
 gcc/testsuite/gfortran.dg/real4-10-real8-4.f90  |  6 ++++--
 gcc/testsuite/gfortran.dg/real4-10.f90          |  6 ++++--
 gcc/testsuite/gfortran.dg/real4-16-real8-10.f90 |  6 ++++--
 gcc/testsuite/gfortran.dg/real4-16-real8-16.f90 |  6 ++++--
 gcc/testsuite/gfortran.dg/real4-16-real8-4.f90  |  6 ++++--
 gcc/testsuite/gfortran.dg/real4-16.f90          |  6 ++++--
 gcc/testsuite/gfortran.dg/real4-8-real8-10.f90  |  6 ++++--
 gcc/testsuite/gfortran.dg/real4-8-real8-16.f90  |  6 ++++--
 gcc/testsuite/gfortran.dg/real4-8-real8-4.f90   |  6 ++++--
 gcc/testsuite/gfortran.dg/real4-8.f90           |  6 ++++--
 gcc/testsuite/gfortran.dg/real8-10.f90          |  6 ++++--
 gcc/testsuite/gfortran.dg/real8-16.f90          |  6 ++++--
 gcc/testsuite/gfortran.dg/real8-4.f90           |  6 ++++--
 17 files changed, 94 insertions(+), 34 deletions(-)

diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
index 3f3ae5a7611..0fb7e1add7e 100644
--- a/gcc/fortran/invoke.texi
+++ b/gcc/fortran/invoke.texi
@@ -520,13 +520,24 @@ representation of the translated Fortran code, produced by
 @cindex options, real kind type promotion
 Promote all @code{REAL(KIND=M)} entities to @code{REAL(KIND=N)} entities.
 If @code{REAL(KIND=N)} is unavailable, then an error will be issued.
-All other real kind types are unaffected by this option.
+The @code{-freal-4-} flags also affect the default real kind and the
+@code{-freal-8-} flags also the double-precision real kind.  All other
+real-kind types are unaffected by this option.  The promotion is also
+applied to real literal constants of default and double-precision kind
+and a specified kind number of 4 or 8, respectively.
+However, @code{-fdefault-real-8}, @code{-fdefault-real-10},
+@code{-fdefault-real-10}, and @code{-fdefault-double-8} take precedence
+for the default and double-precision real kinds, both for real literal
+constants and for declarations without a kind number.
+Note that for @code{REAL(KIND=KIND(1.0))} the literal may get promoted and
+then the result may get promoted again.
 These options should be used with care and may not be suitable for your
 codes.  Areas of possible concern include calls to external procedures,
 alignment in @code{EQUIVALENCE} and/or @code{COMMON}, generic interfaces,
-BOZ literal constant conversion, and I/O.  Inspection of the intermediate
-representation of the translated Fortran code, produced by
-@option{-fdump-tree-original}, is suggested.
+BOZ literal constant conversion, and I/O and calls to intrinsic procedures
+when passing a value to the @code{kind=} dummy argument.  Inspection of the
+intermediate representation of the translated Fortran code, produced by
+@option{-fdump-fortran-original} or @option{-fdump-tree-original}, is suggested.
 
 @item -std=@var{std}
 @opindex @code{std=}@var{std} option
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index 9dd1a86f275..a6df885c80c 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -666,6 +666,25 @@ done:
   if (kind == -1)
     goto cleanup;
 
+  if (kind == 4)
+    {
+      if (flag_real4_kind == 8)
+	kind = 8;
+      if (flag_real4_kind == 10)
+	kind = 10;
+      if (flag_real4_kind == 16)
+	kind = 16;
+    }
+  else if (kind == 8)
+    {
+      if (flag_real8_kind == 4)
+	kind = 4;
+      if (flag_real8_kind == 10)
+	kind = 10;
+      if (flag_real8_kind == 16)
+	kind = 16;
+    }
+
   switch (exp_char)
     {
     case 'd':
diff --git a/gcc/testsuite/gfortran.dg/real4-10-real8-10.f90 b/gcc/testsuite/gfortran.dg/real4-10-real8-10.f90
index af4f1b2b4e6..1afd9ca5dca 100644
--- a/gcc/testsuite/gfortran.dg/real4-10-real8-10.f90
+++ b/gcc/testsuite/gfortran.dg/real4-10-real8-10.f90
@@ -2,6 +2,7 @@
 ! { dg-additional-options "-w -freal-4-real-10 -freal-8-real-10" }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -9,6 +10,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -18,6 +20,6 @@ program test
 
   !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 10)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 10)) stop 2
+  if (any ([kind(1.0), kind(1.0_4), kind(1.0_k4), kind(r1), kind(r2), kind(r3), kind(r4)] /= 10)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 10)) stop 2
 end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-10-real8-16.f90 b/gcc/testsuite/gfortran.dg/real4-10-real8-16.f90
index 408d3475499..83c51193889 100644
--- a/gcc/testsuite/gfortran.dg/real4-10-real8-16.f90
+++ b/gcc/testsuite/gfortran.dg/real4-10-real8-16.f90
@@ -3,6 +3,7 @@
 ! { dg-require-effective-target fortran_real_16 }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -10,6 +11,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -19,6 +21,6 @@ program test
 
   !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 10)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 16)) stop 2
+  if (any ([kind(1.0), kind(1.0_4), kind(1.0_k4), kind(r1), kind(r2), kind(r3), kind(r4)] /= 10)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 16)) stop 2
 end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-10-real8-4.f90 b/gcc/testsuite/gfortran.dg/real4-10-real8-4.f90
index 7e52cdb0ac1..19b79e9ab6b 100644
--- a/gcc/testsuite/gfortran.dg/real4-10-real8-4.f90
+++ b/gcc/testsuite/gfortran.dg/real4-10-real8-4.f90
@@ -2,6 +2,7 @@
 ! { dg-additional-options "-w -freal-4-real-10 -freal-8-real-4" }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -9,6 +10,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -18,6 +20,6 @@ program test
 
   !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 10)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d5)] /= 4)) stop 2
+  if (any ([kind(1.0), kind(1.0_4), kind(1.0_k4), kind(r1), kind(r2), kind(r3), kind(r4)] /= 10)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d5)] /= 4)) stop 2
 end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-10.f90 b/gcc/testsuite/gfortran.dg/real4-10.f90
index 44fcd83a002..133af44373e 100644
--- a/gcc/testsuite/gfortran.dg/real4-10.f90
+++ b/gcc/testsuite/gfortran.dg/real4-10.f90
@@ -2,6 +2,7 @@
 ! { dg-additional-options "-w -freal-4-real-10" }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -9,6 +10,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -18,6 +20,6 @@ program test
 
   !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 10)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 8)) stop 2
+  if (any ([kind(1.0), kind(1.0_4), kind(1.0_k4), kind(r1), kind(r2), kind(r3), kind(r4)] /= 10)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 8)) stop 2
 end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-16-real8-10.f90 b/gcc/testsuite/gfortran.dg/real4-16-real8-10.f90
index d080a1004c0..1ddefca36dd 100644
--- a/gcc/testsuite/gfortran.dg/real4-16-real8-10.f90
+++ b/gcc/testsuite/gfortran.dg/real4-16-real8-10.f90
@@ -3,6 +3,7 @@
 ! { dg-require-effective-target fortran_real_16 }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -10,6 +11,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -19,6 +21,6 @@ program test
 
   !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 16)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 10)) stop 2
+  if (any ([kind(1.0), kind(1.0_4), kind(1.0_k4), kind(r1), kind(r2), kind(r3), kind(r4)] /= 16)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 10)) stop 2
 end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-16-real8-16.f90 b/gcc/testsuite/gfortran.dg/real4-16-real8-16.f90
index d525c6014aa..0e761933d9e 100644
--- a/gcc/testsuite/gfortran.dg/real4-16-real8-16.f90
+++ b/gcc/testsuite/gfortran.dg/real4-16-real8-16.f90
@@ -3,6 +3,7 @@
 ! { dg-require-effective-target fortran_real_16 }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -10,6 +11,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -19,6 +21,6 @@ program test
 
   !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 16)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 16)) stop 2
+  if (any ([kind(1.0), kind(1.0_4), kind(1.0_k4), kind(r1), kind(r2), kind(r3), kind(r4)] /= 16)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 16)) stop 2
 end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-16-real8-4.f90 b/gcc/testsuite/gfortran.dg/real4-16-real8-4.f90
index e508819350e..3d2185b2e26 100644
--- a/gcc/testsuite/gfortran.dg/real4-16-real8-4.f90
+++ b/gcc/testsuite/gfortran.dg/real4-16-real8-4.f90
@@ -3,6 +3,7 @@
 ! { dg-require-effective-target fortran_real_16 }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -10,6 +11,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -19,6 +21,6 @@ program test
 
   !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 16)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d5)] /= 4)) stop 2
+  if (any ([kind(1.0), kind(1.0_4), kind(1.0_k4), kind(r1), kind(r2), kind(r3), kind(r4)] /= 16)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d5)] /= 4)) stop 2
 end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-16.f90 b/gcc/testsuite/gfortran.dg/real4-16.f90
index 5cd2f1f4822..e07bcd4b23e 100644
--- a/gcc/testsuite/gfortran.dg/real4-16.f90
+++ b/gcc/testsuite/gfortran.dg/real4-16.f90
@@ -3,6 +3,7 @@
 ! { dg-require-effective-target fortran_real_16 }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -10,6 +11,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -19,6 +21,6 @@ program test
 
   !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 16)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 8)) stop 2
+  if (any ([kind(1.0), kind(1.0_4), kind(1.0_k4), kind(r1), kind(r2), kind(r3), kind(r4)] /= 16)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 8)) stop 2
 end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-8-real8-10.f90 b/gcc/testsuite/gfortran.dg/real4-8-real8-10.f90
index 742d3524827..2d48f572c62 100644
--- a/gcc/testsuite/gfortran.dg/real4-8-real8-10.f90
+++ b/gcc/testsuite/gfortran.dg/real4-8-real8-10.f90
@@ -2,6 +2,7 @@
 ! { dg-additional-options "-w -freal-4-real-8 -freal-8-real-10" }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -9,6 +10,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -18,6 +20,6 @@ program test
 
   print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(r1), kind(r2), kind(r3), kind(r4)] /= 8)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 10)) stop 2
+  if (any ([kind(r1), kind(1.0_4), kind(1.0_k4), kind(r2), kind(r3), kind(r4)] /= 8)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 10)) stop 2
 end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-8-real8-16.f90 b/gcc/testsuite/gfortran.dg/real4-8-real8-16.f90
index 3733c343d2a..4d3e5af0eda 100644
--- a/gcc/testsuite/gfortran.dg/real4-8-real8-16.f90
+++ b/gcc/testsuite/gfortran.dg/real4-8-real8-16.f90
@@ -3,6 +3,7 @@
 ! { dg-require-effective-target fortran_real_16 }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -10,6 +11,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -19,6 +21,6 @@ program test
 
   !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 8)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 16)) stop 2
+  if (any ([kind(1.0), kind(1.0_4), kind(1.0_k4), kind(r1), kind(r2), kind(r3), kind(r4)] /= 8)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 16)) stop 2
 end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-8-real8-4.f90 b/gcc/testsuite/gfortran.dg/real4-8-real8-4.f90
index b83b2438a58..9f18d430c41 100644
--- a/gcc/testsuite/gfortran.dg/real4-8-real8-4.f90
+++ b/gcc/testsuite/gfortran.dg/real4-8-real8-4.f90
@@ -2,6 +2,7 @@
 ! { dg-additional-options "-w -freal-4-real-8 -freal-8-real-4" }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -9,6 +10,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -18,6 +20,6 @@ program test
 
   print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 8)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d5)] /= 4)) stop 2
+  if (any ([kind(1.0), kind(1.0_4), kind(1.0_k4), kind(r1), kind(r2), kind(r3), kind(r4)] /= 8)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d5)] /= 4)) stop 2
 end program test
diff --git a/gcc/testsuite/gfortran.dg/real4-8.f90 b/gcc/testsuite/gfortran.dg/real4-8.f90
index 50577dd5fa8..f436b3db61e 100644
--- a/gcc/testsuite/gfortran.dg/real4-8.f90
+++ b/gcc/testsuite/gfortran.dg/real4-8.f90
@@ -2,6 +2,7 @@
 ! { dg-additional-options "-w -freal-4-real-8" }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -9,6 +10,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -18,6 +20,6 @@ program test
 
   !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 8)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 8)) stop 2
+  if (any ([kind(1.0), kind(1.0_4), kind(1.0_k4), kind(r1), kind(r2), kind(r3), kind(r4)] /= 8)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 8)) stop 2
 end program test
diff --git a/gcc/testsuite/gfortran.dg/real8-10.f90 b/gcc/testsuite/gfortran.dg/real8-10.f90
index 68f6bc46bce..ce85a781974 100644
--- a/gcc/testsuite/gfortran.dg/real8-10.f90
+++ b/gcc/testsuite/gfortran.dg/real8-10.f90
@@ -2,6 +2,7 @@
 ! { dg-additional-options "-w -freal-8-real-10" }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -9,6 +10,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -18,6 +20,6 @@ program test
 
   !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 4)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 10)) stop 2
+  if (any ([kind(1.0), kind(1.0_4), kind(1.0_k4), kind(r1), kind(r2), kind(r3), kind(r4)] /= 4)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 10)) stop 2
 end program test
diff --git a/gcc/testsuite/gfortran.dg/real8-16.f90 b/gcc/testsuite/gfortran.dg/real8-16.f90
index 5ddd9e17bb6..b3b86c8b78a 100644
--- a/gcc/testsuite/gfortran.dg/real8-16.f90
+++ b/gcc/testsuite/gfortran.dg/real8-16.f90
@@ -3,6 +3,7 @@
 ! { dg-require-effective-target fortran_real_16 }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -10,6 +11,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -19,6 +21,6 @@ program test
 
   !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 4)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 16)) stop 2
+  if (any ([kind(1.0), kind(1.0_4), kind(1.0_k4), kind(r1), kind(r2), kind(r3), kind(r4)] /= 4)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 16)) stop 2
 end program test
diff --git a/gcc/testsuite/gfortran.dg/real8-4.f90 b/gcc/testsuite/gfortran.dg/real8-4.f90
index a68559a26ad..c64c2973f04 100644
--- a/gcc/testsuite/gfortran.dg/real8-4.f90
+++ b/gcc/testsuite/gfortran.dg/real8-4.f90
@@ -2,6 +2,7 @@
 ! { dg-additional-options "-w -freal-8-real-4" }
 !
 ! PR fortran/99355
+! PR fortran/99355 comment 10 to 13 + PR fortran/57871
 !
 
 program test
@@ -9,6 +10,7 @@ program test
   real*4:: r2
   real(4) :: r3
   real(selected_real_kind(p=6)) :: r4
+  integer, parameter :: k4 = 4, k8 = 8
 
   double precision :: d1
   real*8 :: d2
@@ -18,6 +20,6 @@ program test
 
   !print '(tr3,a10,10(tr1,i2))', 'single', kind(r1), kind(r2), kind(r3), kind(r4)
   !print '(tr3,a10,10(tr1,i2))', 'double', kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)
-  if (any ([kind(1.0), kind(r1), kind(r2), kind(r3), kind(r4)] /= 4)) stop 1
-  if (any ([kind(1.d0), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 4)) stop 2
+  if (any ([kind(1.0), kind(1.0_4), kind(1.0_k4), kind(r1), kind(r2), kind(r3), kind(r4)] /= 4)) stop 1
+  if (any ([kind(1.d0), kind(1.0_8), kind(1.0_k8), kind(d1), kind(d2), kind(d3), kind(d4), kind(d5)] /= 4)) stop 2
 end program test


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

* Re: [Patch] Fortran: Follow fixes to -freal-{4,8}-real* handling [PR99355,PR57871] (was: Re: [Patch] Fortran: Fix -freal-{4,8}-real* handling [PR99355])
  2021-03-04 17:02 ` [Patch] Fortran: Follow fixes to -freal-{4,8}-real* handling [PR99355,PR57871] (was: Re: [Patch] Fortran: Fix -freal-{4,8}-real* handling [PR99355]) Tobias Burnus
@ 2021-03-05  1:03   ` Jerry DeLisle
  0 siblings, 0 replies; 4+ messages in thread
From: Jerry DeLisle @ 2021-03-05  1:03 UTC (permalink / raw)
  To: Tobias Burnus, gcc-patches, fortran

OK, thanks Dominique for spotting this.

On 3/4/21 9:02 AM, Tobias Burnus wrote:
> Dominique found an issue ("regression") with this patch – and a testcase
> omission.
>
> The previous patch mishandled the noncommitted testcase of PR57871 – or
> in other words: It did not promote 1.0_4 or 1.0_8 – as only the
> default-real-kind values 1.0 and 1.0d0 were promoted (via code in in
> trans-types.c).
>
> I have additionally updated the documentation to more accurately state
> what the option does and how it interacts with other options.
>
> OK for mainline?
>
> Tobias
>
> PS: Side remark: My recommendation is to avoid
> -freal-{4,8}-real-{4,8,10,16} ...
>
> -----------------
> Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München 
> Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, 
> Frank Thürauf


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

end of thread, other threads:[~2021-03-05  1:03 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-03 11:45 [Patch] Fortran: Fix -freal-{4,8}-real* handling [PR99355] Tobias Burnus
2021-03-04  2:06 ` Jerry DeLisle
2021-03-04 17:02 ` [Patch] Fortran: Follow fixes to -freal-{4,8}-real* handling [PR99355,PR57871] (was: Re: [Patch] Fortran: Fix -freal-{4,8}-real* handling [PR99355]) Tobias Burnus
2021-03-05  1:03   ` Jerry DeLisle

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).