From 03e957f8c8c0d3691454521e7daa9c2287f48b19 Mon Sep 17 00:00:00 2001
From: Jerry DeLisle <jvdelisle@gcc.gnu.org>
Date: Sun, 5 Mar 2006 17:54:07 +0000
Subject: [PATCH] re PR fortran/26554 ([gfortran] incorrect behaviour when
 reading a logical variable from a string)

2006-03-05  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR libgfortran/26554
	* io/list_read.c (read_logical): Return the value if not in namelist
	mode.

From-SVN: r111738
---
 libgfortran/ChangeLog      |  6 ++++++
 libgfortran/io/list_read.c | 23 ++++++++++++++++-------
 2 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index ff9e599edc55..5bfe9c36e103 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,9 @@
+2006-03-05  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+	PR libgfortran/26554
+	* io/list_read.c (read_logical): Return the value if not in namelist
+	mode.
+
 2006-03-03  Thomas Koenig  <Thomas.Koenig@online.de>
 
 	PR fortran/25031
diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c
index 5ff4cbbc299d..ab9b25d2ba48 100644
--- a/libgfortran/io/list_read.c
+++ b/libgfortran/io/list_read.c
@@ -647,18 +647,17 @@ read_logical (st_parameter_dt *dtp, int length)
       c = next_char (dtp);
       if (is_separator(c))
 	{
+	  /* All done if this is not a namelist read.  */
+	  if (!dtp->u.p.namelist_mode)
+	    goto logical_done;
+
 	  unget_char (dtp, c);
 	  eat_separator (dtp);
 	  c = next_char (dtp);
 	  if (c != '=')
 	    {
 	      unget_char (dtp, c);
-	      dtp->u.p.item_count = 0;
-	      dtp->u.p.line_buffer_enabled = 0;
-	      dtp->u.p.saved_type = BT_LOGICAL;
-	      dtp->u.p.saved_length = length;
-	      set_integer ((int *) dtp->u.p.value, v, length);
-	      return;
+	      goto logical_done;
 	    }
 	}
  
@@ -670,7 +669,8 @@ read_logical (st_parameter_dt *dtp, int length)
 	  dtp->u.p.item_count = 0;
 	  return;
 	}
-     }
+      
+    }
 
  bad_logical:
 
@@ -681,6 +681,15 @@ read_logical (st_parameter_dt *dtp, int length)
 	      dtp->u.p.item_count);
 
   generate_error (&dtp->common, ERROR_READ_VALUE, message);
+  return;
+
+ logical_done:
+  
+  dtp->u.p.item_count = 0;
+  dtp->u.p.line_buffer_enabled = 0;
+  dtp->u.p.saved_type = BT_LOGICAL;
+  dtp->u.p.saved_length = length;
+  set_integer ((int *) dtp->u.p.value, v, length);
 }
 
 
-- 
GitLab