[4bsd-f77 #39] Parentheses aren't allowed in certain declarations

4.2 BSD f77 bug reports 4bsd-f77 at utah-cs.UUCP
Sun Sep 2 13:17:29 AEST 1984


From: Donn Seeley <donn at utah-cs.arpa>

Subject: Parentheses aren't allowed in certain declarations in f77
Index:	usr.bin/f77/src/f77pass1/gram.expr 4.2BSD

Description:
	The f77 standard permits the length specification of a
	CHARACTER variable in a declaration to be a constant
	expression, not just a constant, but the compiler doesn't allow
	it when the optimizer is on.  Jerry Berkman found and fixed
	this bug.

Repeat-By:
	Try to compile the following program with the optimizer on
	(program from Jerry Berkman):

	----------------------------------------------------------------
	c	get syntax error: "length must be a positive integer constant"
		character str*( 5 )
		str = 'hi there'
		print *, str
		end
	----------------------------------------------------------------

	The compiler complains and dies:

	----------------------------------------------------------------
	chdec.f:
	   MAIN:
	Error on line 2 of chdec.f: Declaration error length must be a positive integer constant

	Error.  No assembly.
	----------------------------------------------------------------

Fix:
	The problem is the useless OPPAREN operator which gets
	generated for parenthesized expressions when the optimizer is
	on.  I still haven't figured out why it is there, but it is
	clearly pointless in declarations so the following simple
	change to gram.expr turns it off:

	----------------------------------------------------------------
	*** /tmp/,RCSt1028940	Mon Aug 20 18:01:03 1984
	--- gram.expr	Sat Aug  4 21:28:00 1984
	***************
	*** 12,18
	  
	  expr:	  uexpr
		| SLPAR expr SRPAR
	! 		{ if (optimflag)
				$$ = mkexpr(OPPAREN, $2, ENULL);
			  else $$ = $2;
			}

	--- 26,32 -----
	  
	  expr:	  uexpr
		| SLPAR expr SRPAR
	! 		{ if (optimflag && parstate != INDCL)
				$$ = mkexpr(OPPAREN, $2, ENULL);
			  else $$ = $2;
			}
	----------------------------------------------------------------

	If you are annoyed by the lack of punctuation in f77's error
	message (as Jerry was), there is a fix for that, too.  Make the
	following changes to dclerr() and execerr() in error.c:

	----------------------------------------------------------------
	*** /tmp/,RCSt1028948	Mon Aug 20 18:03:12 1984
	--- error.c	Mon Aug 20 17:57:43 1984
	***************
	*** 105,111
		err(buff);
		}
	  else
	! 	errstr("Declaration error %s", s);
	  }
	  
	  

	--- 117,123 -----
		err(buff);
		}
	  else
	! 	errstr("Declaration error: %s", s);
	  }
	  
	  
	***************
	*** 115,121
	  {
	  char buf1[100], buf2[100];
	  
	! sprintf(buf1, "Execution error %s", s);
	  sprintf(buf2, buf1, n);
	  err(buf2);
	  }

	--- 127,133 -----
	  {
	  char buf1[100], buf2[100];
	  
	! sprintf(buf1, "Execution error: %s", s);
	  sprintf(buf2, buf1, n);
	  err(buf2);
	  }
	----------------------------------------------------------------

Donn Seeley    University of Utah CS Dept    donn at utah-cs.arpa
40 46' 6"N 111 50' 34"W    (801) 581-5668    decvax!utah-cs!donn



More information about the Comp.bugs.4bsd.ucb-fixes mailing list