[gfortran] PR13910 Old-style initialization of LOGICAL variables
Tobias Schlüter
tobias.schlueter@physik.uni-muenchen.de
Tue May 11 19:52:00 GMT 2004
This adds a very restricted language extension.
Bud reported that it is commonplace in some codes to initialize LOGICALs
as follows:
LOGICAL L / .TRUE. /
This patch allows this, if we're compiling with STD_GNU. Compile
testcase attached.
Bootstrapped and regtested. This has been in my tree for a while and
caused no problems.
- Tobi
2004-05-11 Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/13910
* decl.c: Update copyright years. Include system.h and flags.h.
Reorder includes to match other files.
(variable_decl): Allow old-style initialization of LOGICALS.
Index: decl.c
===================================================================
RCS file: /cvsroot/gcc/gcc/gcc/fortran/Attic/decl.c,v
retrieving revision 1.1.2.2
diff -u -p -r1.1.2.2 decl.c
--- decl.c 2 Aug 2003 00:26:48 -0000 1.1.2.2
+++ decl.c 11 May 2004 19:36:42 -0000
@@ -1,5 +1,5 @@
/* Declaration statement matcher
- Copyright (C) 2002 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004 Free Software Foundation, Inc.
Contributed by Andy Vaught
This file is part of GNU G95.
@@ -21,10 +21,14 @@ Boston, MA 02111-1307, USA. */
#include "config.h"
+#include "system.h"
+#include "flags.h"
+
+#include <string.h>
+
#include "gfortran.h"
#include "match.h"
#include "parse.h"
-#include <string.h>
/* This flag is set if a an old-style length selector is matched
@@ -556,9 +569,52 @@ variable_decl (void)
goto cleanup;
}
+ /* Allow non-standard old style initialization of the form:
+ LOGICAL l /.TRUE./
+ In order to not introduce an overly complex extension, this is
+ fairly restricted: we only allow this for non-pointer variables,
+ and only if no colon has been seen, i.e.
+ LOGICAL :: l /.TRUE./
+ is not allowed. */
+ if (!colon_seen)
+ {
+ if (gfc_match (" /") == MATCH_YES)
+ {
+ if (current_attr.pointer)
+ {
+ gfc_error("Pointer initialization at %C requires '=>'");
+ m = MATCH_ERROR;
+ goto cleanup;
+ }
+
+ m = gfc_match_init_expr (&initializer);
+ if (m == MATCH_NO)
+ {
+ gfc_error ("Expected an initialization expression at %C");
+ m = MATCH_ERROR;
+ }
+
+ if (current_attr.flavor != FL_PARAMETER && gfc_pure (NULL))
+ {
+ gfc_error
+ ("Initialization of variable at %C is not allowed in a "
+ "PURE procedure");
+ m = MATCH_ERROR;
+ }
+
+ m = gfc_match(" /");
+ if (m == MATCH_YES && pedantic)
+ if (gfc_notify_std (GFC_STD_GNU, "Extension: Old-style "
+ "initialization of LOGICAL at %C") ==
FAILURE)
+ m = MATCH_NO;
+
+ if (m != MATCH_YES)
+ goto cleanup;
+ }
+ }
/* The double colon must be present in order to have initializers.
Otherwise the statement is ambiguous with an assignment
statement. */
- if (colon_seen)
+ else
{
if (gfc_match (" =>") == MATCH_YES)
{
More information about the Gcc-patches
mailing list