} while((e = e->next));
if(emit_exp(emit, exp, 0) < 0) {
free_vector(v);
- return GW_ERROR;
+ ERR_B(exp->pos, "\t... in 'gack' expression.")
}
const Instr instr = emit_add_instr(emit, Gack);
*(Vector*)instr->ptr = v;
ANN static m_bool emit_member_func(const Emitter emit, const Exp_Dot* member, const Func func) { GWDEBUG_EXE
if(GET_FLAG(func, member)) {
- CHECK_BB(emit_exp(emit, member->base, 0))
+ if(emit_exp(emit, member->base, 0) < 0)
+ ERR_B(member->self->pos, "... in member function") // LCOV_EXCL_LINE
emit_add_instr(emit, RegDup);
const Instr func_i = emit_add_instr(emit, DotFunc);
func_i->m_val = func->vt_index;
const uint emit_addr = member->self->emit_var;
if(isa(member->self->type, t_fptr) > 0) { // function pointer
if(GET_FLAG(value, member)) { // member
- CHECK_BB(emit_exp(emit, member->base, 0))
+ if(emit_exp(emit, member->base, 0) < 0)
+ ERR_B(member->self->pos, "... in member function") // LCOV_EXCL_LINE
if(!GET_FLAG(value->type->d.func, global))
emit_add_instr(emit, RegDup);
emit_member(emit, value, emit_addr);
CHECK_OO(opi.lhs)
CHECK_OO(opi.rhs)
const Type op_ret = op_check(env, &opi);
- CHECK_OO(op_ret)
+ if(!op_ret)
+ ERR_O(bin->self->pos, "in binary expression")
OPTIMIZE_CONST(bin)
return op_ret;
}
if(f->arg_list)
ret = check_func_args(env, f->arg_list);
const Value variadic = GET_FLAG(f, variadic) ? set_variadic(env) : NULL;
- if(!GET_FLAG(f, builtin))
- CHECK_BB(check_stmt_code(env, &f->d.code->d.stmt_code))
+ if(!GET_FLAG(f, builtin) && check_stmt_code(env, &f->d.code->d.stmt_code) < 0)
+ ret = err_msg(f->td->xid->pos, "...in function '%s'", s_name(f->name));
if(variadic)
REM_REF(variadic)
if(GET_FLAG(f, builtin))
ANN static m_bool scan2_func_def_code(const Env env, const Func_Def f) { GWDEBUG_EXE
const Func former = env->func;
env->func = f->func;
- CHECK_BB(scan2_stmt_code(env, &f->d.code->d.stmt_code))
+ const m_bool ret = scan2_stmt_code(env, &f->d.code->d.stmt_code);
+ if(ret < 0)
+ err_msg(f->td->xid->pos, "... in function '%s'", s_name(f->name));
env->func = former;
- return GW_OK;
+ return ret;
}
ANN static void scan2_func_def_flag(const Func_Def f) { GWDEBUG_EXE
env_pop(env, scope);
} else
f->func = base;
- if(f->arg_list)
- CHECK_BB(scan2_arg_def(env, f))
+ if(f->arg_list && scan2_arg_def(env, f) < 0)
+ ERR_B(f->td->xid->pos, "\t... in function '%s'\n", s_name(f->name))
if(!GET_FLAG(f, builtin) && f->d.code->d.stmt_code.stmt_list)
CHECK_BB(scan2_func_def_code(env, f))
if(!base) {