fixed some bugs:

- switch with BIG difference between lower and upper now handled correctly
- made sure an added error production is never chosen as the default one
- don't allow AUTO as specification for a parameter
This commit is contained in:
ceriel 1987-10-05 10:17:44 +00:00
parent 8fb2664584
commit efcb9468f4
7 changed files with 25 additions and 10 deletions

View file

@ -86,3 +86,5 @@ tokenname.c
tokenname.h tokenname.h
type.c type.c
type.str type.str
util.str
util.c

View file

@ -10,7 +10,7 @@ CID = $(EMHOME)/bin/cid
# Libraries and EM interface definitions # Libraries and EM interface definitions
SYSLIB = $(EMHOME)/modules/lib/libsystem.a SYSLIB = $(EMHOME)/modules/lib/libsystem.a
EMKLIB = $(EMHOME)/modules/lib/libemk.a EMKLIB = $(EMHOME)/modules/lib/libemk.a
EMELIB = $(EMHOME)/modules/lib/libeme.a EMELIB = $(EMHOME)/modules/lib/libeme.a $(EMHOME)/lib/em_data.a
STRLIB = $(EMHOME)/modules/lib/libstring.a STRLIB = $(EMHOME)/modules/lib/libstring.a
PRTLIB = $(EMHOME)/modules/lib/libprint.a PRTLIB = $(EMHOME)/modules/lib/libprint.a
EMMESLIB = $(EMHOME)/modules/lib/libem_mes.a EMMESLIB = $(EMHOME)/modules/lib/libem_mes.a

View file

@ -13,7 +13,7 @@ LINT = /usr/new/lint
# Libraries and EM interface definitions # Libraries and EM interface definitions
SYSLIB = $(EMHOME)/modules/lib/libsystem.a SYSLIB = $(EMHOME)/modules/lib/libsystem.a
EMKLIB = $(EMHOME)/modules/lib/libemk.a EMKLIB = $(EMHOME)/modules/lib/libemk.a
EMELIB = $(EMHOME)/modules/lib/libeme.a EMELIB = $(EMHOME)/modules/lib/libeme.a $(EMHOME)/lib/em_data.a
STRLIB = $(EMHOME)/modules/lib/libstring.a STRLIB = $(EMHOME)/modules/lib/libstring.a
PRTLIB = $(EMHOME)/modules/lib/libprint.a PRTLIB = $(EMHOME)/modules/lib/libprint.a
EMMESLIB = $(EMHOME)/modules/lib/libem_mes.a EMMESLIB = $(EMHOME)/modules/lib/libem_mes.a

View file

@ -120,14 +120,17 @@ type_specifier(struct type **tpp;)
; ;
single_type_specifier(register struct decspecs *ds;): single_type_specifier(register struct decspecs *ds;):
TYPE_IDENTIFIER /* this includes INT, CHAR, etc. */ %default TYPE_IDENTIFIER /* this includes INT, CHAR, etc. */
{idf2type(dot.tk_idf, &ds->ds_type);} {idf2type(dot.tk_idf, &ds->ds_type);}
| |
IDENTIFIER IDENTIFIER
{error("%s is not a type identifier", dot.tk_idf->id_text); {
error("%s is not a type identifier", dot.tk_idf->id_text);
ds->ds_type = error_type;
if (dot.tk_idf->id_def) {
dot.tk_idf->id_def->df_type = error_type; dot.tk_idf->id_def->df_type = error_type;
dot.tk_idf->id_def->df_sc = TYPEDEF; dot.tk_idf->id_def->df_sc = TYPEDEF;
ds->ds_type = error_type; }
} }
| |
struct_or_union_specifier(&ds->ds_type) struct_or_union_specifier(&ds->ds_type)

View file

@ -40,7 +40,7 @@ do_decspecs(ds)
} }
if (level == L_FORMAL2) { if (level == L_FORMAL2) {
if (ds->ds_sc_given && ds->ds_sc != AUTO && if (ds->ds_sc_given &&
ds->ds_sc != REGISTER){ ds->ds_sc != REGISTER){
extern char *symbol2str(); extern char *symbol2str();
error("%s formal illegal", symbol2str(ds->ds_sc)); error("%s formal illegal", symbol2str(ds->ds_sc));

View file

@ -242,7 +242,7 @@ do_include()
inctable[0] = WorkingDir; inctable[0] = WorkingDir;
if (filenm) { if (filenm) {
if (!InsertFile(filenm, &inctable[tok==FILESPECIFIER],&result)){ if (!InsertFile(filenm, &inctable[tok==FILESPECIFIER],&result)){
fatal("cannot find include file \"%s\"", filenm); fatal("cannot open include file \"%s\"", filenm);
} }
else { else {
WorkingDir = getwdir(result); WorkingDir = getwdir(result);

View file

@ -24,7 +24,17 @@
extern char options[]; extern char options[];
#define compact(nr, low, up) (nr != 0 && (up - low) / nr <= (DENSITY - 1)) compact(nr, low, up)
arith low, up;
{
/* Careful! up - low might not fit in an arith. And then,
the test "up-low < 0" might also not work to detect this
situation! Or is this just a bug in the M68020/M68000?
*/
arith diff = up - low;
return (nr != 0 && diff >= 0 && diff / nr <= (DENSITY - 1));
}
static struct switch_hdr *switch_stack = 0; static struct switch_hdr *switch_stack = 0;