diff mbox

[Fortran] Add Fortran 2008 obsolescent support for ENTRY

Message ID 4C2314FA.2000407@net-b.de
State New
Headers show

Commit Message

Tobias Burnus June 24, 2010, 8:19 a.m. UTC
On 06/24/2010 12:19 AM, Steve Kargl wrote:
> On Wed, Jun 23, 2010 at 11:38:41PM +0200, Tobias Burnus wrote:
>   
>> Fortran 2008 declares ENTRY as obsolescent. This patch adds the required
>> diagnostics for -std=f2008; with -std=f95/f2003/gnu/legacy it is still
>> supported - with -std=f2008 a warning is printed.
>>
>> Build and currently regtesting on x86-64-linux. If it succeeds:
>>     

It didn't succeed...

> +#define GFC_STD_F2008_OBS      (1<<7)  /* Obsolescent in F2008.  */
> +#define GFC_STD_F2008          (1<<7)  /* New in F2008.  */
>
> Shouldn't one of these be (1<<8)?
>   
Well spotted! And indeed it should be "1<<8" - otherwise one gets
warnings with -std=f2003 for F2008 constructs. However, this change is
not enough. A check in libgfortran assumed that "-std=f2003 < std_gnu"
which is wrong for bit patterns. Fixed that one as well.

Build and successfully regtested on x86-84-linux.
OK for the trunk?

Tobias

Comments

Jerry DeLisle June 24, 2010, 1:40 p.m. UTC | #1
On 06/24/2010 01:19 AM, Tobias Burnus wrote:
> On 06/24/2010 12:19 AM, Steve Kargl wrote:
>> On Wed, Jun 23, 2010 at 11:38:41PM +0200, Tobias Burnus wrote:
>>
>>> Fortran 2008 declares ENTRY as obsolescent. This patch adds the required
>>> diagnostics for -std=f2008; with -std=f95/f2003/gnu/legacy it is still
>>> supported - with -std=f2008 a warning is printed.
>>>
>>> Build and currently regtesting on x86-64-linux. If it succeeds:
>>>
>
> It didn't succeed...
>
>> +#define GFC_STD_F2008_OBS      (1<<7)  /* Obsolescent in F2008.  */
>> +#define GFC_STD_F2008          (1<<7)  /* New in F2008.  */
>>
>> Shouldn't one of these be (1<<8)?
>>
> Well spotted! And indeed it should be "1<<8" - otherwise one gets
> warnings with -std=f2003 for F2008 constructs. However, this change is
> not enough. A check in libgfortran assumed that "-std=f2003<  std_gnu"
> which is wrong for bit patterns. Fixed that one as well.

I wonder if there are other places where we did not use the std_gnu correctly 
and we just don't see a problem yet.  Several times in the past on IRC the 
subject has come up about how to use that.

Jerry

Jerry
diff mbox

Patch

2010-06-24  Tobias Burnus  <burnus@net-b.de>

	* decl.c (gfc_match_entry): Mark ENTRY as GFC_STD_F2008_OBS.
	* gfortran.texi (_gfortran_set_options): Update for
	GFC_STD_F2008_OBS addition.
	* libgfortran.h: Add GFC_STD_F2008_OBS.
	* options.c (set_default_std_flags,gfc_handle_option): Handle
	GFC_STD_F2008_OBS.

