aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/testsuite/gfortran.dg/pr96436_1.f9010
-rw-r--r--gcc/testsuite/gfortran.dg/pr96436_10.f9010
-rw-r--r--gcc/testsuite/gfortran.dg/pr96436_2.f9010
-rw-r--r--gcc/testsuite/gfortran.dg/pr96436_3.f9013
-rw-r--r--gcc/testsuite/gfortran.dg/pr96436_4.f9025
-rw-r--r--gcc/testsuite/gfortran.dg/pr96436_5.f9025
-rw-r--r--gcc/testsuite/gfortran.dg/pr96436_6.f9010
-rw-r--r--gcc/testsuite/gfortran.dg/pr96436_7.f9010
-rw-r--r--gcc/testsuite/gfortran.dg/pr96436_8.f9010
-rw-r--r--gcc/testsuite/gfortran.dg/pr96436_9.f9010
-rw-r--r--libgfortran/io/format.c10
11 files changed, 142 insertions, 1 deletions
diff --git a/gcc/testsuite/gfortran.dg/pr96436_1.f90 b/gcc/testsuite/gfortran.dg/pr96436_1.f90
new file mode 100644
index 0000000..7cc6a0a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr96436_1.f90
@@ -0,0 +1,10 @@
+! { dg-do run }
+! { dg-options "-std=f95 -pedantic" }
+
+character(20) :: fmt
+character(9) :: buffer
+fmt = "(1a1,f0.2,1a1)"
+write(buffer,fmt) ">", 3.0, "<"
+if (buffer.ne.">3.00<") stop 1
+end
+
diff --git a/gcc/testsuite/gfortran.dg/pr96436_10.f90 b/gcc/testsuite/gfortran.dg/pr96436_10.f90
new file mode 100644
index 0000000..3bd30a9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr96436_10.f90
@@ -0,0 +1,10 @@
+! { dg-do run }
+! { dg-options "-std=f2008 -pedantic" }
+! { dg-shouldfail "Zero width in format descriptor" }
+
+character(10) :: fmt = "(es0.2)"
+print fmt, 3.
+end
+
+! { dg-output "Fortran runtime error: Zero width in format descriptor" }
+
diff --git a/gcc/testsuite/gfortran.dg/pr96436_2.f90 b/gcc/testsuite/gfortran.dg/pr96436_2.f90
new file mode 100644
index 0000000..d2d6caf
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr96436_2.f90
@@ -0,0 +1,10 @@
+! { dg-do run }
+! { dg-options "-std=f2003 -pedantic" }
+
+character(20) :: fmt
+character(9) :: buffer
+fmt = "(1a1,f0.2,1a1)"
+write(buffer,fmt) ">", 3.0, "<"
+if (buffer.ne.">3.00<") stop 1
+end
+
diff --git a/gcc/testsuite/gfortran.dg/pr96436_3.f90 b/gcc/testsuite/gfortran.dg/pr96436_3.f90
new file mode 100644
index 0000000..2750231
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr96436_3.f90
@@ -0,0 +1,13 @@
+! { dg-do run }
+! { dg-options "-std=f2008 -pedantic" }
+
+character(20) :: fmt
+character(9) :: buffer
+fmt = "(1a1,f0.2,1a1)"
+write(buffer,fmt) ">", 3.0, "<"
+if (buffer.ne.">3.00<") stop 1
+fmt = "(1a1,g0.2,1a1)"
+write(buffer,fmt) ">", 0.3, "<"
+if (buffer.ne.">0.30<") stop 2
+end
+
diff --git a/gcc/testsuite/gfortran.dg/pr96436_4.f90 b/gcc/testsuite/gfortran.dg/pr96436_4.f90
new file mode 100644
index 0000000..335ce5f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr96436_4.f90
@@ -0,0 +1,25 @@
+! { dg-do run }
+! { dg-options "-std=f2018 -pedantic" }
+
+character(20) :: fmt
+character(9) :: buffer
+fmt = "(1a1,f0.2,1a1)"
+write(buffer,fmt) ">", 3.0, "<"
+if (buffer.ne.">3.00<") stop 1
+fmt = "(1a1,g0.2,1a1)"
+write(buffer,fmt) ">", 0.3, "<"
+if (buffer.ne.">0.30<") stop 2
+fmt = "(1a1,d0.2,1a1)"
+write(buffer,fmt) ">", 3.0, "<"
+if (buffer.ne.">0.30D+1<") stop 3
+fmt = "(1a1,e0.2,1a1)"
+write(buffer,fmt) ">", 3.0, "<"
+if (buffer.ne.">0.30E+1<") stop 4
+fmt = "(1a1,en0.2,1a1)"
+write(buffer,fmt) ">", 3.0, "<"
+if (buffer.ne.">3.00<") stop 5
+fmt = "(1a1,es0.2,1a1)"
+write(buffer,fmt) ">", 3.0, "<"
+if (buffer.ne.">3.00<") stop 6
+end
+
diff --git a/gcc/testsuite/gfortran.dg/pr96436_5.f90 b/gcc/testsuite/gfortran.dg/pr96436_5.f90
new file mode 100644
index 0000000..a45df89
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr96436_5.f90
@@ -0,0 +1,25 @@
+! { dg-do run }
+! { dg-options "-pedantic" }
+
+character(20) :: fmt
+character(9) :: buffer
+fmt = "(1a1,f0.2,1a1)"
+write(buffer,fmt) ">", 3.0, "<"
+if (buffer.ne.">3.00<") stop 1
+fmt = "(1a1,g0.2,1a1)"
+write(buffer,fmt) ">", 0.30, "<"
+if (buffer.ne.">0.30<") stop 2
+fmt = "(1a1,d0.2,1a1)"
+write(buffer,fmt) ">", 3.0, "<"
+if (buffer.ne.">0.30D+1<") stop 3
+fmt = "(1a1,e0.2,1a1)"
+write(buffer,fmt) ">", 3.0, "<"
+if (buffer.ne.">0.30E+1<") stop 4
+fmt = "(1a1,en0.2,1a1)"
+write(buffer,fmt) ">", 3.0, "<"
+if (buffer.ne.">3.00<") stop 5
+fmt = "(1a1,es0.2,1a1)"
+write(buffer,fmt) ">", 3.0, "<"
+if (buffer.ne.">3.00<") stop 6
+end
+
diff --git a/gcc/testsuite/gfortran.dg/pr96436_6.f90 b/gcc/testsuite/gfortran.dg/pr96436_6.f90
new file mode 100644
index 0000000..e413ffc
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr96436_6.f90
@@ -0,0 +1,10 @@
+! { dg-do run }
+! { dg-options "-std=f2003 -pedantic" }
+! { dg-shouldfail "Zero width in format descriptor" }
+
+character(10) :: fmt = "(g0.2)"
+print fmt, 0.3
+end
+
+! { dg-output "Fortran runtime error: Zero width in format descriptor" }
+
diff --git a/gcc/testsuite/gfortran.dg/pr96436_7.f90 b/gcc/testsuite/gfortran.dg/pr96436_7.f90
new file mode 100644
index 0000000..607a7f6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr96436_7.f90
@@ -0,0 +1,10 @@
+! { dg-do run }
+! { dg-options "-std=f2008 -pedantic" }
+! { dg-shouldfail "Zero width in format descriptor" }
+
+character(10) :: fmt = "(d0.2)"
+print fmt, 3.
+end
+
+! { dg-output "Fortran runtime error: Zero width in format descriptor" }
+
diff --git a/gcc/testsuite/gfortran.dg/pr96436_8.f90 b/gcc/testsuite/gfortran.dg/pr96436_8.f90
new file mode 100644
index 0000000..b851a75
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr96436_8.f90
@@ -0,0 +1,10 @@
+! { dg-do run }
+! { dg-options "-std=f2008 -pedantic" }
+! { dg-shouldfail "Zero width in format descriptor" }
+
+character(10) :: fmt = "(e0.2)"
+print fmt, 3.
+end
+
+! { dg-output "Fortran runtime error: Zero width in format descriptor" }
+
diff --git a/gcc/testsuite/gfortran.dg/pr96436_9.f90 b/gcc/testsuite/gfortran.dg/pr96436_9.f90
new file mode 100644
index 0000000..a10f818
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr96436_9.f90
@@ -0,0 +1,10 @@
+! { dg-do run }
+! { dg-options "-std=f2008 -pedantic" }
+! { dg-shouldfail "Zero width in format descriptor" }
+
+character(10) :: fmt = "(en0.2)"
+print fmt, 3.
+end
+
+! { dg-output "Fortran runtime error: Zero width in format descriptor" }
+
diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c
index 3be861f..0959b3d 100644
--- a/libgfortran/io/format.c
+++ b/libgfortran/io/format.c
@@ -617,6 +617,7 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd)
int repeat;
format_data *fmt = dtp->u.p.fmt;
bool seen_data_desc = false;
+ int standard;
head = tail = NULL;
@@ -929,7 +930,14 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd)
/* Processing for zero width formats. */
if (u == FMT_ZERO)
{
- if (notification_std (GFC_STD_F2008) == NOTIFICATION_ERROR
+ if (t == FMT_F)
+ standard = GFC_STD_F95;
+ else if (t == FMT_G)
+ standard = GFC_STD_F2008;
+ else
+ standard = GFC_STD_F2018;
+
+ if (notification_std (standard) == NOTIFICATION_ERROR
|| dtp->u.p.mode == READING)
{
fmt->error = zero_width;