This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/52101] Obsolescence warning for non-obs. feature character name*length
- From: "sgk at troutmask dot apl.washington.edu" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 03 Feb 2012 22:46:53 +0000
- Subject: [Bug fortran/52101] Obsolescence warning for non-obs. feature character name*length
- Auto-submitted: auto-generated
- References: <bug-52101-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52101
--- Comment #5 from Steve Kargl <sgk at troutmask dot apl.washington.edu> 2012-02-03 22:46:53 UTC ---
On Fri, Feb 03, 2012 at 09:16:47PM +0000, kargl at gcc dot gnu.org wrote:
> I believe that John is correct. The form 'CHARACTER*n string'
> is obsolescent while the form 'CHARACTER string*n' is not.
> From Sec 5.1 in the F2003 standard,
>
>
> R504 entity-decl is object-name [( array-spec )] [ * char-length ]
> [ initialization ]
> or function-name [ * char-length ]
This patch seems to do the right thing.
troutmask:sgk[208] cat foo.f90
program foo
character*10 s
character t*10
s = 'foo'
t = 'bar'
end program foo
troutmask:sgk[209] gfc4x -c foo.f90
troutmask:sgk[210] gfc4x -c -std=f95 foo.f90
foo.f90:2.15:
character*10 s
1
Warning: Obsolescent feature: Old-style character length at (1)
Index: decl.c
===================================================================
--- decl.c (revision 183872)
+++ decl.c (working copy)
@@ -722,7 +722,7 @@ syntax:
char_len_param_value in parenthesis. */
static match
-match_char_length (gfc_expr **expr, bool *deferred)
+match_char_length (gfc_expr **expr, bool *deferred, bool entity_decl)
{
int length;
match m;
@@ -738,7 +738,8 @@ match_char_length (gfc_expr **expr, bool
if (m == MATCH_YES)
{
- if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: "
+ if (entity_decl
+ && gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: "
"Old-style character length at %C") == FAILURE)
return MATCH_ERROR;
*expr = gfc_get_int_expr (gfc_default_integer_kind, NULL, length);
@@ -1845,7 +1846,7 @@ variable_decl (int elem)
if (current_ts.type == BT_CHARACTER)
{
- switch (match_char_length (&char_len, &cl_deferred))
+ switch (match_char_length (&char_len, &cl_deferred, false))
{
case MATCH_YES:
cl = gfc_new_charlen (gfc_current_ns, NULL);
@@ -2407,7 +2408,7 @@ gfc_match_char_spec (gfc_typespec *ts)
/* Try the old-style specification first. */
old_char_selector = 0;
- m = match_char_length (&len, &deferred);
+ m = match_char_length (&len, &deferred, true);
if (m != MATCH_NO)
{
if (m == MATCH_YES)