This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
Re: [fortran, patch] Fix conflict detesction for VOLATILE attribute (PR30520)
- From: Brooks Moses <brooks dot moses at codesourcery dot com>
- To: fortran at gcc dot gnu dot org
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sat, 20 Jan 2007 19:12:21 -0800
- Subject: Re: [fortran, patch] Fix conflict detesction for VOLATILE attribute (PR30520)
- References: <45B2C6CD.9000108@net-b.de>
A few comments on this, mostly on wording in the comments and error
messages:
Tobias Burnus wrote:
+ /* C1232 (R1221) For an actual argument which is an array sections or
+ an assumed-shaped array, the dummy argument shall be an assumed-
+ shaped array, if the dummy argument has the VOLATILE attribute. */
s/sections/section/
+
+ if (f->sym->attr.volatile_
+ && ((a->expr->symtree->n.sym->as
+ && a->expr->symtree->n.sym->as->type == AS_ASSUMED_SHAPE)
+ ||(a->expr->ref && a->expr->ref->u.ar.type == AR_SECTION))
+ && !(f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
+ {
+ if (where)
+ gfc_error ("Assumed-shaped or array-section actual argument at "
+ "%L is incompatible with the non-assumed-shaped "
+ "dummy argument '%s' due to VOLATILE attribute",
+ &a->expr->where,f->sym->name);
+ return 0;
+ }
This should be "assumed-shape", not "assumed-shaped", throughout.
I think this might also be somewhat clearer, both in the code and in the
error message, if it was broken apart into one check for an
assumed-shape actual argument and a second check for an array-section
actual argument. I was having a fairly hard time following the logic in
the "if" statement.
+ /* C1233 (R1221) For an actual argument which is a pointer array, the
+ dummy argument shall be an assumed-shaped or pointer array, if the
+ dummy argument has the VOLATILE attribute. */
+
+ if (f->sym->attr.volatile_
+ && (a->expr->symtree->n.sym->attr.pointer
+ && a->expr->symtree->n.sym->as)
+ && !(f->sym->as && (f->sym->as->type == AS_ASSUMED_SHAPE
+ || f->sym->attr.pointer)))
Either your indentation or your parentheses are incorrect here, on those
last two lines; the "||" currently goes with the grouping after
"f->sym->as &&".
Also, it looks like you've got some problems with spaces in place of
tabs in some of those indents, both here and in the previous piece.
+ {
+ if (where)
+ gfc_error ("Pointer-array actual argument at %L is incompatible "
+ "with the neither assumed-shaped nor pointer array "
+ "dummy argument '%s' due to VOLATILE attribute",
+ &a->expr->where,f->sym->name);
+ return 0;
+ }
I think I would suggest wording that as "Pointer-array actual argument
at %L requires an assumed-shape or pointer-array dummy argument".
[...]
--- 877,890 ----
gfc_add_volatile (symbol_attribute * attr, const char *name, locus * where)
{
! /* No check_used needed as 11.2.1 of the F2003 standard allows
! that the local identifier, made accessible by a use statment, can be
! given a VOLATILE attribute. */
s/accessible/accessable/
s/statment/statement/
Also, I think that would be better without the commas.
[...]
--- 4221,4229 ----
for(;;)
{
! /* VOLATILE is special by allowing to locally overwrite the attribute
! of host-associated symbols. */
This isn't overwriting, so much as adding -- it can't be subtracted.
Maybe: "VOLATILE is special because it can be added to host-associated
symbols locally"?
Other than that, this all looks OK to me, but I'm not a maintainer.
- Brooks