* [Patch, Fortran] PR 50547 / cleanup in resolve_formal_arglist
@ 2011-10-01 23:43 Janus Weil
2011-10-09 19:50 ` Tobias Burnus
0 siblings, 1 reply; 3+ messages in thread
From: Janus Weil @ 2011-10-01 23:43 UTC (permalink / raw)
To: gfortran, gcc-patches
[-- Attachment #1: Type: text/plain, Size: 1727 bytes --]
Hi all,
while working on PR50547, I noticed some strange things about
resolve_formal_arglist, so I decided to clean it up a little. The
attached patch does a couple of things:
(1) It removes an error message ("Unable to find a specific INTRINSIC
procedure...") which simply does not make any sense in
resolve_formal_arglist. There is just no way for procedure dummies to
be intrinsics. "svn blame" claims this code was committed by Paul in
r120296 (for PR27900):
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27900#c12
The error message was added both in resolve_actual_arglist (where it
*does* make sense), and in resolve_formal_arglist (where it doesn't).
(2) The error message "Dummy procedure ... not allowed in ELEMENTAL
procedure" is being thrown in two different places (for
functions/subroutines), which is completely unnecessary. I removed one
of them, and made sure the other is triggered for both cases. Also the
testsuite was missing a test for this case, so I added one.
(3) I reshuffled some of the code dealing with pure procedures, in
order to have it in one place.
(4) I reshuffled some of the code dealing with "attr.implicit_pure",
so that it is not so scattered around and better to understand.
During all the reshuffling I removed an early "continue" for dummy
subroutines, and as a consequence had to deal with (not) setting type
and flavor for subroutines.
Regtested on x86_64-unknown-linux-gnu. Ok for trunk?
Cheers,
Janus
2011-10-02 Janus Weil <janus@gcc.gnu.org>
PR fortran/50547
* resolve.c (resolve_formal_arglist): Remove unneeded error message.
Some reshuffling.
2011-10-02 Janus Weil <janus@gcc.gnu.org>
PR fortran/50547
* gfortran.dg/elemental_args_check_4.f90: New.
[-- Attachment #2: pr50547.diff --]
[-- Type: text/x-diff, Size: 5387 bytes --]
Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c (revision 179413)
+++ gcc/fortran/resolve.c (working copy)
@@ -269,50 +269,18 @@ resolve_formal_arglist (gfc_symbol *proc)
if (sym->attr.if_source != IFSRC_UNKNOWN)
resolve_formal_arglist (sym);
- /* F08:C1279. */
- if (gfc_pure (proc)
- && sym->attr.flavor == FL_PROCEDURE && !gfc_pure (sym))
+ if (sym->attr.subroutine || sym->attr.external)
{
- gfc_error ("Dummy procedure '%s' of PURE procedure at %L must "
- "also be PURE", sym->name, &sym->declared_at);
- continue;
+ if (sym->attr.flavor == FL_UNKNOWN)
+ gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, &sym->declared_at);
}
-
- if (sym->attr.subroutine || sym->attr.external || sym->attr.intrinsic)
+ else
{
- if (proc->attr.implicit_pure && !gfc_pure(sym))
- proc->attr.implicit_pure = 0;
-
- /* F08:C1289. */
- if (gfc_elemental (proc))
- {
- gfc_error ("Dummy procedure at %L not allowed in ELEMENTAL "
- "procedure", &sym->declared_at);
- continue;
- }
-
- if (sym->attr.function
- && sym->ts.type == BT_UNKNOWN
- && sym->attr.intrinsic)
- {
- gfc_intrinsic_sym *isym;
- isym = gfc_find_function (sym->name);
- if (isym == NULL || !isym->specific)
- {
- gfc_error ("Unable to find a specific INTRINSIC procedure "
- "for the reference '%s' at %L", sym->name,
- &sym->declared_at);
- }
- sym->ts = isym->ts;
- }
-
- continue;
+ if (sym->ts.type == BT_UNKNOWN && !proc->attr.intrinsic
+ && (!sym->attr.function || sym->result == sym))
+ gfc_set_default_type (sym, 1, sym->ns);
}
- if (sym->ts.type == BT_UNKNOWN && !proc->attr.intrinsic
- && (!sym->attr.function || sym->result == sym))
- gfc_set_default_type (sym, 1, sym->ns);
-
gfc_resolve_array_spec (sym->as, 0);
/* We can't tell if an array with dimension (:) is assumed or deferred
@@ -343,44 +311,64 @@ resolve_formal_arglist (gfc_symbol *proc)
if (sym->attr.flavor == FL_UNKNOWN)
gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, &sym->declared_at);
- if (gfc_pure (proc) && !sym->attr.pointer
- && sym->attr.flavor != FL_PROCEDURE)
+ if (gfc_pure (proc))
{
- if (proc->attr.function && sym->attr.intent != INTENT_IN)
+ if (sym->attr.flavor == FL_PROCEDURE)
{
- if (sym->attr.value)
- gfc_notify_std (GFC_STD_F2008, "Fortran 2008: Argument '%s' "
- "of pure function '%s' at %L with VALUE "
- "attribute but without INTENT(IN)", sym->name,
- proc->name, &sym->declared_at);
- else
- gfc_error ("Argument '%s' of pure function '%s' at %L must be "
- "INTENT(IN) or VALUE", sym->name, proc->name,
- &sym->declared_at);
+ /* F08:C1279. */
+ if (!gfc_pure (sym))
+ {
+ gfc_error ("Dummy procedure '%s' of PURE procedure at %L must "
+ "also be PURE", sym->name, &sym->declared_at);
+ continue;
+ }
}
-
- if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN)
+ else if (!sym->attr.pointer)
{
- if (sym->attr.value)
- gfc_notify_std (GFC_STD_F2008, "Fortran 2008: Argument '%s' "
- "of pure subroutine '%s' at %L with VALUE "
- "attribute but without INTENT", sym->name,
- proc->name, &sym->declared_at);
- else
- gfc_error ("Argument '%s' of pure subroutine '%s' at %L must "
- "have its INTENT specified or have the VALUE "
- "attribute", sym->name, proc->name, &sym->declared_at);
+ if (proc->attr.function && sym->attr.intent != INTENT_IN)
+ {
+ if (sym->attr.value)
+ gfc_notify_std (GFC_STD_F2008, "Fortran 2008: Argument '%s'"
+ " of pure function '%s' at %L with VALUE "
+ "attribute but without INTENT(IN)",
+ sym->name, proc->name, &sym->declared_at);
+ else
+ gfc_error ("Argument '%s' of pure function '%s' at %L must "
+ "be INTENT(IN) or VALUE", sym->name, proc->name,
+ &sym->declared_at);
+ }
+
+ if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN)
+ {
+ if (sym->attr.value)
+ gfc_notify_std (GFC_STD_F2008, "Fortran 2008: Argument '%s'"
+ " of pure subroutine '%s' at %L with VALUE "
+ "attribute but without INTENT", sym->name,
+ proc->name, &sym->declared_at);
+ else
+ gfc_error ("Argument '%s' of pure subroutine '%s' at %L "
+ "must have its INTENT specified or have the "
+ "VALUE attribute", sym->name, proc->name,
+ &sym->declared_at);
+ }
}
}
- if (proc->attr.implicit_pure && !sym->attr.pointer
- && sym->attr.flavor != FL_PROCEDURE)
+ if (proc->attr.implicit_pure)
{
- if (proc->attr.function && sym->attr.intent != INTENT_IN)
- proc->attr.implicit_pure = 0;
+ if (sym->attr.flavor == FL_PROCEDURE)
+ {
+ if (!gfc_pure(sym))
+ proc->attr.implicit_pure = 0;
+ }
+ else if (!sym->attr.pointer)
+ {
+ if (proc->attr.function && sym->attr.intent != INTENT_IN)
+ proc->attr.implicit_pure = 0;
- if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN)
- proc->attr.implicit_pure = 0;
+ if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN)
+ proc->attr.implicit_pure = 0;
+ }
}
if (gfc_elemental (proc))
[-- Attachment #3: elemental_args_check_4.f90 --]
[-- Type: text/x-fortran, Size: 298 bytes --]
! { dg-do compile }
!
! PR 50547: dummy procedure argument of PURE shall be PURE
!
! Contributed by Janus Weil <janus@gcc.gnu.org>
elemental function fun (sub)
interface
pure subroutine sub ! { dg-error "not allowed in elemental procedure" }
end subroutine
end interface
end function
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Patch, Fortran] PR 50547 / cleanup in resolve_formal_arglist
2011-10-01 23:43 [Patch, Fortran] PR 50547 / cleanup in resolve_formal_arglist Janus Weil
@ 2011-10-09 19:50 ` Tobias Burnus
2011-10-16 20:46 ` Janus Weil
0 siblings, 1 reply; 3+ messages in thread
From: Tobias Burnus @ 2011-10-09 19:50 UTC (permalink / raw)
To: Janus Weil; +Cc: gfortran, gcc-patches
On 02.10.2011 01:43, Janus Weil wrote:
> Hi all,
>
> while working on PR50547, I noticed some strange things about
> resolve_formal_arglist, so I decided to clean it up a little. The
> attached patch does a couple of things:
>
> Regtested on x86_64-unknown-linux-gnu. Ok for trunk?
OK. Thanks for the cleanup.
Tobias
> 2011-10-02 Janus Weil<janus@gcc.gnu.org>
>
> PR fortran/50547
> * resolve.c (resolve_formal_arglist): Remove unneeded error message.
> Some reshuffling.
>
>
> 2011-10-02 Janus Weil<janus@gcc.gnu.org>
>
> PR fortran/50547
> * gfortran.dg/elemental_args_check_4.f90: New.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Patch, Fortran] PR 50547 / cleanup in resolve_formal_arglist
2011-10-09 19:50 ` Tobias Burnus
@ 2011-10-16 20:46 ` Janus Weil
0 siblings, 0 replies; 3+ messages in thread
From: Janus Weil @ 2011-10-16 20:46 UTC (permalink / raw)
To: Tobias Burnus; +Cc: gfortran, gcc-patches
>> while working on PR50547, I noticed some strange things about
>> resolve_formal_arglist, so I decided to clean it up a little. The
>> attached patch does a couple of things:
>>
>> Regtested on x86_64-unknown-linux-gnu. Ok for trunk?
>
> OK. Thanks for the cleanup.
Thanks. Committed as r180061. (I almost forgot about this one.)
Cheers,
Janus
>> 2011-10-02 Janus Weil<janus@gcc.gnu.org>
>>
>> PR fortran/50547
>> * resolve.c (resolve_formal_arglist): Remove unneeded error
>> message.
>> Some reshuffling.
>>
>>
>> 2011-10-02 Janus Weil<janus@gcc.gnu.org>
>>
>> PR fortran/50547
>> * gfortran.dg/elemental_args_check_4.f90: New.
>
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-10-16 19:21 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-10-01 23:43 [Patch, Fortran] PR 50547 / cleanup in resolve_formal_arglist Janus Weil
2011-10-09 19:50 ` Tobias Burnus
2011-10-16 20:46 ` Janus Weil
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).