diff --git a/gcc/fortran/error.c b/gcc/fortran/error.c
index aa23330020c047c0719ae873479091a66f481fb9..4c82c4a5498a02b246cef5827afaf72a33cd0a7c 100644
--- a/gcc/fortran/error.c
+++ b/gcc/fortran/error.c
@@ -1,6 +1,6 @@
 /* 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.
@@ -483,6 +483,22 @@ gfc_warning (const char *nocmsgid, ...)
 }
 
 
+/* 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
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index aa6698085cdadc29a898556f13e1742ff1ca1c64..17e97779653d95bc67477c0fe43f078ef9ae9fec 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -129,6 +129,14 @@ typedef enum
 { 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
@@ -1737,6 +1745,7 @@ void gfc_internal_error (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_GCC_GFC
 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.  */
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
index 618d056ce79c9dc610ce85c5c219af555bdc6632..b45e983a045fc87bb3477b3d608db12967eff560 100644
--- a/gcc/fortran/io.c
+++ b/gcc/fortran/io.c
@@ -569,8 +569,26 @@ data_desc:
       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 ();
diff --git a/gcc/testsuite/gfortran.dg/fmt_l.f90 b/gcc/testsuite/gfortran.dg/fmt_l.f90
new file mode 100644
index 0000000000000000000000000000000000000000..e03f63d8b3b061fbacc72138cd2c961d7193c59f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_l.f90
@@ -0,0 +1,69 @@
+! { 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" }
diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c
index 23ea3175dc41aa6077d8959b2a1a5fc2c7743181..9528dbad277e4311c3e0d0d611369b6457ba7da2 100644
--- a/libgfortran/io/format.c
+++ b/libgfortran/io/format.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005
+/* Copyright (C) 2002, 2003, 2004, 2005, 2006
    Free Software Foundation, Inc.
    Contributed by Andy Vaught
 
@@ -662,8 +662,17 @@ parse_format_list (st_parameter_dt *dtp)
       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);
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
index 0d2d795e1988ef4b838226187d9f7915642337d0..9b35ef9165078035be747f526748dbea94fa5b0b 100644
--- a/libgfortran/io/io.h
+++ b/libgfortran/io/io.h
@@ -1,4 +1,4 @@
-/* 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).
@@ -843,6 +843,9 @@ internal_proto(list_formatted_write);
 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);
diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h
index f1a1a3e7e1c7df1aac5b3f81bbeb1aa16ef0751e..524c57e37bcf58c140760dccd7796bba81403c7c 100644
--- a/libgfortran/libgfortran.h
+++ b/libgfortran/libgfortran.h
@@ -404,6 +404,13 @@ error_codes;
 #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.  */
 
diff --git a/libgfortran/runtime/error.c b/libgfortran/runtime/error.c
index b25cd0c8c160934e02308bbff6de54aa48dd0ee2..e102449cec512bc502ed2b6162735a732f8b13ab 100644
--- a/libgfortran/runtime/error.c
+++ b/libgfortran/runtime/error.c
@@ -498,6 +498,25 @@ generate_error (st_parameter_common *cmp, int family, const char *message)
 }
 
 
+/* 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