mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-04 14:48:47 +00:00
Fix #561 where statements that eval to false do not show incorrect usage location
This commit is contained in:
+1
-1
@@ -1237,7 +1237,7 @@ void check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *decl, Type *ty
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool where_clause_ok = evaluate_where_clauses(ctx, nullptr, decl->scope, &decl->proc_lit->ProcLit.where_clauses, true);
|
bool where_clause_ok = evaluate_where_clauses(ctx, nullptr, decl->scope, &decl->proc_lit->ProcLit.where_clauses, !decl->where_clauses_evaluated);
|
||||||
if (!where_clause_ok) {
|
if (!where_clause_ok) {
|
||||||
// NOTE(bill, 2019-08-31): Don't check the body as the where clauses failed
|
// NOTE(bill, 2019-08-31): Don't check the body as the where clauses failed
|
||||||
return;
|
return;
|
||||||
|
|||||||
+31
-1
@@ -6766,7 +6766,7 @@ CallArgumentData check_call_arguments(CheckerContext *c, Operand *operand, Type
|
|||||||
ctx.curr_proc_sig = e->type;
|
ctx.curr_proc_sig = e->type;
|
||||||
|
|
||||||
GB_ASSERT(decl->proc_lit->kind == Ast_ProcLit);
|
GB_ASSERT(decl->proc_lit->kind == Ast_ProcLit);
|
||||||
if (!evaluate_where_clauses(&ctx, operand->expr, decl->scope, &decl->proc_lit->ProcLit.where_clauses, false)) {
|
if (!evaluate_where_clauses(&ctx, call, decl->scope, &decl->proc_lit->ProcLit.where_clauses, false)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6921,6 +6921,21 @@ CallArgumentData check_call_arguments(CheckerContext *c, Operand *operand, Type
|
|||||||
Entity *entity_to_use = data.gen_entity != nullptr ? data.gen_entity : e;
|
Entity *entity_to_use = data.gen_entity != nullptr ? data.gen_entity : e;
|
||||||
add_entity_use(c, ident, entity_to_use);
|
add_entity_use(c, ident, entity_to_use);
|
||||||
|
|
||||||
|
if (data.gen_entity != nullptr) {
|
||||||
|
Entity *e = data.gen_entity;
|
||||||
|
DeclInfo *decl = data.gen_entity->decl_info;
|
||||||
|
CheckerContext ctx = *c;
|
||||||
|
ctx.scope = decl->scope;
|
||||||
|
ctx.decl = decl;
|
||||||
|
ctx.proc_name = e->token.string;
|
||||||
|
ctx.curr_proc_decl = decl;
|
||||||
|
ctx.curr_proc_sig = e->type;
|
||||||
|
|
||||||
|
GB_ASSERT(decl->proc_lit->kind == Ast_ProcLit);
|
||||||
|
evaluate_where_clauses(&ctx, call, decl->scope, &decl->proc_lit->ProcLit.where_clauses, true);
|
||||||
|
decl->where_clauses_evaluated = true;
|
||||||
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -6937,6 +6952,21 @@ CallArgumentData check_call_arguments(CheckerContext *c, Operand *operand, Type
|
|||||||
Entity *entity_to_use = data.gen_entity != nullptr ? data.gen_entity : e;
|
Entity *entity_to_use = data.gen_entity != nullptr ? data.gen_entity : e;
|
||||||
add_entity_use(c, ident, entity_to_use);
|
add_entity_use(c, ident, entity_to_use);
|
||||||
|
|
||||||
|
if (data.gen_entity != nullptr) {
|
||||||
|
Entity *e = data.gen_entity;
|
||||||
|
DeclInfo *decl = data.gen_entity->decl_info;
|
||||||
|
CheckerContext ctx = *c;
|
||||||
|
ctx.scope = decl->scope;
|
||||||
|
ctx.decl = decl;
|
||||||
|
ctx.proc_name = e->token.string;
|
||||||
|
ctx.curr_proc_decl = decl;
|
||||||
|
ctx.curr_proc_sig = e->type;
|
||||||
|
|
||||||
|
GB_ASSERT(decl->proc_lit->kind == Ast_ProcLit);
|
||||||
|
evaluate_where_clauses(&ctx, call, decl->scope, &decl->proc_lit->ProcLit.where_clauses, true);
|
||||||
|
decl->where_clauses_evaluated = true;
|
||||||
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -137,6 +137,7 @@ struct DeclInfo {
|
|||||||
Ast * proc_lit; // Ast_ProcLit
|
Ast * proc_lit; // Ast_ProcLit
|
||||||
Type * gen_proc_type; // Precalculated
|
Type * gen_proc_type; // Precalculated
|
||||||
bool is_using;
|
bool is_using;
|
||||||
|
bool where_clauses_evaluated;
|
||||||
|
|
||||||
PtrSet<Entity *> deps;
|
PtrSet<Entity *> deps;
|
||||||
PtrSet<Type *> type_info_deps;
|
PtrSet<Type *> type_info_deps;
|
||||||
|
|||||||
Reference in New Issue
Block a user