-/* Copyright (c) 1982 Regents of the University of California */
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
-static char sccsid[] = "@(#)check.c 1.5 8/10/83";
+#ifndef lint
+static char sccsid[] = "@(#)check.c 5.2 (Berkeley) %G%";
+#endif not lint
-static char rcsid[] = "$Header: check.c,v 1.3 84/03/27 10:19:54 linton Exp $";
+static char rcsid[] = "$Header: check.c,v 1.5 84/12/26 10:38:35 linton Exp $";
/*
* Check a tree for semantic correctness.
#include "object.h"
#include "mappings.h"
#include "process.h"
+#include <signal.h>
#ifndef public
#endif
public check(p)
register Node p;
{
+ Node p1, p2;
Address addr;
Symbol f;
checkref(p);
switch (p->op) {
+ case O_ASSIGN:
+ p1 = p->value.arg[0];
+ p2 = p->value.arg[1];
+ if (varIsSet("$unsafeassign")) {
+ if (size(p1->nodetype) != size(p2->nodetype)) {
+ error("incompatible sizes");
+ }
+ } else if (not compatible(p1->nodetype, p2->nodetype)) {
+ error("incompatible types");
+ }
+ break;
+
+ case O_CATCH:
+ case O_IGNORE:
+ if (p->value.lcon < 0 or p->value.lcon > NSIG) {
+ error("invalid signal number");
+ }
+ break;
+
+ case O_CONT:
+ if (p->value.lcon != DEFSIG and (
+ p->value.lcon < 0 or p->value.lcon > NSIG)
+ ) {
+ error("invalid signal number");
+ }
+ break;
+
+ case O_DUMP:
+ if (p->value.arg[0] != nil) {
+ if (p->value.arg[0]->op == O_SYM) {
+ f = p->value.arg[0]->value.sym;
+ if (not isblock(f)) {
+ error("\"%s\" is not a block", symname(f));
+ }
+ } else {
+ beginerrmsg();
+ fprintf(stderr, "expected a symbol, found \"");
+ prtree(stderr, p->value.arg[0]);
+ fprintf(stderr, "\"");
+ enderrmsg();
+ }
+ }
+ break;
+
case O_LIST:
if (p->value.arg[0]->op == O_SYM) {
f = p->value.arg[0]->value.sym;
chkstop(p);
break;
+ case O_CALLPROC:
case O_CALL:
if (not isroutine(p->value.arg[0]->nodetype)) {
beginerrmsg();
}
break;
+ case O_WHEREIS:
+ if (p->value.arg[0]->op == O_SYM and
+ p->value.arg[0]->value.sym == nil) {
+ error("symbol not defined");
+ }
+ break;
+
default:
break;
}
b->value.sym = p;
}
}
+ } else if (
+ b->value.sym->class == VAR and
+ b->value.sym->name == b->value.sym->block->name and
+ b->value.sym->block->class == FUNC
+ ) {
+ b->value.sym = b->value.sym->block;
} else if (not isblock(b->value.sym)) {
error("\"%s\" is not a subprogram", symname(b->value.sym));
}