server/util_expr.c:781: error: INTEGER_OVERFLOW_L1
  ([-oo, 0] - 1):unsigned32.

server/util_expr.c:695:5: <LHS trace>
693.     ap_parse_node_t *current = root;
694.     const char *error = NULL;
695.     unsigned int regex = 0;
         ^
696.     const char *val;
697.     const char *lval;

server/util_expr.c:695:5: Assignment
693.     ap_parse_node_t *current = root;
694.     const char *error = NULL;
695.     unsigned int regex = 0;
         ^
696.     const char *val;
697.     const char *lval;

server/util_expr.c:781:17: Binary operation: ([-oo, 0] - 1):unsigned32
779.             if (current->right->token.type == TOKEN_RE) {
780.                 current->value = re_check(r, lval, rval, reptr);
781.                 --regex;
                     ^
782.             }
783.             else {

static int expr_eval(request_rec *r, ap_parse_node_t *root,
                     int *was_error, backref_t **reptr,
                     string_func_t string_func, opt_func_t eval_func)
{
    ap_parse_node_t *current = root;
    const char *error = NULL;
    unsigned int regex = 0;
    const char *val;
    const char *lval;
    const char *rval;
    while (current) {
        switch (current->token.type) {
        case TOKEN_STRING:
            val = PARSE_STRING(r, current->token.value);
            current->value = !!*val;
            break;
        case TOKEN_AND:
        case TOKEN_OR:
            if (!current->left || !current->right) {
                ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
                              "Invalid expression in file %s", r->filename);
                *was_error = 1;
                return 0;
            }
            if (!current->left->done) {
                switch (current->left->token.type) {
                case TOKEN_STRING:
                    lval = PARSE_STRING(r, current->left->token.value);
                    current->left->value = !!*lval;
                    DEBUG_DUMP_EVAL(ctx, current->left);
                    current->left->done = 1;
                    break;
                default:
                    current = current->left;
                    continue;
                }
            }
            if (!current->right->done && !regex &&
                ((current->token.type == TOKEN_AND && !current->left->value) ||
                (current->token.type == TOKEN_OR && current->left->value))) {
                current->value = current->left->value;
            }
            else {
                if (!current->right->done) {
                    switch (current->right->token.type) {
                    case TOKEN_STRING:
                        rval = PARSE_STRING(r,current->right->token.value);
                        current->right->value = !!*rval;
                        DEBUG_DUMP_EVAL(r, current->right);
                        current->right->done = 1;
                        break;
                    default:
                        current = current->right;
                        continue;
                    }
                }
                if (current->token.type == TOKEN_AND) {
                    current->value = current->left->value &&
                                     current->right->value;
                }
                else {
                    current->value = current->left->value ||
                                     current->right->value;
                }
            }
            break;
        case TOKEN_EQ:
        case TOKEN_NE:
            if (!current->left || !current->right ||
                current->left->token.type != TOKEN_STRING ||
                (current->right->token.type != TOKEN_STRING &&
                 current->right->token.type != TOKEN_RE)) {
                ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
                            "Invalid expression in file %s", r->filename);
                *was_error = 1;
                return 0;
            }
            lval = PARSE_STRING(r, current->left->token.value);
            rval = PARSE_STRING(r, current->right->token.value);
            if (current->right->token.type == TOKEN_RE) {
                current->value = re_check(r, lval, rval, reptr);
                --regex;
            }
            else {
                current->value = !strcmp(lval, rval);
            }
            if (current->token.type == TOKEN_NE) {
                current->value = !current->value;
            }
            break;
        case TOKEN_GE:
        case TOKEN_GT:
        case TOKEN_LE:
        case TOKEN_LT:
            if (!current->left || !current->right ||
                current->left->token.type != TOKEN_STRING ||
                current->right->token.type != TOKEN_STRING) {
                ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
                              "Invalid expression in file %s", r->filename);
                *was_error = 1;
                return 0;
            }
            lval = PARSE_STRING(r, current->left->token.value);
            rval = PARSE_STRING(r, current->right->token.value);
            current->value = strcmp(lval, rval);
            switch (current->token.type) {
            case TOKEN_GE: current->value = current->value >= 0; break;
            case TOKEN_GT: current->value = current->value >  0; break;
            case TOKEN_LE: current->value = current->value <= 0; break;
            case TOKEN_LT: current->value = current->value <  0; break;
            default: current->value = 0; break;
            }
            break;
        case TOKEN_NOT:
        case TOKEN_GROUP:
            if (current->right) {
                if (!current->right->done) {
                    current = current->right;
                    continue;
                }
                current->value = current->right->value;
            }
            else {
                current->value = 1;
            }
            if (current->token.type == TOKEN_NOT) {
                current->value = !current->value;
            }
            break;
        case TOKEN_ACCESS:
            if (eval_func) {
                *was_error = eval_func(r, current, string_func);
                if (*was_error) {
                    return 0;
                }
            }
            break;
        case TOKEN_RE:
            if (!error) {
                error = "No operator before regex in file %s";
            }
        case TOKEN_LBRACE:
            if (!error) {
                error = "Unmatched '(' in file %s";
            }
        default:
            if (!error) {
                error = "internal parser error in file %s";
            }
            ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, error, r->filename);
            *was_error = 1;
            return 0;
        }
        DEBUG_DUMP_EVAL(r, current);
        current->done = 1;
        current = current->parent;
    }
    return (root ? root->value : 0);
}
['static int expr_eval(request_rec *r, ap_parse_node_t *root,\n                     int *was_error, backref_t **reptr,\n                     string_func_t string_func, opt_func_t eval_func)\n{\n    ap_parse_node_t *current = root;\n    const char *error = NULL;\n    unsigned int regex = 0;\n    const char *val;\n    const char *lval;\n    const char *rval;\n    while (current) {\n        switch (current->token.type) {\n        case TOKEN_STRING:\n            val = PARSE_STRING(r, current->token.value);\n            current->value = !!*val;\n            break;\n        case TOKEN_AND:\n        case TOKEN_OR:\n            if (!current->left || !current->right) {\n                ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,\n                              "Invalid expression in file %s", r->filename);\n                *was_error = 1;\n                return 0;\n            }\n            if (!current->left->done) {\n                switch (current->left->token.type) {\n                case TOKEN_STRING:\n                    lval = PARSE_STRING(r, current->left->token.value);\n                    current->left->value = !!*lval;\n                    DEBUG_DUMP_EVAL(ctx, current->left);\n                    current->left->done = 1;\n                    break;\n                default:\n                    current = current->left;\n                    continue;\n                }\n            }\n            if (!current->right->done && !regex &&\n                ((current->token.type == TOKEN_AND && !current->left->value) ||\n                (current->token.type == TOKEN_OR && current->left->value))) {\n                current->value = current->left->value;\n            }\n            else {\n                if (!current->right->done) {\n                    switch (current->right->token.type) {\n                    case TOKEN_STRING:\n                        rval = PARSE_STRING(r,current->right->token.value);\n                        current->right->value = !!*rval;\n                        DEBUG_DUMP_EVAL(r, current->right);\n                        current->right->done = 1;\n                        break;\n                    default:\n                        current = current->right;\n                        continue;\n                    }\n                }\n                if (current->token.type == TOKEN_AND) {\n                    current->value = current->left->value &&\n                                     current->right->value;\n                }\n                else {\n                    current->value = current->left->value ||\n                                     current->right->value;\n                }\n            }\n            break;\n        case TOKEN_EQ:\n        case TOKEN_NE:\n            if (!current->left || !current->right ||\n                current->left->token.type != TOKEN_STRING ||\n                (current->right->token.type != TOKEN_STRING &&\n                 current->right->token.type != TOKEN_RE)) {\n                ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,\n                            "Invalid expression in file %s", r->filename);\n                *was_error = 1;\n                return 0;\n            }\n            lval = PARSE_STRING(r, current->left->token.value);\n            rval = PARSE_STRING(r, current->right->token.value);\n            if (current->right->token.type == TOKEN_RE) {\n                current->value = re_check(r, lval, rval, reptr);\n                --regex;\n            }\n            else {\n                current->value = !strcmp(lval, rval);\n            }\n            if (current->token.type == TOKEN_NE) {\n                current->value = !current->value;\n            }\n            break;\n        case TOKEN_GE:\n        case TOKEN_GT:\n        case TOKEN_LE:\n        case TOKEN_LT:\n            if (!current->left || !current->right ||\n                current->left->token.type != TOKEN_STRING ||\n                current->right->token.type != TOKEN_STRING) {\n                ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,\n                              "Invalid expression in file %s", r->filename);\n                *was_error = 1;\n                return 0;\n            }\n            lval = PARSE_STRING(r, current->left->token.value);\n            rval = PARSE_STRING(r, current->right->token.value);\n            current->value = strcmp(lval, rval);\n            switch (current->token.type) {\n            case TOKEN_GE: current->value = current->value >= 0; break;\n            case TOKEN_GT: current->value = current->value >  0; break;\n            case TOKEN_LE: current->value = current->value <= 0; break;\n            case TOKEN_LT: current->value = current->value <  0; break;\n            default: current->value = 0; break;\n            }\n            break;\n        case TOKEN_NOT:\n        case TOKEN_GROUP:\n            if (current->right) {\n                if (!current->right->done) {\n                    current = current->right;\n                    continue;\n                }\n                current->value = current->right->value;\n            }\n            else {\n                current->value = 1;\n            }\n            if (current->token.type == TOKEN_NOT) {\n                current->value = !current->value;\n            }\n            break;\n        case TOKEN_ACCESS:\n            if (eval_func) {\n                *was_error = eval_func(r, current, string_func);\n                if (*was_error) {\n                    return 0;\n                }\n            }\n            break;\n        case TOKEN_RE:\n            if (!error) {\n                error = "No operator before regex in file %s";\n            }\n        case TOKEN_LBRACE:\n            if (!error) {\n                error = "Unmatched \'(\' in file %s";\n            }\n        default:\n            if (!error) {\n                error = "internal parser error in file %s";\n            }\n            ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, error, r->filename);\n            *was_error = 1;\n            return 0;\n        }\n        DEBUG_DUMP_EVAL(r, current);\n        current->done = 1;\n        current = current->parent;\n    }\n    return (root ? root->value : 0);\n}']