F77 Error Handling Bugs

goldberg at uiucdcs.CS.UIUC.EDU goldberg at uiucdcs.CS.UIUC.EDU
Wed Dec 4 05:11:00 AEST 1985


>From stevea at uiphysed.CSO.UIUC.EDU Mon Nov 25 12:58:01 1985
Date: Mon, 25 Nov 85 12:52:16 cst
From: stevea at uiphysed.CSO.UIUC.EDU (Steve Alexander)
To: goldberg at uiucdcs
Subject: f77 bugs (please post to bugs.2bsd)

Subject: A couple of bugs in f77 error handling.

Index:	src/cmd/f77/{gram.head, error.c} 2.9BSD Fix

Description:

	1)    Yacc errors (usually syntax errors) do not display
	   a line number, and cause compilation to abort.

	2)    Fatal compiler errors do not display the type of error.
	   This is because f77pass1 exits before it has a chance to 
	   print the arguments to the error() call.

Repeat-By:

	#1 can be reproduced by compiling any program that contains
	a continuation character after a tab, rather than after 5 spaces.

      <tab>program t
      <tab>character*1
      <tab>+ foo
      <tab>stop
      <tab>end

	-----------------------
	#2 is hard to do on demand.  I got it by compiling a very
	large program with the distributed compiler.

Fix:

	1) Apply the following diffs to gram.head

*** gram.head.dist	Tue Nov 12 17:07:35 1985
--- gram.head	Tue Nov 12 21:09:41 1985
***************
*** 3,9
  #include "string_defs"
  
  #ifdef	C_OVERLAY
! #define	yyerror(x)	{fprintf(diagfile, "%s\n", x); done(3); exit(3);}
  #else
  #define	yyerror(x)	error(x, 0, 0, FATAL)
  #endif

--- 3,10 -----
  #include "string_defs"
  
  #ifdef	C_OVERLAY
! #define	yyerror(x)	{fprintf(diagfile, "Error on line %d of %s: %s\n",\
! 				lineno,infname,x); nerr++;}
  #else
  #define	yyerror(x)	error(x, 0, 0, YYERR)
  #endif
***************
*** 5,11
  #ifdef	C_OVERLAY
  #define	yyerror(x)	{fprintf(diagfile, "%s\n", x); done(3); exit(3);}
  #else
! #define	yyerror(x)	error(x, 0, 0, FATAL)
  #endif
  
  static int nstars;

--- 6,12 -----
  #define	yyerror(x)	{fprintf(diagfile, "Error on line %d of %s: %s\n",\
  				lineno,infname,x); nerr++;}
  #else
! #define	yyerror(x)	error(x, 0, 0, YYERR)
  #endif
  
  static int nstars;

	2) Apply the following diffs to error.c

*** error.c.dist	Tue Nov 12 21:11:28 1985
--- error.c	Tue Nov 12 21:18:43 1985
***************
*** 42,47
  
  	    case FATAL1:
  	    case FATAL:
  		fprintf(diagfile,"f77 compiler error line %d of %s: ", lineno, infname);
  		if(debugflag)
  			abort();

--- 42,51 -----
  
  	    case FATAL1:
  	    case FATAL:
+ 		if (buf[0] != '\0') {
+ 			fprintf(diagfile, buf, t, u);
+ 			fprintf(diagfile, "\n");
+ 		}
  		fprintf(diagfile,"f77 compiler error line %d of %s: ", lineno, infname);
  		if(debugflag)
  			abort();
***************
*** 94,99
  
  	    case FATAL1:
  	    case FATAL:
  		fprintf(diagfile,"f77 compiler error line %d of %s: ", lineno, infname);
  		if(debugflag)
  			abort();

--- 98,107 -----
  
  	    case FATAL1:
  	    case FATAL:
+ 		if (str != NULL) {
+ 			fprintf(diagfile, str, t, u);
+ 			fprintf(diagfile, "\n");
+ 		}
  		fprintf(diagfile,"f77 compiler error line %d of %s: ", lineno, infname);
  		if(debugflag)
  			abort();



More information about the Comp.bugs.2bsd mailing list