/* fall through */
case OP_NEQ:
case OP_NEG:
- if (rel->op == OP_NEG &&
- (right->etype != EXPR_VALUE ||
- right->dtype->basetype == NULL ||
- right->dtype->basetype->type != TYPE_BITMASK))
- return expr_binary_error(ctx->msgs, left, right,
- "negation can only be used with singleton bitmask values");
+ if (rel->op == OP_NEG) {
+ if (left->etype == EXPR_BINOP)
+ return expr_binary_error(ctx->msgs, left, right,
+ "cannot combine negation with binary expression");
+ if (right->etype != EXPR_VALUE ||
+ right->dtype->basetype == NULL ||
+ right->dtype->basetype->type != TYPE_BITMASK)
+ return expr_binary_error(ctx->msgs, left, right,
+ "negation can only be used with singleton bitmask values");
+ }
switch (right->etype) {
case EXPR_RANGE:
tcp flags { syn, syn | ack };ok
tcp flags & (fin | syn | rst | psh | ack | urg) == { fin, ack, psh | ack, fin | psh | ack };ok
tcp flags ! fin,rst;ok
+tcp flags & (fin | syn | rst | ack) ! syn;fail
tcp window 22222;ok
tcp window 22;ok