[net.lang.f77] possible implied-do bug?

kenkel@mcnc.UUCP (Stephen Kenkel) (06/24/86)

The following program compiles under VMS fortran, but not
f77:

	  dimension l(10),m(10),n(10)
          write (*, * ) i,((l(k), m(k), n (k)), k=1,10)
	  end

This version works:

	  dimension l(10),m(10),n(10)
          write (*, * ) i,(l(k), m(k), n (k), k=1,10)
	  end

The extra parenthesis around the items in the implied do list
appears to be causing trouble.  Is this a bug, or is the compiler
in compliance with the standard?

Thanks.

ark@alice.UucP (Andrew Koenig) (06/25/86)

> The following program compiles under VMS fortran, but not
> f77:
>
>	  dimension l(10),m(10),n(10)
>          write (*, * ) i,((l(k), m(k), n (k)), k=1,10)
>	  end
>
> This version works:
>
>	  dimension l(10),m(10),n(10)
>          write (*, * ) i,(l(k), m(k), n (k), k=1,10)
>	  end
>
> The extra parenthesis around the items in the implied do list
> appears to be causing trouble.  Is this a bug, or is the compiler
> in compliance with the standard?
>
> Thanks.

The compiler is in compliance with the standard.

The list of expressions in an implied DO must not be parenthesized.
Otherwise there would be an ambiguity:

	write (*,*) ((3.0,4.0), k = 1, n)

Does this print ten alternating repetitions of 3.0 and 4.0,
or is (3.0,4.0) a complex constant?

steved@sun.uucp (Steve Dever) (06/25/86)

In article <1452@alvin.mcnc.UUCP> kenkel@mcnc.UUCP (Stephen Kenkel) writes:
>The following program compiles under VMS fortran, but not
>f77:
>
>	  dimension l(10),m(10),n(10)
>          write (*, * ) i,((l(k), m(k), n (k)), k=1,10)
>	  end
>

The ANSI FORTRAN standard (section 12.8.2.3) states that an implied DO list
has the form:

     (dlist, i = e1, e2 [, e3])

where dlist is an input/output list.
The standard does not allow an extra set of parentheses around
an I/O list in a READ or WRITE statement so the compiler is correct in not
accepting them.  This was allowed in the FORTRAN-66 standard but was removed
to eliminate the syntactic conflict with complex constants in a list-directed
output list.

Steve Dever (sun!steved)

steve@jplgodo.UUCP (06/26/86)

In article <1452@alvin.mcnc.UUCP>, kenkel@mcnc.UUCP (Stephen Kenkel) writes:
> The following program compiles under VMS fortran, but not f77:
> 
> 	  dimension l(10),m(10),n(10)
>           write (*, * ) i,((l(k), m(k), n (k)), k=1,10)
> 	  end
> 
> This version works:
> 
> 	  dimension l(10),m(10),n(10)
>           write (*, * ) i,(l(k), m(k), n (k), k=1,10)
> 	  end
> 
> The extra parenthesis around the items in the implied do list
> appears to be causing trouble.  Is this a bug, or is the compiler
> in compliance with the standard?

It looks like f77 is complying with the standard and VMS Fortran has relaxed
the requirements.  Quoting from the ANSI standard:

	12.8.2.3 Implied-DO List.  An implied-DO list if of the form:

		( dlist, i = e1, e2 [,e3] )

	where: i, e1, e2, and e3 are as specified for the DO statement (11.10)

		dlist is an input/output list

	.......

	12.8.2 Input/Ouput List.  .....

	An input/output list is a list (2.10) of input/output list items and
	implied-DO lists (12.8.2.3).  An input/output list item is either an
	input list item or an output list item.

	.....

	12.8.2.2 Output list items.  An output list item must be one of the
	following:

		(1) A variable name
		(2) An array element name
		(3) A character substring name
		(4) An array name
		(5) Any other expression except a character expression
		involving concatenation of an operand whose length
		specification is an asterisk in parentheses unless the
		operand is the symbolic name of a constant.

	Note that a constant, an expression involving operators or function
	references, or an expression enclosed in parentheses may appear as
	an output list item but must not appear as an input list item.

	2.10 List

	A list is a nonempty sequence (2.1) of syntactic entities seperated
	by commas.  The entities in the list are called list items.


Essentially, the stuff after the ( in an implied-DO list before the indexing
information must be a valid I/O list.  The only time parentheses are allowed
in an I/O list is surrounding an expression or surrounding an implied-DO list.
A sequence of things seperated by commas is certainly not a valid Fortran
expression.  Since there is no loop index information given, it is not a
valid implied-DO list either.  Therefore it is not a valid I/O list item.

Editorial remark:
It has been my experience that VMS Fortran is *very* liberal in what it
will accept as valid Fortran.  If you care at all about being portable, get
a copy of the ANSI standard and throw away your vendor's manuals.  The other
recommendation I would make is to always use the /STANDARD qualifier when
you compile on a VAX.  This should flag most of the non-standard extensions
you are using.  I don't know how picky this is on a VAX since all of my
developement work is done on a Ridge but it should help.

-- 

...smeagol\			Steve Schlaifer
......wlbr->!jplgodo!steve	Advance Projects Group, Jet Propulsion Labs
....logico/			4800 Oak Grove Drive, M/S 156/204
				Pasadena, California, 91109
					+1 818 354 3171

cathy@comp.lancs.ac.uk (Cathy) (07/01/86)

In article <1452@alvin.mcnc.UUCP> kenkel@mcnc.UUCP writes:
>The following program compiles under VMS fortran, but not
>f77:
>
>	  dimension l(10),m(10),n(10)
>          write (*, * ) i,((l(k), m(k), n (k)), k=1,10)
>	  end
>
>This version works:
>
	...
>
>The extra parenthesis around the items in the implied do list
>appears to be causing trouble.  Is this a bug, or is the compiler
>in compliance with the standard?
>

	The compiler seems to agree with the standard. The syntax is:

io_implied_do_list
	:	"(" io_list "," id "=" exp "," exp [ "," exp ] ")"
	;
io_list
	:	io_entity ( "," io_entity )*
	;

io_entity
	:	array_variable
	|	io_implied_do_list
	;

	The extra bracket would imply an internal io_implied_do_list.

		Best wishes,
			Cathy

-- 

	 - Marxist unite!
	 - Leaders unite!
	 - Bad-spellers of the of the world untie!
  
UUCP:  ...!seismo!mcvax!ukc!dcl-cs!cathy
DARPA: cathy%lancs.comp@ucl-cs	| Post: University of Lancaster,
JANET: cathy@uk.ac.lancs.comp	|	Department of Computing,
Phone: +44 524 65201 ext ????	|	Bailrigg, Lancaster, LA1 4YR, UK.