pike.git / src / pike_types.cmod

version» Context lines:

pike.git/src/pike_types.cmod:12709:    goto loop;    }    if (!(tmp = get_first_arg_type(fun_type->cdr, flags))) {    break;    }    res = or_pike_types(tmp2 = res, tmp, 1);    free_type(tmp);    free_type(tmp2);    break;    case T_AND: -  if (!(res = get_first_arg_type(fun_type->car, flags))) { +  if (!(res = get_first_arg_type(fun_type->car, flags)) && +  !(flags & CALL_ARG_LVALUE)) {    break;    }    if (!(tmp = get_first_arg_type(fun_type->cdr, flags))) { -  +  if (flags & CALL_ARG_LVALUE) { +  break; +  }    free_type(res);    res = NULL;    break;    }    /* NOTE: OR and not AND in some cases!    *    * !function(!string:mixed)&function(string|int:string)    * ==>    * string | string|int    *    * This is however not true in the case where neither is inverted:    *    * function(attribute(sprintf_args, mixed)...:string) &    * function(object|string:string)    * ==>    * attribute(sprintf_args, mixed) & object|string    */ -  if (!(flags & CALL_NOT_LAST_ARG) || -  ((fun_type->car->type == T_NOT) == (fun_type->cdr->type == T_NOT))) { +  if (!(flags & CALL_ARG_LVALUE) && +  (!(flags & CALL_NOT_LAST_ARG) || +  ((fun_type->car->type == T_NOT) == (fun_type->cdr->type == T_NOT)))) {    res = and_pike_types(tmp2 = res, tmp);    } else {    res = or_pike_types(tmp2 = res, tmp, 1);    }    free_type(tmp);    free_type(tmp2);    break;    case T_NOT:    if (!(res = get_first_arg_type(fun_type->car, flags))) {    break;