/* Handle errors.
- Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
- Inc.
+ Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
+ Foundation, Inc.
Contributed by Andy Vaught & Niels Kristian Bech Jensen
This file is part of GCC.
}
+/* Whether, for a feature included in a given standard set (GFC_STD_*),
+ we should issue an error or a warning, or be quiet. */
+
+notification
+gfc_notification_std (int std)
+{
+ bool warning;
+
+ warning = ((gfc_option.warn_std & std) != 0) && !inhibit_warnings;
+ if ((gfc_option.allow_std & std) != 0 && !warning)
+ return SILENT;
+
+ return warning ? WARNING : ERROR;
+}
+
+
/* Possibly issue a warning/error about use of a nonstandard (or deleted)
feature. An error/warning will be issued if the currently selected
standard does not contain the requested bits. Return FAILURE if
{ SUCCESS = 1, FAILURE }
try;
+/* This is returned by gfc_notification_std to know if, given the flags
+ that were given (-std=, -pedantic) we should issue an error, a warning
+ or nothing. */
+
+typedef enum
+{ SILENT, WARNING, ERROR }
+notification;
+
/* Matchers return one of these three values. The difference between
MATCH_NO and MATCH_ERROR is that MATCH_ERROR means that a match was
successful, but that something non-syntactic is wrong and an error
void gfc_clear_error (void);
int gfc_error_check (void);
+notification gfc_notification_std (int);
try gfc_notify_std (int, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
/* A general purpose syntax error. */
if (t == FMT_POSINT)
break;
- error = posint_required;
- goto syntax;
+ switch (gfc_notification_std (GFC_STD_GNU))
+ {
+ case WARNING:
+ gfc_warning
+ ("Extension: Missing positive width after L descriptor at %C");
+ saved_token = t;
+ break;
+
+ case ERROR:
+ error = posint_required;
+ goto syntax;
+
+ case SILENT:
+ saved_token = t;
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+ break;
case FMT_A:
t = format_lex ();
--- /dev/null
+! { dg-do run }
+! { dg-options "-std=gnu -pedantic -ffree-line-length-none" }
+! Test the GNU extension of a L format descriptor without width
+! PR libfortran/21303
+program test_l
+ logical(kind=1) :: l1
+ logical(kind=2) :: l2
+ logical(kind=4) :: l4
+ logical(kind=8) :: l8
+
+ character(len=20) :: str
+
+ l1 = .true.
+ write (str,"(L)") l1 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ read (str,"(L)") l1 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ if (l1 .neqv. .true.) call abort
+
+ l2 = .true.
+ write (str,"(L)") l2 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ read (str,"(L)") l2 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ if (l2 .neqv. .true.) call abort
+
+ l4 = .true.
+ write (str,"(L)") l4 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ read (str,"(L)") l4 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ if (l4 .neqv. .true.) call abort
+
+ l8 = .true.
+ write (str,"(L)") l8 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ read (str,"(L)") l8 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ if (l8 .neqv. .true.) call abort
+
+ l1 = .false.
+ write (str,"(L)") l1 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ read (str,"(L)") l1 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ if (l1 .neqv. .false.) call abort
+
+ l2 = .false.
+ write (str,"(L)") l2 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ read (str,"(L)") l2 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ if (l2 .neqv. .false.) call abort
+
+ l4 = .false.
+ write (str,"(L)") l4 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ read (str,"(L)") l4 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ if (l4 .neqv. .false.) call abort
+
+ l8 = .false.
+ write (str,"(L)") l8 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ read (str,"(L)") l8 ! { dg-warning "Extension: Missing positive width after L descriptor" }
+ if (l8 .neqv. .false.) call abort
+
+end program test_l
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
+! { dg-output "Fortran runtime warning: Positive width required in format\n" }
-/* Copyright (C) 2002, 2003, 2004, 2005
+/* Copyright (C) 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
Contributed by Andy Vaught
t = format_lex (fmt);
if (t != FMT_POSINT)
{
- fmt->error = posint_required;
- goto finished;
+ if (notification_std(GFC_STD_GNU) == ERROR)
+ {
+ fmt->error = posint_required;
+ goto finished;
+ }
+ else
+ {
+ fmt->saved_token = t;
+ fmt->value = 1; /* Default width */
+ notify_std(GFC_STD_GNU, posint_required);
+ }
}
get_fnode (fmt, &head, &tail, FMT_L);
-/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
Contributed by Andy Vaught
This file is part of the GNU Fortran 95 runtime library (libgfortran).
extern try notify_std (int, const char *);
internal_proto(notify_std);
+extern notification notification_std(int);
+internal_proto(notification_std);
+
/* size_from_kind.c */
extern size_t size_from_real_kind (int);
internal_proto(size_from_real_kind);
#define GFC_FPE_UNDERFLOW (1<<4)
#define GFC_FPE_PRECISION (1<<5)
+/* This is returned by notification_std to know if, given the flags
+ that were given (-std=, -pedantic) we should issue an error, a warning
+ or nothing. */
+typedef enum
+{ SILENT, WARNING, ERROR }
+notification;
+
/* The filename and line number don't go inside the globals structure.
They are set by the rest of the program and must be linked to. */
}
+/* Whether, for a feature included in a given standard set (GFC_STD_*),
+ we should issue an error or a warning, or be quiet. */
+
+notification
+notification_std (int std)
+{
+ int warning;
+
+ if (!compile_options.pedantic)
+ return SILENT;
+
+ warning = compile_options.warn_std & std;
+ if ((compile_options.allow_std & std) != 0 && !warning)
+ return SILENT;
+
+ return warning ? WARNING : ERROR;
+}
+
+
/* Possibly issue a warning/error about use of a nonstandard (or deleted)
feature. An error/warning will be issued if the currently selected