2010-06-24  Tobias Burnus  <burnus@net-b.de>

	* runtime/compile_options.c (init_compile_options): Update
	compile_options.allow_std for GFC_STD_F2008_OBS.
	* io/transfer.c (formatted_transfer_scalar_read,
	formatted_transfer_scalar_write

2010-06-24  Tobias Burnus  <burnus@net-b.de>

	* gfortran.dg/entry_19.f90: New.


Index: gcc/fortran/decl.c
===================================================================
--- gcc/fortran/decl.c	(revision 161310)
+++ gcc/fortran/decl.c	(working copy)
@@ -4963,6 +4963,10 @@  gfc_match_entry (void)
   if (m != MATCH_YES)
     return m;
 
+  if (gfc_notify_std (GFC_STD_F2008_OBS, "Fortran 2008 obsolescent feature: "
+		      "ENTRY statement at %C") == FAILURE)
+    return MATCH_ERROR;
+
   state = gfc_current_state ();
   if (state != COMP_SUBROUTINE && state != COMP_FUNCTION)
     {
Index: gcc/fortran/gfortran.texi
===================================================================
--- gcc/fortran/gfortran.texi	(revision 161310)
+++ gcc/fortran/gfortran.texi	(working copy)
@@ -2335,9 +2335,10 @@  if e.g. an input-output edit descriptor
 Possible values are (bitwise or-ed) @code{GFC_STD_F77} (1),
 @code{GFC_STD_F95_OBS} (2), @code{GFC_STD_F95_DEL} (4), @code{GFC_STD_F95}
 (8), @code{GFC_STD_F2003} (16), @code{GFC_STD_GNU} (32),
-@code{GFC_STD_LEGACY} (64), and @code{GFC_STD_F2008} (128).
-Default: @code{GFC_STD_F95_OBS | GFC_STD_F95_DEL | GFC_STD_F2003
-| GFC_STD_F2008 | GFC_STD_F95 | GFC_STD_F77 | GFC_STD_GNU | GFC_STD_LEGACY}.
+@code{GFC_STD_LEGACY} (64), @code{GFC_STD_F2008} (128), and
+@code{GFC_STD_F2008_OBS} (256).  Default: @code{GFC_STD_F95_OBS
+| GFC_STD_F95_DEL | GFC_STD_F95 | GFC_STD_F2003 | GFC_STD_F2008
+| GFC_STD_F2008_OBS | GFC_STD_F77 | GFC_STD_GNU | GFC_STD_LEGACY}.
 @item @var{option}[1] @tab Standard-warning flag; prints a warning to
 standard error. Default: @code{GFC_STD_F95_DEL | GFC_STD_LEGACY}.
 @item @var{option}[2] @tab If non zero, enable pedantic checking.
Index: gcc/fortran/libgfortran.h
===================================================================
--- gcc/fortran/libgfortran.h	(revision 161310)
+++ gcc/fortran/libgfortran.h	(working copy)
@@ -23,15 +23,16 @@  along with GCC; see the file COPYING3.
    Note that no features were obsoleted nor deleted in F2003.
    Please remember to keep those definitions in sync with
    gfortran.texi.  */
-#define GFC_STD_F2008	(1<<7)	/* New in F2008.  */
-#define GFC_STD_LEGACY	(1<<6)	/* Backward compatibility.  */
-#define GFC_STD_GNU	(1<<5)	/* GNU Fortran extension.  */
-#define GFC_STD_F2003	(1<<4)	/* New in F2003.  */
-#define GFC_STD_F95	(1<<3)	/* New in F95.  */
-#define GFC_STD_F95_DEL	(1<<2)	/* Deleted in F95.  */
-#define GFC_STD_F95_OBS	(1<<1)	/* Obsolescent in F95.  */
-#define GFC_STD_F77	(1<<0)	/* Included in F77, but not deleted or
-				   obsolescent in later standards.  */
+#define GFC_STD_F2008_OBS	(1<<8)	/* Obsolescent in F2008.  */
+#define GFC_STD_F2008		(1<<7)	/* New in F2008.  */
+#define GFC_STD_LEGACY		(1<<6)	/* Backward compatibility.  */
+#define GFC_STD_GNU		(1<<5)	/* GNU Fortran extension.  */
+#define GFC_STD_F2003		(1<<4)	/* New in F2003.  */
+#define GFC_STD_F95		(1<<3)	/* New in F95.  */
+#define GFC_STD_F95_DEL		(1<<2)	/* Deleted in F95.  */
+#define GFC_STD_F95_OBS		(1<<1)	/* Obsolescent in F95.  */
+#define GFC_STD_F77		(1<<0)	/* Included in F77, but not deleted or
+					   obsolescent in later standards.  */
 
 
 /* Bitmasks for the various FPE that can be enabled.  */
Index: gcc/fortran/options.c
===================================================================
--- gcc/fortran/options.c	(revision 161310)
+++ gcc/fortran/options.c	(working copy)
@@ -48,7 +48,7 @@  set_default_std_flags (void)
 {
   gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
     | GFC_STD_F2003 | GFC_STD_F2008 | GFC_STD_F95 | GFC_STD_F77
-    | GFC_STD_GNU | GFC_STD_LEGACY;
+    | GFC_STD_F2008_OBS | GFC_STD_GNU | GFC_STD_LEGACY;
   gfc_option.warn_std = GFC_STD_F95_DEL | GFC_STD_LEGACY;
 }
 
@@ -857,7 +857,8 @@  gfc_handle_option (size_t scode, const c
       break;
 
     case OPT_std_f95:
-      gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95 | GFC_STD_F77;
+      gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95 | GFC_STD_F77
+			     | GFC_STD_F2008_OBS;
       gfc_option.warn_std = GFC_STD_F95_OBS;
       gfc_option.max_continue_fixed = 19;
       gfc_option.max_continue_free = 39;
@@ -868,7 +869,7 @@  gfc_handle_option (size_t scode, const c
 
     case OPT_std_f2003:
       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F77 
-	| GFC_STD_F2003 | GFC_STD_F95;
+	| GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F2008_OBS;
       gfc_option.warn_std = GFC_STD_F95_OBS;
       gfc_option.max_identifier_length = 63;
       gfc_option.warn_ampersand = 1;
@@ -877,8 +878,8 @@  gfc_handle_option (size_t scode, const c
 
     case OPT_std_f2008:
       gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F77 
-	| GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F2008;
-      gfc_option.warn_std = GFC_STD_F95_OBS;
+	| GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F2008 | GFC_STD_F2008_OBS;
+      gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F2008_OBS;
       gfc_option.max_identifier_length = 63;
       gfc_option.warn_ampersand = 1;
       gfc_option.warn_tabs = 0;
Index: libgfortran/runtime/compile_options.c
===================================================================
--- libgfortran/runtime/compile_options.c	(revision 161310)
+++ libgfortran/runtime/compile_options.c	(working copy)
@@ -1,7 +1,7 @@ 
 /* Handling of compile-time options that influence the library.
-   Copyright (C) 2005, 2007, 2009 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
 
-This file is part of the GNU Fortran 95 runtime library (libgfortran).
+This file is part of the GNU Fortran runtime library (libgfortran).
 
 Libgfortran is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -138,7 +138,7 @@  init_compile_options (void)
   compile_options.warn_std = GFC_STD_F95_DEL | GFC_STD_LEGACY;
   compile_options.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
     | GFC_STD_F2003 | GFC_STD_F2008 | GFC_STD_F95 | GFC_STD_F77
-    | GFC_STD_GNU | GFC_STD_LEGACY;
+    | GFC_STD_F2008_OBS | GFC_STD_GNU | GFC_STD_LEGACY;
   compile_options.pedantic = 0;
   compile_options.dump_core = 0;
   compile_options.backtrace = 0;
Index: libgfortran/io/transfer.c
===================================================================
--- libgfortran/io/transfer.c	(revision 161310)
+++ libgfortran/io/transfer.c	(working copy)
@@ -4,7 +4,7 @@ 
    Namelist transfer functions contributed by Paul Thomas
    F2003 I/O support contributed by Jerry DeLisle
 
-This file is part of the GNU Fortran 95 runtime library (libgfortran).
+This file is part of the GNU Fortran runtime library (libgfortran).
 
 Libgfortran is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -1042,7 +1042,7 @@  formatted_transfer_scalar_read (st_param
 	case FMT_B:
 	  if (n == 0)
 	    goto need_read_data;
-	  if (compile_options.allow_std < GFC_STD_GNU
+	  if (!(compile_options.allow_std & GFC_STD_GNU)
               && require_type (dtp, BT_INTEGER, type, f))
 	    return;
 	  read_radix (dtp, f, p, kind, 2);
@@ -1051,7 +1051,7 @@  formatted_transfer_scalar_read (st_param
 	case FMT_O:
 	  if (n == 0)
 	    goto need_read_data; 
-	  if (compile_options.allow_std < GFC_STD_GNU
+	  if (!(compile_options.allow_std & GFC_STD_GNU)
               && require_type (dtp, BT_INTEGER, type, f))
 	    return;
 	  read_radix (dtp, f, p, kind, 8);
@@ -1060,7 +1060,7 @@  formatted_transfer_scalar_read (st_param
 	case FMT_Z:
 	  if (n == 0)
 	    goto need_read_data;
-	  if (compile_options.allow_std < GFC_STD_GNU
+	  if (!(compile_options.allow_std & GFC_STD_GNU)
               && require_type (dtp, BT_INTEGER, type, f))
 	    return;
 	  read_radix (dtp, f, p, kind, 16);
@@ -1443,7 +1443,7 @@  formatted_transfer_scalar_write (st_para
 	case FMT_B:
 	  if (n == 0)
 	    goto need_data;
-	  if (compile_options.allow_std < GFC_STD_GNU
+	  if (!(compile_options.allow_std & GFC_STD_GNU)
               && require_type (dtp, BT_INTEGER, type, f))
 	    return;
 	  write_b (dtp, f, p, kind);
@@ -1452,7 +1452,7 @@  formatted_transfer_scalar_write (st_para
 	case FMT_O:
 	  if (n == 0)
 	    goto need_data; 
-	  if (compile_options.allow_std < GFC_STD_GNU
+	  if (!(compile_options.allow_std & GFC_STD_GNU)
               && require_type (dtp, BT_INTEGER, type, f))
 	    return;
 	  write_o (dtp, f, p, kind);
@@ -1461,7 +1461,7 @@  formatted_transfer_scalar_write (st_para
 	case FMT_Z:
 	  if (n == 0)
 	    goto need_data;
-	  if (compile_options.allow_std < GFC_STD_GNU
+	  if (!(compile_options.allow_std & GFC_STD_GNU)
               && require_type (dtp, BT_INTEGER, type, f))
 	    return;
 	  write_z (dtp, f, p, kind);
Index: gcc/testsuite/gfortran.dg/entry_19.f90
===================================================================
--- gcc/testsuite/gfortran.dg/entry_19.f90	(revision 0)
+++ gcc/testsuite/gfortran.dg/entry_19.f90	(revision 0)
@@ -0,0 +1,9 @@ 
+! { dg-do compile }
+! { dg-options "-std=f2008" }
+! 
+!
+! Entry is obsolete in Fortran 2008
+!
+subroutine foo()
+entry bar() ! { dg-error "Fortran 2008 obsolescent feature: ENTRY" }
+end