+ 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;
+