Commit 120a4c45 by Jerry DeLisle

re PR fortran/54679 (Erroneous "Expected P edit descriptor" in conjunction with L descriptor)

2016-10-31  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR fortran/54679
	* io.c (check_format): Adjust checks for FMT_L to treat a zero
	width as an extension, giving warnings or error as appropriate.
	Improve messages.
	PR libgfortran/54679
	* io/format.c (parse_format_list): Adjust checks for FMT_L to
	treat a zero width as an extension, giving warnings or error
	as appropriate. Improve messages.
	PR fortran/54679
	* gfortran.dg/fmt_l.f90: Update test.
	* gfortran.dg/fmt_l0.f90: New test.

From-SVN: r241720
parent 5cea3ad6
2016-10-31 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/54679
* io.c (check_format): Adjust checks for FMT_L to treat a zero
width as an extension, giving warnings or error as appropriate.
Improve messages.
2016-10-31 Jakub Jelinek <jakub@redhat.com> 2016-10-31 Jakub Jelinek <jakub@redhat.com>
* trans-types.c (gfc_get_array_descr_info): For -gdwarf-5 or * trans-types.c (gfc_get_array_descr_info): For -gdwarf-5 or
......
...@@ -601,7 +601,7 @@ check_format (bool is_input) ...@@ -601,7 +601,7 @@ check_format (bool is_input)
const char *unexpected_end = _("Unexpected end of format string"); const char *unexpected_end = _("Unexpected end of format string");
const char *zero_width = _("Zero width in format descriptor"); const char *zero_width = _("Zero width in format descriptor");
const char *error; const char *error = NULL;
format_token t, u; format_token t, u;
int level; int level;
int repeat; int repeat;
...@@ -867,27 +867,31 @@ data_desc: ...@@ -867,27 +867,31 @@ data_desc:
goto fail; goto fail;
if (t == FMT_POSINT) if (t == FMT_POSINT)
break; break;
if (mode != MODE_FORMAT)
switch (gfc_notification_std (GFC_STD_GNU)) format_locus.nextc += format_string_pos;
if (t == FMT_ZERO)
{ {
case WARNING: switch (gfc_notification_std (GFC_STD_GNU))
if (mode != MODE_FORMAT) {
format_locus.nextc += format_string_pos; case WARNING:
gfc_warning (0, "Extension: Missing positive width after L " gfc_warning (0, "Extension: Zero width after L "
"descriptor at %L", &format_locus); "descriptor at %L", &format_locus);
saved_token = t; break;
break; case ERROR:
gfc_error ("Extension: Zero width after L "
case ERROR: "descriptor at %L", &format_locus);
error = posint_required; goto fail;
goto syntax; case SILENT:
break;
case SILENT: default:
saved_token = t; gcc_unreachable ();
break; }
}
default: else
gcc_unreachable (); {
saved_token = t;
gfc_notify_std (GFC_STD_GNU, "Missing positive width after "
"L descriptor at %L", &format_locus);
} }
break; break;
......
2016-10-31 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/54679
* gfortran.dg/fmt_l.f90: Update test.
* gfortran.dg/fmt_l0.f90: New test.
2016-10-31 Jakub Jelinek <jakub@redhat.com> 2016-10-31 Jakub Jelinek <jakub@redhat.com>
PR c++/78089 PR c++/78089
......
...@@ -52,34 +52,34 @@ program test_l ...@@ -52,34 +52,34 @@ program test_l
end program test_l end program test_l
! { dg-output "At line 14 of file.*" } ! { dg-output "At line 14 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 15 of file.*" } ! { dg-output "At line 15 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 19 of file.*" } ! { dg-output "At line 19 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 20 of file.*" } ! { dg-output "At line 20 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 24 of file.*" } ! { dg-output "At line 24 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 25 of file.*" } ! { dg-output "At line 25 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 29 of file.*" } ! { dg-output "At line 29 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 30 of file.*" } ! { dg-output "At line 30 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 34 of file.*" } ! { dg-output "At line 34 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 35 of file.*" } ! { dg-output "At line 35 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 39 of file.*" } ! { dg-output "At line 39 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 40 of file.*" } ! { dg-output "At line 40 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 44 of file.*" } ! { dg-output "At line 44 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 45 of file.*" } ! { dg-output "At line 45 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 49 of file.*" } ! { dg-output "At line 49 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-output "At line 50 of file.*" } ! { dg-output "At line 50 of file.*" }
! { dg-output "Fortran runtime warning: Positive width required in format(\n|\r\n|\r)" } ! { dg-output "Fortran runtime warning: Positive width required with L descriptor(\n|\r\n|\r)" }
! { dg-do run }
! { dg-options "-std=gnu -pedantic" }
! Test the GNU extension of a L format descriptor without width
! PR libfortran/54679
program main
implicit none
character(len=20) :: str
character(len=60) :: format2 = "(2(1x,l0,1x))"
write(str,format2)
end program main
! { dg-output "At line 9 of file.*" }
! { dg-output "Fortran runtime warning: Zero width after L descriptor(\n|\r\n|\r)" }
2016-10-31 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/54679
* io/format.c (parse_format_list): Adjust checks for FMT_L to
treat a zero width as an extension, giving warnings or error
as appropriate. Improve messages.
2016-10-30 Jerry DeLisle <jvdelisle@gcc.gnu.org> 2016-10-30 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/78123 PR fortran/78123
......
...@@ -870,19 +870,25 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd) ...@@ -870,19 +870,25 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd)
t = format_lex (fmt); t = format_lex (fmt);
if (t != FMT_POSINT) if (t != FMT_POSINT)
{ {
if (notification_std(GFC_STD_GNU) == NOTIFICATION_ERROR) if (t == FMT_ZERO)
{ {
fmt->error = posint_required; if (notification_std(GFC_STD_GNU) == NOTIFICATION_ERROR)
goto finished; {
fmt->error = "Extension: Zero width after L descriptor";
goto finished;
}
else
notify_std (&dtp->common, GFC_STD_GNU,
"Zero width after L descriptor");
} }
else else
{ {
fmt->saved_token = t; fmt->saved_token = t;
fmt->value = 1; /* Default width */ notify_std (&dtp->common, GFC_STD_GNU,
notify_std (&dtp->common, GFC_STD_GNU, posint_required); "Positive width required with L descriptor");
} }
fmt->value = 1; /* Default width */
} }
get_fnode (fmt, &head, &tail, FMT_L); get_fnode (fmt, &head, &tail, FMT_L);
tail->u.n = fmt->value; tail->u.n = fmt->value;
tail->repeat = repeat; tail->repeat = repeat;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment